我们目前正在尝试通过wireguard 隧道将来自guest vlan (eth1.251) 子网的所有数据包路由到互联网。为了实现这一点,我们使用基于策略的路由,并在流量来自我们的访客子网时使用路由表 10 的规则:
32765: from 10.251.0.0/16 lookup 10
在路由表 10 中,我们创建了一条通向隧道接口的默认路由:
default dev wg1 scope link
我们访客网络中的所有客户端都能够通过预期的wireguard隧道访问互联网,但是客户端无法到达访客网络的网关(10.251.0.1)
。TCPDump 显示 ICMP 回显回复通过wg1
接口路由回我们的隧道端点,这显然不是故意的。一个快速的解决方案是将eth1.251
访客 vlan 接口的范围链接路由添加到路由table 10
:
default dev wg1 scope link
10.251.0.0/16 dev eth1.251 proto kernel scope link
现在客户端可以访问路由器接口并为其服务。
在这个路由器上有另一个接口 eth1 与子网192.168.0.1/16
。当我们现在删除新添加的10.251.0.0/16
路由时,table 10
我们无法再访问路由器接口10.251.0.1
,但是我们仍然能够192.168.0.1
从子网上的客户端访问接口10.251.0.0/16
。192.168.0.2
子网中路由器后面的客户端(例如)192.168.0.0/16
无法从10.251.0.0/16
.
主要问题:为什么我们可以在192.168.0.1
没有显式路由表条目的情况下访问路由器上的接口 ip,但不能10.251.0.1
访问来宾10.251.0.0/16
子网中客户端的接口 ip?
这是网络结构的概述。我认为这有助于理解我们的设置。
没有一般的解释,只是遵循路由设置中发生的事情。
10.251.0.1 既是本地路由器地址,也是 10.251.0.0/16 的一部分。
当接收到本地地址的数据包时,路由器使用第一个具有最低优先级的本地表匹配本地
ip rule
表:0,在表 10 的规则之前,并匹配。请记住,路由表匹配目标,而自定义规则通常配置为匹配源。当路由器回复时,这一次本地表不匹配: 10.251.0.2 is not a local destination。检查下一条规则并匹配
from 10.251.0.0/16
,查找表 10,数据包通过wg1。对于 192.168.0.1,接收数据包与之前使用本地表完全一样。现在答案与附加规则不匹配,并且主路由表适用:它照常工作:Linux 系统将从其任何 IP 应答。
同样,对于 192.168.0.2:它不是本地IP,因此与本地表不匹配,但查询与添加的规则匹配:数据包通过wg1丢失。
因此,将主路由表的一部分复制到额外的表以避免副作用会有所帮助。
ip route get
只要不涉及任何标记,就可以使用正确的语法来测试其中的许多内容:没有表 10 中的附加条目:
回复路线:
添加表 10 中的条目时: