![OpenVPN 客户端无法在 GCE 实例上运行](https://linux22.com/image/703766/OpenVPN%20%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%97%A0%E6%B3%95%E5%9C%A8%20GCE%20%E5%AE%9E%E4%BE%8B%E4%B8%8A%E8%BF%90%E8%A1%8C.png)
我已经在 GCE 实例中设置了 OpenVPN 客户端配置,它能够正确建立连接并最终创建隧道接口。但我无法通过该隧道 ping 任何内容(使用 ping -I tun0 8.8.8.8 或 curl www.google.com --interface tun0 不会得到响应)。我尝试了不同的子网 IP 范围(10.8.xx 或 192.168.xx)、不同的协议(TCP 或 UDP)、不同的身份验证方法(TLS 或静态密钥),但仍然没有任何运气。
如果我在实例上配置 OpenVPN 服务器配置,那么它就可以正常工作,服务器(GCE 实例)和客户端可以互相 ping 通。GCE 上的 OpenVPN 客户端不受支持吗?还是我遗漏了什么配置?
似乎操作系统和配置无关。我尝试了多个不同操作系统的实例,或更改了配置(这些配置在其他 VPS 上运行正常),但问题仍然存在。
有关 Google 群组 gce-discussion 的更多详细信息: https://groups.google.com/forum/#!topic/gce-discussion/0KoMnaojG6E
更新:我注意到当我通过隧道 ping 某个东西时,RX 和 TX 计数会发生变化(不知道这是否意味着 icmp 包实际上传输正确)但 ping 仍然告诉我 100% 数据包丢失。ping 之前的 ifconfig:
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:192.168.179.21 P-t-P:192.168.179.22 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:10 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:1661 (1.6 KiB) TX bytes:0 (0.0 b)
ping:
[root@mario-vps mario]# ping -I tun0 8.8.8.8
PING 8.8.8.8 (8.8.8.8) from 192.168.179.21 tun0: 56(84) bytes of data.
^C
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 870ms
ping 之后的 ifconfig:
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:192.168.179.21 P-t-P:192.168.179.22 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:11 errors:0 dropped:0 overruns:0 frame:0
TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:1745 (1.7 KiB) TX bytes:84 (84.0 b)
如果我在配置文件中写入“ping”和“ping-restart”参数,连接就不会断开。不知道这是否意味着即使 openvpn 守护进程也认为连接良好,但通过该隧道,ping 和 curl 之类的东西对我来说从来都不起作用。
答案1
我曾经在 GCE 实例上运行过 OpenVPN。它没有任何问题。请发布隧道接口在 GCE 实例上创建的日志(片段)。根据这些日志,我们可以轻松识别问题所在。通常日志将附加在 syslog 中(如果您的 GCE 实例是 Ubuntu)。您是否计划通过隧道接口路由您的 GCE 实例 Internet?
答案2
我在 GCE 实例上遇到了类似的问题。在运行时,这为我解决了这个问题:
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 2 > "$i" done
测试其是否有效:
[root@instance]# ping -I tun0 8.8.8.8 PING 8.8.8.8 (8.8.8.8) from 10.2.50.57 tun0: 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=122 time=94.3 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=122 time=94.6 ms
为了使其持久,您需要:
- 更新任何现有的 rp_fiter 覆盖:
grep rp_filter /etc/sysctl.d/*
- 编辑 /etc/sysctl.conf 文件并在那里添加覆盖
net.ipv4.conf.all.rp_filter=2 net.ipv4.conf.default.rp_filter=2
此处解释值 2https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt:
2 – 松散模式,如 RFC3704 松散反向路径中定义。每个传入数据包的源地址也会根据 FIB 进行测试,如果无法通过任何接口访问源地址,则数据包检查将失败。