我已经使用以下命令在 Linux“路由器”上设置了源策略路由:
ip rule add from 192.168.1.0/24 table FOO
ip route add default dev eth0 table FOO
从该子网转发的数据包到达 Internet 目的地。
问题是表 FOO 不从表 main 继承本地连接的路由。
我可以手动添加本地连接的路由,但显然这很脆弱并且需要更多维护。
我希望表 FOO 继承表 main 的所有路由,然后我可以使用“ip 路由更改默认值”而不是“ip 路由添加默认值...”。
表 main 的默认路由必须保留在其他子网中。
我怎样才能做到这一点 ?
答案1
以下是添加新路由表和规则的常用方法,这是 OP 不希望的:
- 创建一个包含“例外”的新路由表,称为
FOO
- 添加带有选择此表的条件的规则
FOO
- 因为规则获得较低(更好)的优先级,所以
FOO
首先读取新表,因此通常完全绕过该main
表。为了“纠正”此问题,main
将表中的路由复制到表中FOO
。
规则看起来像这样:
# ip rule
0: from all lookup local
32765: from 192.168.1.0/24 lookup FOO
32766: from all lookup main
32767: from all lookup default
OP 不希望必须执行 3.,因为它会在路线更改时增加管理负担。
据我了解,这就是OP所希望的:
- 每个本地交通都应使用表中的常用路线进行处理
main
- 如果流量来自
192.168.1.0/24
其默认路由,则应从表中获取FOO
(此处dev eth0
) - 否则,流量将使用“通常”的默认路由。
让我们按照这个顺序来实现它,而不是通常的顺序。结果可能不完全是问题中所描述的,但应该是所希望的。如果没有要解决的实际问题以及 OP 给出的正确配置,有些事情可能看起来很尴尬(例如重用 的输出将ip route
默认路由从 table 移动main
到 table default
)。
从通常的规则开始:
# ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
请注意,该default
表是空的(默认情况下)并且可以免费使用。
# ip route show table default
#
将查找的规则移至
main
较低优先级# ip rule add priority 32000 from all lookup main # ip rule del priority 32766
实施例外情况
# ip route add default dev eth0 table FOO # ip rule add priority 32100 from 192.168.1.0/24 lookup FOO
将“通常”默认路由从 table 移至
main
tabledefault
,以允许在规则 32100 处触发异常。如果之前未找到匹配项,则规则 32767 仍将提供表中的默认路由default
,不会出现连接丢失。# ip route add $(ip route show 0.0.0.0/0) table default # ip route del default
规则现在看起来像这样:
# ip rule
0: from all lookup local
32000: from all lookup main
32100: from 192.168.1.0/24 lookup FOO
32767: from all lookup default
容器中的几个示例(这没有多大意义,只是为了查看涉及的表):
# ip -br link
lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
eth0@if12 UP 66:d4:11:94:49:5f <BROADCAST,MULTICAST,UP,LOWER_UP>
local0@if9 UP 00:16:3e:6a:c1:e9 <BROADCAST,MULTICAST,UP,LOWER_UP>
# ip -4 -br a
lo UNKNOWN 127.0.0.1/8
local0@if9 UP 10.0.3.66/24
# ip route
10.0.3.0/24 dev local0 proto kernel scope link src 10.0.3.66
# ip route show table FOO
default dev eth0 scope link
# ip route show table default
default via 10.0.3.1 dev local0
# ip -o route get 10.0.3.2
10.0.3.2 dev local0 src 10.0.3.66 \ cache
# ip -o route get 8.8.8.8
8.8.8.8 via 10.0.3.1 dev local0 table default src 10.0.3.66 \ cache
# ip -o route get 8.8.8.8 from 192.168.1.2 iif local0
8.8.8.8 from 192.168.1.2 dev eth0 table FOO \ cache iif local0
就是这样。唯一的用法差异是“通常”默认路由现在必须在表default
( 253
) 而不是表main
( )中设置254
。必须调整引导脚本来处理它:设置不应指定默认路由或网关,而应运行一个额外的自定义脚本来执行此操作ip route add default ... table default
。对于 Debian,这可以通过命令来完成post-up
(例如 post-up ip route add default via xxx table default || :
) 在/etc/network/interfaces
。对于 RHEL7,这应该完成路线-XXX文件。对于systemd的新网络方法,我不知道。
答案2
只需添加
ip rule add from 192.168.1.0/24 table main suppress_prefixlength 0
数据包将前往table main
并查找路由,但table main
不会使用默认路由。
然后数据包转到table FOO
并被路由到eth0
。