关于设置 OpenVPN 服务器并防止拆分隧道的备忘录(Ubuntu 22.04 LTS)

您好,
Butt Memory Leak
System Solutions 部门的 Kawa。
最近天气凉爽,感觉只过了两个季节,而不是四季。你过得怎么样?
我写这篇文章是为了分享我在Ubuntu机器上安装OpenVPN的经历,期间我遇到了网络连接问题
什么是OpenVPN?
*如果您已经知道,请跳过此步骤。
OpenVPN是由OpenVPN Technologies Inc.提供的开源VPN软件。
将其安装在Linux机器上,即可作为VPN服务器运行,从而允许客户端建立VPN连接。
▼OpenVPN日本官网
:https://www.openvpn.jp/introduction/
安装
■环境
# 服务器:Ubuntu 24.04 LTS OpenVPN 2.5.9 # 客户端:Windows 11 专业版
这次,我们将参考以下页面。它非常方便,因为您可以轻松地按照提示操作。https
://github.com/angristan/openvpn-install
首先,按照说明使用 curl 命令下载 shell 脚本文件。
您可以将其保存到任何您喜欢的位置。修改文件权限,使其可以执行。
$ sudo curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh % 总计 % 已接收 % 已传输 平均速度 时间 时间 时间 当前 下载 上传 总计 已用 剩余 速度 100 40923 100 40923 0 0 282k 0 --:--:-- --:--:-- --:--:-- 281k $ sudo chmod +x openvpn-install.sh
运行脚本时会出现提示,请按步骤操作。
除非有特殊要求,否则默认设置即可。
$ sudo ./openvpn-install.sh 欢迎使用 OpenVPN 安装程序!git 仓库地址为:https://github.com/angristan/openvpn-install 在开始安装之前,我需要问您几个问题。如果您接受默认选项,可以保留默认选项并直接按回车键。.
这里有几个地方需要输入信息,如果您不确定要输入什么,请参考下面代码块中被注释掉的部分。
# 从外部客户端连接时,请输入 WAN 侧(面向互联网)的 IP 地址。我需要知道您希望 OpenVPN 监听的网络接口的 IPv4 地址。除非您的服务器位于 NAT 之后,否则它应该是您的公网 IPv4 地址。IP 地址:192.0.2.1 # 除非您使用 IPv6,否则请输入 n(默认值)。正在检查 IPv6 连接……您的主机似乎没有 IPv6 连接。是否要启用 IPv6 支持(NAT)?[y/n]:n # 默认情况下使用 UDP/1194 作为监听端口,因此如果这没有问题,请选择 1。您希望 OpenVPN 监听哪个端口?1) 默认:1194 2) 自定义 3) 随机 [49152-65535] 端口选择 [1-3]:1 # 系统会询问您是使用 UDP 还是 TCP。如果这没有问题,请保留默认值并选择 1(UDP)。您希望 OpenVPN 使用什么协议? UDP 速度更快。除非 UDP 不可用,否则不应使用 TCP。1) UDP 2) TCP 协议 [1-2]: 1 # 选择一个 DNS 解析器。在我的环境中,默认值为 11。如果不需要更改,请保持默认设置。您希望 VPN 使用哪些 DNS 解析器? 1) 当前系统解析器(来自 /etc/resolv.conf) 2) 自托管 DNS 解析器 (Unbound) 3) Cloudflare(任播:全球) 4) Quad9(任播:全球) 5) Quad9 无审查版(任播:全球) 6) FDN(法国) 7) DNS.WATCH(德国) 8) OpenDNS(任播:全球) 9) Google(任播:全球) 10) Yandex Basic(俄罗斯) 11) AdGuard DNS(任播:全球) 12) NextDNS(任播:全球) 13) 自定义 DNS [1-12]: 11 # 在通信数据压缩的环境中,似乎存在一种名为 VORACLE 攻击的漏洞。由于建议将此选项设置为 NO,因此我们将保留其默认值。 # 参考:https://openvpn.net/security-advisory/the-voracle-attack-vulnerability/ 是否启用压缩?由于 VORACLE 攻击会利用压缩,因此不建议启用。启用压缩?[y/n]: n # 加密设置默认为 ECDSA 和 prime256v1,强度足够,无需更改。是否要自定义加密设置?除非您非常清楚自己在做什么,否则建议您使用脚本提供的默认参数。请注意,无论您选择什么,脚本中提供的所有选项都是安全的。(与 OpenVPN 的默认设置不同)请参阅 https://github.com/angristan/openvpn-install#security-and-encryption 了解更多信息。自定义加密设置?[y/n]: n # 完成。按下 Enter 键或类似键将开始安装和配置,您可以喝杯茶稍等片刻。好了,我需要的信息就这些。现在我们可以开始设置您的 OpenVPN 服务器了。安装完成后,您将能够生成一个客户端。按任意键继续…….
安装完成后,继续生成 ovpn 文件(配置文件)并分发给客户端。
# 指定连接的用户名(如果将来需要创建多个用户,请注意不要重复使用用户名)。请为客户端指定一个名称。名称必须包含字母和数字字符,也可以包含下划线或短横线。客户端名称:test # 系统会询问您是否为客户端配置文件设置密码。请使用默认值(稍后会解释选择 2 的方法)。您是否要使用密码保护配置文件?(例如,使用密码加密私钥)1) 添加无密码客户端 2) 为客户端设置密码 请选择一个选项 [1-2]:1 配置文件已写入 /home/hamchan/test.ovpn。请下载 .ovpn 文件并将其导入到您的 OpenVPN 客户端中。.
在 /home/hamchan/test.ovpn 中生成了一个配置文件。
如果您在设置密码时选择 2,则流程如下。
如果您选择此选项并设置密码,客户端每次连接时都需要输入密码。
因此,即使您的个人资料泄露,第三方也无法连接,除非他们知道密码。
您是否要使用密码保护配置文件?(例如,使用密码加密私钥) 1) 添加无密码客户端 2) 为客户端使用密码 选择一个选项 [1-2]: 2 # 设置密码短语。系统会要求您确认两次。⚠️ 系统会在下方提示您输入客户端密码 ⚠️ * 使用 SSL:openssl OpenSSL 3.0.13 2024 年 1 月 30 日(库:OpenSSL 3.0.13 2024 年 1 月 30 日) * 使用 Easy-RSA 配置:/etc/openvpn/easy-rsa/vars * 'vars' 文件首选位于 PKI 文件夹内。要隐藏此消息,请将 'vars' 文件移动到 PKI 文件夹,或使用选项 --vars= 声明 'vars' 文件。<FILE>输入 PEM 密码短语: 正在验证 - 输入 PEM 密码短语: ----- 通知 ------ 密钥对和证书请求已完成。您的文件如下:请求:/etc/openvpn/easy-rsa/pki/reqs/test2.req 密钥:/etc/openvpn/easy-rsa/pki/private/test2.key 使用来自 /etc/openvpn/easy-rsa/pki/3e6d0991/temp.484dbf11 的配置 检查请求是否与签名匹配 签名正确 主题的专有名称如下: commonName :ASN.1 12:'test2' 证书有效期至 2034 年 9 月 25 日 03:20:30 GMT(3650 天) 写入数据库,新增 1 条记录 数据库已更新 注意 ------ 证书创建于:* /etc/openvpn/easy-rsa/pki/issued/test2-chan.crt 注意 ------ 内联文件已创建:* /etc/openvpn/easy-rsa/pki/inline/test2.inline 客户端 test2已添加。配置文件已写入 /home/hamchan/test2.ovpn。请下载 .ovpn 文件并将其导入到您的 OpenVPN 客户端中。.
来自客户端的连接
请从以下链接下载并安装客户端软件。作者使用的环境是 Windows 11。https
://www.openvpn.jp/
另外,请复制您之前创建的 ovpn 客户端配置文件(test.ovpn)。
右键单击任务栏中的 OpenVPN 图标(图标类似电脑显示器),然后选择“导入”>“ovpn 文件”。

导入完成后,使用配置文件名称连接。如果状态显示为绿色(已连接),则表示连接成功。

网页无法打开
到目前为止一切都很顺利,但后来我遇到了连接互联网的问题。
问题如下:
- 网页无法打开
- 名称解析 (nslookup) 失败
- 源 IP 地址是 OpenVPN 服务器的 WAN 端 IP 地址
情况就是这样。或许默认设置是拆分隧道?
没有路由,也无法访问互联网,这非常不方便。这可不行。
避免隧道分裂
我别无选择,只能打破隧道分割的局面。
于是我研究了一下,发现只需在客户端配置文件中添加几行代码就足够了。
以下是未做任何更改的默认配置文件。
client proto udp explicit-exit-notify remote 192.0.2.1 1194 dev tun resolv-retry infinite nobind persist-key persist-tun remote-cert-tls server verify-x509-name server_RsYFZmapV3EjCl7k name auth SHA256 auth-nocache cipher AES-128-GCM tls-client tls-version-min 1.2 tls-cipher TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256 ignore-unknown-option block-outside-dns setenv opt block-outside-dns # 防止 Windows 10 DNS 泄漏 verb 3
请在此配置文件中添加以下两点。
*安装 OpenVPN 时,默认配置 10.8.0.0/24 网段,因此如果与现有环境存在重叠,则需要重写 /etc/openvpn/server.conf 文件。
# 将路由信息路由到 OpenVPN 服务器 route 10.8.0.0 255.255.255.0 # 忽略重定向网关(不要将发往 Internet 的流量路由到 VPN 目标) pull-filter ignore "redirect-gateway"
顺便说一下,我这里用的是方法一:
https://community.openvpn.net/openvpn/wiki/IgnoreRedirectGateway
我以为
我赢了我仍然无法解析名称,网页无法打开的问题仍然存在。
经过多次尝试,我发现以下两个默认设置导致了问题。
将它们注释掉后,问题就解决了。
;ignore-unknown-option block-outside-dns ;setenv opt block-outside-dns # 防止 Windows 10 DNS 泄漏
这似乎是 Windows 10 时代的遗留问题,
https://openvpn.net/community-resources/reference-manual-for-openvpn-2-4/
----
--block-outside-dns
阻止其他网络适配器上的 DNS 服务器,以防止 DNS 泄漏。此选项会阻止除隧道内部应用程序之外的任何应用程序访问 TCP 或 UDP 端口 53。它使用 Windows 筛选平台 (WFP),并且适用于 Windows Vista 或更高版本。此选项在非 Windows 平台上被视为未知选项,并且在 Windows XP 上不受支持,会导致致命错误。您可以使用 --setenv opt 或 --ignore-unknown-option(不适用于 Windows XP)来忽略该错误。请注意,从服务器推送未知选项不会触发致命错误
。----
这似乎是一个用于抑制早期 Windows 操作系统中出现的 DNS 泄漏漏洞的设置。因此,它似乎会阻止通过隧道进行的 DNS 通信(TCP/UDP53)。
然而,由于此选项仅对 Windows 操作系统有效,因此在其他操作系统上似乎无需担心。
最终,个人资料看起来是这样的:
client proto udp explicit-exit-notify remote 192.0.2.1 1194 dev tun resolv-retry infinite nobind persist-key persist-tun remote-cert-tls server verify-x509-name server_RsYFZmapV3EjCl7k name auth SHA256 auth-nocache cipher AES-128-GCM tls-client tls-version-min 1.2 tls-cipher TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256 ;ignore-unknown-option block-outside-dns ;setenv opt block-outside-dns # Prevent Windows 10 DNS leak route 10.8.0.0 255.255.255.0 pull-filter ignore "redirect-gateway" verb 3
太棒了,太棒了
奖金
此外,MTU 大小和其他因素似乎也会根据应用程序和环境产生影响。
在这种情况下,请参阅以下手册:
https
此外,服务器端的 /etc/openvpn/server.conf 文件默认情况下不包含日志选项,因此您可以通过添加以下设置来使其生效:
# 将日志级别提高一级 verb 4 # 将连接日志写入文件 log /var/log/openvpn/debug.log
5