解释路由决策

解释路由决策

在我的 Linux 服务器上,我有以下路由表:

$ ip ro
default via 172.28.127.254 dev wlp0s20f3 proto dhcp metric 600 
10.8.3.0/24 dev tun0 proto kernel scope link src 10.8.3.2 
169.254.0.0/16 dev docker0 scope link metric 1000 linkdown 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 
172.28.96.0/19 dev wlp0s20f3 proto kernel scope link src 172.28.107.175 metric 600

基于此,我猜测,如果我尝试访问 IP 8.8.8.8,Linux 将通过172.28.127.254接口后面的默认网关来实现wlp0s20f3。然而,这种情况并非如此:

$ ip ro get 8.8.8.8
8.8.8.8 dev tun0 table 205 src 10.8.3.2 uid 1000 
    cache

请解释一下,为什么不使用默认网关?

答案1

你有基于策略的路由正如table 205路由决策中所暗示的那样。

您至少可以通过检查以下输出来获得更多信息:

  • ip rule

    除了默认的三个规则(首选项为 0、32766 和 32767)之外,该规则还将具有一个或多个规则。附加规则将引用至少一个附加路由表:table 205。通常附加规则依赖于目的地以外的其他东西(因为这已经被简单的路由使用所覆盖,所以很少在规则中使用),但甚至可以依赖于任何东西(只读from all lookup 205:充当简单的覆盖) ),如果匹配则选择另一个路由表:here table 205

  • 可以使用以下命令检查附加路由表

    ip route show table 205
    

    该路由表将被评估,如果找到路由,则不会进行进一步的处理:不会评估主表,并且会做出与主表内容不匹配的决定。它很可能会显示类似于以下内容的内容:

    default dev tun0 proto static
    

    但由于它是关于隧道tun0和路由的,因此隧道内容必须仍然允许隧道信封在其外部进行正常路由,因此应该在某个地方(在规则中或在此路由表中)存在例外,以允许使用以下命令到达对等隧道端点:正常方式(即:使用dev wlp0s20f3)。

    根据隧道的不同,这种例外并不总是需要的(例如:在与其隧道信封不同的网络命名空间中使用 WireGuard,但通常会调用该接口wg0),并且对于不同的方法可以采取不同的形式。

相关内容