我的“CentOS 7 Minimal”机器上有 2 个网络接口。我需要设置基于策略的路由,这样如果请求进入一个接口,回复就会从同一接口发送出去。以非持久方式使用 iproute2 执行此操作并不是非常困难:
echo '200 isp2' >> /etc/iproute2/rt_tables
ip route add default via 1.1.1.1 table isp2
ip rule add from 192.168.1.50 table isp2
其中1.1.1.1是我的路由器,192.168.1.50是我的linux的IP。问题是让这种情况持续下去。
据我所知,没有 iproute2 持久性文件 - 使事物持久化的方法是将它们添加到网络启动脚本中。
通常,RedHat 建议创建文件 /etc/sysconfig/network-scripts/route-ethX 来添加路由,但这似乎无法将路由添加到辅助路由表中。
解决方案似乎是将上面的“iproute”和“iprule”行添加到 /etc/sysconfig/network 中。这几乎是有效的,除了一件事:每次网络重新启动时,它都会不断添加重复的“ip 规则”规则,一次有数十个。
使用“systemctl restart network”重新启动网络 2 或 3 次后,我的ip rule
输出如下所示:
0: from all lookup local
32670: from 192.168.1.50 lookup isp2
32671: from 192.168.1.50 lookup isp2
...
32764: from 192.168.1.50 lookup isp2
32765: from 192.168.1.50 lookup isp2
32766: from all lookup main
32767: from all lookup default
在 CentOS 7 上添加持久的基于策略的路由规则的正确方法是什么?
附言。正如预期的那样,该ip route list table isp2
命令显示单个条目,因此这不是问题。
编辑:根据RedHat 7手册:
在 Red Hat Enterprise Linux 中,不推荐使用全局 /etc/sysconfig/network 文件
这有利于特定于接口的配置文件,它似乎无法将路由添加到不同的路由表,并且无法添加ip rule
规则。
答案1
安装 NetworkManager-config-routing-rules 并启用 NetworkManager-dispatcher 似乎已经解决了这个问题:
$ sudo yum install NetworkManager-config-routing-rules
$ sudo systemctl enable NetworkManager-dispatcher.service
$ sudo systemctl start NetworkManager-dispatcher.service
现在我可以将其放入我的 /etc/sysconfig/network-scripts/route-ethX 中:
default via 1.1.1.1 table isp2
这在我的 /etc/sysconfig/network/scripts/rule-ethX 中:
from 192.168.1.50 table isp2
以及我的 /etc/iproute2/rt_tables 中 isp2 的定义:
200 isp2
重新启动网络服务不再创建重复条目。
答案2
/etc/sysconfig/network-scripts/ifup-routes
鉴于从行的读取route-(interface)
被解析为原样ip route add
,因此要在某个表中添加路由,只需添加table XXX
到该行即可。但是,您可能需要使用表号而不是名称来rt_tables
成功添加路由。
通过规则,您可以使用rule-(interface)
文件以及实际当前版本的文件,ifup-routes
并ifdown-routes
像路由文件一样处理这些文件。您的脚本集可能不是这种情况,以验证 run grep rule /etc/sysconfig/network-scripts/ifup-routes
。
您的主要问题实际上是由/etc/sysconfig/network
每个 ifup 和 ifdown 脚本的来源引起的,因此该文件中的每个命令都会在每个接口的每次上/下执行一次。这反过来又会使您的系统在每次网络重新启动时添加 2* 个接口(包括lo
)IP 规则。
PS:我已经卸载了CentOS网络管理器,所以一切都是通过ifup/ifdown脚本完成的,并且在发布这个答案之前我已经测试了所有这些。
答案3
重新启动网络服务不再创建重复条目。
不幸的是,事实并非如此。如果您只是继续重新启动网络服务而不做任何修改,但如果您编辑现有规则,例如您更改此:
from 10.1.2.0/23 table 300
对此:
from 10.1.2.0/24 table 300
然后你重新启动网络服务,看看会发生什么:
ip rule list table 300
32763: from 10.1.2.0/23 lookup 300
32764: from 10.1.2.0/24 lookup 300
重复的规则,如 32763:从 10.1.2.0/23 查找 300 应该已被删除。
此外:如果您注释或完全删除“rule-ifname”文件中的所有规则,并重新启动网络服务,则所有先前的规则仍然会存在。
所以不,这不是一个解决方案。