排查 OpenVPN 为什么会路由所有流量

现象

前一阵需要连接一个新的云机房,运维给了一个 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 功能。


排查 OpenVPN 为什么会路由所有流量
https://asynctask.cn/openvpn/
作者
三丰
发布于
2024年9月27日
许可协议