我们的场景:我们在 GKE pod 上安装了一个 OpenVPN 服务器,其中有想要连接到我们 VPN 的 VPN 客户端。我们需要向客户端公开 GKE 集群中另一个 pod 上的服务(具体来说是 MQTT 适配器)。地址 10.86.12.209 是我们 GCP VPC 上的私有 IP,指向 MQTT 适配器 pod(请查看下图)。
我们的服务器配置文件片段如下:
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 10.86.12.0 255.255.255.0"
push "route 240.5.0.0 255.255.0.0"
push "route 240.6.0.0 255.255.0.0"
topology subnet
sndbuf 0
rcvbuf 0
push "sndbuf 0"
push "rcvbuf 0"
Windows 客户端连接到我们的 OpenVPN 服务器的路由打印如下:
Network address Mask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.178.1 192.168.178.29 35
10.8.0.0 255.255.255.0 On-link 10.8.0.8 281
10.8.0.8 255.255.255.255 On-link 10.8.0.8 281
10.8.0.255 255.255.255.255 On-link 10.8.0.8 281
10.86.12.0 255.255.255.0 10.8.0.1 10.8.0.8 281
127.0.0.0 255.0.0.0 On-link 127.0.0.1 331
127.0.0.1 255.255.255.255 On-link 127.0.0.1 331
127.255.255.255 255.255.255.255 On-link 127.0.0.1 331
172.25.192.0 255.255.240.0 On-link 172.25.192.1 271
172.25.192.1 255.255.255.255 On-link 172.25.192.1 271
172.25.207.255 255.255.255.255 On-link 172.25.192.1 271
192.168.178.0 255.255.255.0 On-link 192.168.178.29 291
192.168.178.29 255.255.255.255 On-link 192.168.178.29 291
192.168.178.255 255.255.255.255 On-link 192.168.178.29 291
224.0.0.0 240.0.0.0 On-link 127.0.0.1 331
224.0.0.0 240.0.0.0 On-link 10.8.0.8 281
224.0.0.0 240.0.0.0 On-link 192.168.178.29 291
224.0.0.0 240.0.0.0 On-link 172.25.192.1 271
240.5.0.0 255.255.0.0 10.8.0.1 10.8.0.8 281
240.6.0.0 255.255.0.0 10.8.0.1 10.8.0.8 281
255.255.255.255 255.255.255.255 On-link 127.0.0.1 331
255.255.255.255 255.255.255.255 On-link 10.8.0.8 281
255.255.255.255 255.255.255.255 On-link 192.168.178.29 291
255.255.255.255 255.255.255.255 On-link 172.25.192.1 271
我们的问题:客户端成功连接到 VPN,但无法访问 MQTT pod。我们怀疑 K8S 端缺少一些配置,无法让 OpenVPN pod 到达 MQTT 适配器 POD
答案1
为了修复该情况,我们修改了 OpenVpn pod 中的 iptables:
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
启用 IP 伪装