在我的 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
:充当简单的覆盖) ),如果匹配则选择另一个路由表:heretable 205
。可以使用以下命令检查附加路由表
ip route show table 205
该路由表将被评估,如果找到路由,则不会进行进一步的处理:不会评估主表,并且会做出与主表内容不匹配的决定。它很可能会显示类似于以下内容的内容:
default dev tun0 proto static
但由于它是关于隧道
tun0
和路由的,因此隧道内容必须仍然允许隧道信封在其外部进行正常路由,因此应该在某个地方(在规则中或在此路由表中)存在例外,以允许使用以下命令到达对等隧道端点:正常方式(即:使用dev wlp0s20f3
)。根据隧道的不同,这种例外并不总是需要的(例如:在与其隧道信封不同的网络命名空间中使用 WireGuard,但通常会调用该接口
wg0
),并且对于不同的方法可以采取不同的形式。