现象
前一阵需要连接一个新的云机房,运维给了一个 OpenVPN 连接后发现会路由所有流量,虽然会导致诸多不便,但勉强能凑合用,就先让运维排查了。
客户端
客户端关键日志如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| /sbin/ifconfig utun6 down /sbin/ifconfig utun6 10.254.253.26 10.254.253.25 netmask 255.255.255.252 mtu 1500 up /sbin/route add -net 10.254.253.24 -netmask 255.255.255.252 10.254.253.26 add net 10.254.253.24: gateway 10.254.253.26 /sbin/route add -net 192.168.1.1 -netmask 255.255.255.255 10.254.253.25 add net 192.168.1.1: gateway 10.254.253.25 /sbin/route add -net 18.18.1.0 -netmask 255.255.255.0 10.254.253.25 add net 18.18.1.0: gateway 10.254.253.25 /sbin/route add -net 172.16.0.0 -netmask 255.255.0.0 10.254.253.25 add net 172.16.0.0: gateway 10.254.253.25 /sbin/route add -net 10.254.253.0 -netmask 255.255.255.0 10.254.253.25 add net 10.254.253.0: gateway 10.254.253.25 /sbin/route add -net 106.75.21.57 -netmask 255.255.255.255 192.160.210.1 add net 106.75.21.57: gateway 192.160.210.1 /sbin/route add -net 0.0.0.0 -netmask 128.0.0.0 10.254.253.25 add net 0.0.0.0: gateway 10.254.253.25 /sbin/route add -net 128.0.0.0 -netmask 128.0.0.0 10.254.253.25 add net 128.0.0.0: gateway 10.254.253.25 MacDNSAction: FLAGS=F RD=1 SO=5000 DNS= DOM= ADS= open utun6 SUCCEEDED ⏎[Sep 26, 2024, 15:33:27] Connected via utun6 ⏎[Sep 26, 2024, 15:33:27] LZO-ASYM init swap=0 asym=1
|
可以发现这一行路由确实有问题 /sbin/route add -net 0.0.0.0 -netmask 128.0.0.0 10.254.253.25
服务端
服务端关键配置如下
1 2 3 4
| push "redirect-gateway def1 bypass-dhcp" push "route 192.168.1.1 255.255.255.255" push "route 18.18.1.0 255.255.255.0" push "route 172.16.0.0 255.255.0.0"
|
push 的 route 只有 3 行,并没有 0.0.0.0 但为什么客户端会有这个配置呢?
结论
后来运维老师给我发消息说,他问了 ChatGPT, 是第一行的 redirect-gateway 导致的。
ChatGPT 的解释
OpenVPN 的配置文件中,第一行的 push “redirect-gateway def1 bypass-dhcp” 具有以下含义:
redirect-gateway: 这个选项会将客户端的默认网关重定向到 OpenVPN 服务器。这意味着所有客户端的流量(包括互联网流量)都会通过 VPN 隧道传输,而不是通过客户端的本地网络。
def1: 这是 redirect-gateway 选项的一个参数,它会创建两个特定路由(0.0.0.0/1 和 128.0.0.0/1),而不是一个默认的 0.0.0.0/0 路由。这种方式能够更好地兼容某些客户端的网络配置。
bypass-dhcp: 这个参数确保 DHCP 请求通过本地网络而不是通过 VPN 隧道发送。这在某些情况下是必要的,例如,当客户端需要从本地网络的 DHCP 服务器获取 IP 地址时。
因此,这一行的作用是:
将所有客户端的互联网流量通过 OpenVPN 隧道传输。
使用 def1 参数来创建特定路由,增加兼容性。
确保 DHCP 请求不通过 VPN 隧道传输,以便客户端能够从本地网络获取 DHCP 配置。
这一行配置通常用于希望客户端通过 VPN 隧道访问互联网的场景,同时保留本地网络的 DHCP 功能。