我的路由表中有两个默认的条目

连接到我的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?

我试图fname数据包打算为端口22(SSH),然后强制这些数据包的默认路由到我的默认路由器,而不是我的VPN。 但是我也想在弄清它之前完全理解路由表。

默认只是0.0.0.0的别名。 你可以看到,如果你input

  $ route -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

啊哈! 所以现在你有一个networking掩码128.0.0.0 0.0.0.0,也有一个128.0.0.0的networking掩码128.0.0.0。 这两个在一起映射整个互联网。 但是,由于networking掩码128.0.0.0比0.0.0.0更具体,它们优先于“标准”默认路由。

除了104.156.228.133(VPN端点)和192.168.1.0/24(您的本地networking)以外,所有stream量都转发到tun0(全通道)。

这是OpenVPN用来重写默认网关而不实际更改的巧妙技巧。

只有使用tun0接口的数据包将使用默认网关192.168.1.1 。 这种行为可以通过改变不同路由的“权重”来修改。 有关更多信息,请参阅https://unix.stackexchange.com/questions/23820/what-is-the-routing-behaviour-when-two-or-more-default-routes