我们目前正在尝试将所有数据包从我们的访客 VLAN (eth1.251) 子网通过 wireguard 隧道路由到互联网。为了实现这一点,我们使用基于策略的路由,并制定了一条规则,即当流量来自我们的访客子网时使用路由表 10:
32765: from 10.251.0.0/16 lookup 10
在路由表 10 中,我们正在创建通往隧道接口的默认路由:
default dev wg1 scope link
我们客户网络中的所有客户端都能够通过 wireguard 隧道访问互联网,这是意料之中的,但是客户端无法访问客户网络的网关(10.251.0.1)
。 TCPDump 显示 ICMP 回显回复通过接口wg1
路由回我们的隧道端点,这显然不是预期的。 一个快速的解决方案是将客户 VLAN 接口的作用域链接路由添加eth1.251
到路由中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
来宾子网中客户端的接口 IP 10.251.0.0/16
?
这是网络结构的概述。我认为这有助于理解我们的设置。
答案1
没有一般性的解释,这只是遵循路由设置中发生的情况的问题。
10.251.0.1,既是本地路由器地址,也是10.251.0.0/16的一部分。
当接收到一个数据包时当地的地址,路由器匹配当地的ip rule
表 10 的规则之前,使用优先级最低的第一个表:0,然后匹配。请记住,路由表匹配目的地而通常自定义规则配置为匹配来源。
当路由器回复时,这次本地表不匹配:10.251.0.2 不是本地目的地. 检查下一条规则并匹配from 10.251.0.0/16
,查找表 10,数据包通过工作组1。
对于 192.168.0.1,接收数据包与之前完全相同当地的表。现在答案与附加规则不匹配,并且主路由表适用:它照常工作:Linux 系统将从其任何 IP 进行回答。
再次,对于 192.168.0.2:它不是当地的IP,因此不匹配当地的表,但查询确实匹配添加的规则:数据包通过工作组1。
因此,将主路由表的一部分复制到额外表以避免副作用是有帮助的。
其中许多内容可以通过ip route get
正确的语法进行测试,只要不涉及标记:
不包含表 10 中的附加条目:
# ip route get from 10.251.0.2 iif eth1.251 10.251.0.1
RTNETLINK answers: Invalid cross-device link
# sysctl -w net.ipv4.conf.eth1/251.rp_filter=2 #relax reverse path filtering
# ip route get from 10.251.0.2 iif eth1.251 10.251.0.1
local 10.251.0.1 from 10.251.0.2 dev lo table local
cache <local> iif eth1.251
# ip route get from 10.251.0.2 iif eth1.251 192.168.0.1
local 192.168.0.1 from 10.251.0.2 dev lo table local
cache <local> iif eth1.251
# ip route get from 10.251.0.2 iif eth1.251 192.168.0.2
192.168.0.2 from 10.251.0.2 dev wg1 table 10
cache iif eth1.251
回复路线:
# ip route get from 10.251.0.1 10.251.0.2
10.251.0.2 from 10.251.0.1 dev wg1 table 10 uid 0
cache
# ip route get from 192.168.0.1 10.251.0.2
10.251.0.2 from 192.168.0.1 dev eth1.251 uid 0
cache
在表 10 中添加条目时:
# ip route get from 10.251.0.2 iif eth1.251 10.251.0.1 #even with strict reverse path filtering, since the reverse route is correct
local 10.251.0.1 from 10.251.0.2 dev lo table local
cache <local> iif eth1.251
# ip route get from 10.251.0.1 10.251.0.2
10.251.0.2 from 10.251.0.1 dev eth1.251 table 10 uid 0
cache