无需在单独的路由表中设置路由即可访问不同的接口

无需在单独的路由表中设置路由即可访问不同的接口

我们目前正在尝试将所有数据包从我们的访客 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.2192.168.0.0/1610.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 

相关内容