关于如何构建 OpenVPN 服务器并防止隧道分割的备忘录 (Ubuntu 22.04 LTS)
大家好
Oshiri 内存泄漏
系统解决方案部门的 Kawa。
最近很凉爽。这些天更像是两个季节而不是四个季节,但是你如何度过你的时间呢?
这次,当我在我的 Ubuntu 机器上安装 OpenVPN 时,我因为无法连接互联网而陷入困境,所以
我想分享我的知识作为备忘录。
首先,什么是OpenVPN?
*如果您知道这一点,请跳过阅读
OpenVPN是OpenVPN Technologies Inc.提供的OSS VPN软件。
通过将其安装在Linux机器等上,它将作为VPN服务器运行并允许来自客户端的VPN连接。
▼OpenVPN 日本官方
https://www.openvpn.jp/introduction/
安装
■环境
# 服务器端 Ubuntu 24.04 LTS OpenVPN 2.5.9 # 客户端操作系统 Windows 11 Pro
这次,我们将参考以下几页继续进行。这非常方便,因为您可以轻松地按照提示进行操作。
https://github.com/angristan/openvpn-install
首先,按照步骤使用curl拉取shell脚本文件。
保存位置是可选的。更改权限以启用执行。
$ sudo curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh % 总计 % 已接收 % Xferd 平均速度 时间 时间 时间 当前 Dload 上传 总花费左速度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 在开始安装之前我需要问您几个问题。保留默认选项,如果您同意的话,只需按 Enter 键即可。
有多个地方可以输入信息,因此如果您不确定要输入什么,请参阅下面代码块中注释掉的部分。
# 当从外部客户端连接时,输入WAN侧(面向Internet)IP地址。我需要知道您想要 OpenVPN 侦听的网络接口的 IPv4 地址。除非您的服务器位于 NAT 之后,否则它应该是您的公共 IPv4 地址:192.0.2.1 # n(默认),除非您使用 IPv6 输入检查。 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? 除非不可用,否则不应使用 TCP 1) UDP 2) TCP 协议 [1-2]: 1 # 选择 DNS 解析器。在我的环境中,默认值为 11。如果不需要更改,请保持原样。您希望 VPN 使用哪些 DNS 解析器? 1) 当前系统解析器(来自 /etc/resolv.conf) 2) 自托管 DNS 解析器(未绑定) 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 攻击使用了压缩,因此不建议使用它。 ]: n # 默认加密设置是 ECDSA with prime256v1,强度足够,所以保持原样。您想自定义加密设置吗?除非您知道自己在做什么,否则您应该坚持使用脚本提供的默认参数。请注意,无论您选择什么,脚本中提供的所有选择都是安全的(与 OpenVPN 的默认值不同)。请参阅 https://github.com/angristan/openvpn-install#security-and-encryption 了解更多信息。 [y/n]: n # 您已完成。一旦你按下回车键,安装和配置就会开始,所以你可以喝杯茶等待。好的,这就是我所需要的。我们现在已经准备好设置您的 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 30 Jan 2024(库:OpenSSL 3.0.13 30 Jan 2024) * 使用 Easy-RSA 配置:/etc/openvpn/easy-rsa/ vars * “vars”的首选位置位于 PKI 文件夹内,若要静音此消息,请移动您的设备。 'vars' 文件添加到您的 PKI 或使用选项声明您的 'vars' 文件: --vars=<FILE>输入 PEM 密码: 验证 - 输入 PEM 密码: ----- 注意 ------ 密钥对和证书请求已完成。 .req 密钥:/etc/openvpn/easy-rsa/pki/private/test2.key 使用配置/etc/openvpn/easy-rsa/pki/3e6d0991/temp.484dbf11 检查请求是否与签名匹配 签名 ok 主体的专有名称如下 commonName :ASN.1 12:'test2' 证书将于 9 月 25 日之前进行认证03:20:30 2034 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 图标(它看起来像 PC 显示屏),然后从导入中选择 ovpn 文件。
导入完成后,使用配置文件名称进行连接。如果状态变为绿色(已连接)则表示正常。
无法打开网页
到目前为止一切都很顺利,但我遇到了无法连接到互联网的问题。
问题是
: - 无法打开网页
- 无法进行名称解析(nslookup)
- 源 IP 是 OpenVPN 服务器的 WAN 端 IP
情况就是这样。也许默认情况下是分割隧道?
零root访问又不能上网,是一种非常不方便的情况。没关系。
避免隧道分裂
我们别无选择,只能突破隧道分裂的局面。
所以我查了一下,令人惊讶的是,似乎我所要做的就是在客户资料中添加几行。
以下是未进行任何更改的默认配置文件。
客户端原型 udp 显式退出通知远程 192.0.2.1 1194 dev tun resolv-retry 无限 nobind persist-key persist-tun Remote-cert-tls 服务器 verify-x509-name server_RsYFZmapV3EjCl7k 名称 auth SHA256 auth-nocache 密码 AES-128-GCM tls-客户端tls-version-min 1.2 tls-cipher TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256ignore-unknown-option block-outside-dns setenv opt block-outside-dns # 防止 Windows 10 DNS 泄漏动词 3
将以下两点添加到此配置文件中。
*安装OpenVPN时,默认配置10.8.0.0/24,因此如果与现有环境有重叠,则需要重写/etc/openvpn/server.conf。
# 将信息路由到 OpenVPN 服务器 Route 10.8.0.0 255.255.255.0 # 忽略重定向网关(不将发往 Internet 的流量路由到 VPN 连接目的地) pull-filterignore "redirect-gateway"
顺便说一句,我用的是这个方法1。
https://community.openvpn.net/openvpn/wiki/IgnoreRedirectGateway
有了这个你就能赢!
我也是这么想的,但是虽然通过本地现有环境线路路由了互联网连接,并且只寻址到了10.8.0.0/24到OpenVPN服务器,
但是还是出现了无法解析名称、网页打不开的问题这是
经过多次尝试和错误,我发现以下两个默认设置有效。
通过注释掉它解决了它。
;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操作系统识别的选项,因此其他操作系统似乎不需要担心它。
最后,我得到了这样的个人资料:
客户端原型 udp 显式退出通知远程 192.0.2.1 1194 dev tun resolv-retry 无限 nobind persist-key persist-tun Remote-cert-tls 服务器 verify-x509-name server_RsYFZmapV3EjCl7k 名称 auth SHA256 auth-nocache 密码 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 泄漏路由 10.8.0.0 255.255.255.0 pull-filter 忽略“重定向网关”动词 3
这是一种祝福,这是一种祝福
奖金
此外,根据应用和环境,MTU 大小等可能会产生影响。
这种情况下,请参阅以下手册。
https://openvpn.net/community-resources/reference-manual-for-openvpn-2-4/
另外,由于默认情况下服务器端的 /etc/openvpn/server.conf 中不包含日志选项,因此如果添加以下设置,您会很高兴。
# 将日志级别增加一个动词 4 # 将连接日志写入文件 log /var/log/openvpn/debug.log