Kubernetes Pod 内的 OpenVPN 客户端:并非始终连接

Kubernetes Pod 内的 OpenVPN 客户端:并非始终连接

我已经在这个问题上思考了好几天了,但我开始对这个问题没有什么想法了(我不是网络专家)。

我正在开发一个使用 OpenVPN 连接到随机外部 VPN 提供商的项目。这个项目在私人专用服务器上运行了几个月,没有任何问题。我正在尝试使用 Kubernetes 切换到云。一切正常……但 VPN 连接不行。我使用 NodeJS 程序来启动和管理 VPN 连接。每当连接断开时,程序都会尝试重新启动 openvpn 直到它正常工作(每 30 秒一次)。问题是“重启”功能在专用服务器上运行良好,没有明显的停机时间,但在云版本上,停机时间从 5 秒增加到大约 10 分钟。我看不到任何规律,至少它看起来真的很随机​​。

我已经研究了好几天,终于找到了“根本原因”:每当我尝试重新启动 VPN 连接时,在尝试添加一些路由时,我有时会收到“RTNETLINK 答案:网络无法访问”的消息,目前我尚不清楚原因。以下是我每次连接失败时收到的日志:

[调试]:stdout:2019 年 8 月 30 日星期五 13:08:16 /sbin/ip route add [错误]:OpenVPN 错误:RTNETLINK 答案:文件存在 [调试]:stdout:2019 年 8 月 30 日星期五 13:08:16 错误:Linux 路由添加命令失败:外部程序以错误状态退出:2 /sbin/ip route add 0.0.0.0/1 via 172.21.20.1 [错误]:OpenVPN 错误:RTNETLINK 答案:网络无法访问 [调试]:stdout:2019 年 8 月 30 日星期五 13:08:16 错误:Linux 路由添加命令失败:外部程序以错误状态退出:2 [调试]:stdout:2019 年 8 月 30 日星期五 13:08:16 /sbin/ip route add 128.0.0.0/1 via 172.21.20.1 [错误]:OpenVPN 错误:RTNETLINK 答案:网络不可达初始化序列已完成

我现在连接失败,因为我有一个自动检查功能,可以获取我的外部 IP 并检查它是我的真实 IP 还是 VPN 提供商之一。

据我所知,第一个错误不是问题,因为当它唯一发生时,VPN 连接正常。但“网络不可达”是出现问题的标志。但随后,经过每 30 秒重试几次后,它终于连接上了。

我首先想到的是我没有正确终止 openvpn 进程,因此没有正确释放一些资源,但似乎不是这样,因为只是运行相同的命令:

openvpn --config conf.ovpn --dhcp 选项 DNS 8.8.8.8 --auth-user-pass /path/auth.txt

多次尝试(使用 Ctrl+C 终止),有时成功,有时失败。如果我无法在云中建立稳定的连接,我的项目就会面临风险(我有更多的功能要推出,不能一直使用专用服务器)。

以下是来自服务器的推送:

PUSH:收到的控制消息:'PUSH_REPLY、redirect-gateway def1 skip-dhcp、dhcp-option DNS 198.18.0.1、dhcp-option DNS 198.18.0.2、rcvbuf 493216、sndbuf 493216、explicit-exit-notify 5、comp-lzo no、route-gateway 172.21.22.1、topology subnet、ping 20、ping-restart 40、ifconfig 172.21.23.169 255.255.254.0、peer-id 5、cipher AES-256-GCM'

OpenVPN 配置文件如下:

客户端开发 tun proto udp 远程 XXX.XXX.com 443 resolv-retry 无限 nobind 持久密钥 持久 tun 持久远程 ip ca XXX.crt verify-x509-name XXX.com 名称 auth-user-pass comp-lzo 动词 3 auth SHA256 密码 AES-256-CBC 密钥大小 256 tls-cipher TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-DSS-WITH-AES-256-CBC-SHA:TLS-RSA-WITH-AES-256-CBC-SHA

再次,所有这些都正常工作,但在 Kubernetes 环境中却不行。所以这一定与它或我的提供商有关?

任何能够调试此问题的帮助都将非常感激。

问候,

答案1

我花了一天多的时间试图弄清楚这一点,几乎要疯了。如果您在 AWS 上运行,则有一个 ec2 实例级配置可以验证正确的源目标。

要禁用它,只需转到 ec2 实例,操作->网络->更改源/目标检查,然后选择“是”以禁用。

希望能帮助到你。

相关内容