OpenVPN 客户端无法在 GCE 实例上运行

OpenVPN 客户端无法在 GCE 实例上运行

我已经在 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 进行测试,如果无法通过任何接口访问源地址,则数据包检查将失败。

相关内容