连接到我的 OpenVPN 服务器后,我看到我的路由表如下:
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default 10.199.1.5 128.0.0.0 UG 0 0 0 tun0
default 192.168.1.1 0.0.0.0 UG 0 0 0 enp0s3
10.199.1.1 10.199.1.5 255.255.255.255 UGH 0 0 0 tun0
10.199.1.5 * 255.255.255.255 UH 0 0 0 tun0
104.156.228.133 192.168.1.1 255.255.255.255 UGH 0 0 0 enp0s3
128.0.0.0 10.199.1.5 128.0.0.0 UG 0 0 0 tun0
192.168.1.0 * 255.255.255.0 U 0 0 0 enp0s3
我对这两个默认条目以及如何解释它感到困惑。
对于普通 IP,Genmask 会与目标进行按位与运算来确定哪个条目匹配。但是 Genmask 如何处理“默认”?
在上面的例子中,哪些数据包会被发送到 10.199.1.5,哪些数据包会被发送到 192.168.1.1?
我正在尝试对要发送到端口 22 (SSH) 的数据包进行 fwmark,然后强制将这些数据包的默认路由到我的默认路由器而不是我的 VPN。但在弄乱路由表之前,我还想完全了解路由表。
答案1
default 只是 0.0.0.0 的别名。您可以看到,如果您输入
$ 路线-n
如果我在您的表中编辑它并稍微调整条目的位置,它看起来就像这样:
内核 IP 路由表 目标网关 Genmask 标志 MSS 窗口 irtt Iface 0.0.0.0 10.199.1.5 128.0.0.0 UG 0 0 0 tun0 128.0.0.0 10.199.1.5 128.0.0.0 UG 0 0 0 tun0 0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 enp0s3 10.199.1.1 10.199.1.5 255.255.255.255 UGH 0 0 0 tun0 10.199.1.5 * 255.255.255.255 UH 0 0 0 tun0 104.156.228.133 192.168.1.1 255.255.255.255 UGH 0 0 0 enp0s3 192.168.1.0 * 255.255.255.0 U 0 0 0 enp0s3
啊哈!所以现在您有 0.0.0.0 和 128.0.0.0 的网络掩码,以及 128.0.0.0 和 128.0.0.0 的网络掩码。这两个一起映射整个互联网。但由于网络掩码 128.0.0.0 比 0.0.0.0 更具体,因此它们优先于“标准”默认路由。
因此,除 104.156.228.133(VPN 端点)和 192.168.1.0/24(您的本地网络)外,所有流量都转发到 tun0(完整隧道)。
这是 OpenVPN 用来覆盖默认网关而不实际改变它的一个巧妙技巧。
答案2
只有使用该tun0
接口的数据包才会使用 的默认网关192.168.1.1
。可以通过更改不同路由的“权重”来修改此行为。请参阅https://unix.stackexchange.com/questions/23820/what-is-the-routing-behaviour-when-two-or-more-default-routes了解更多信息。