在多网卡、多IP的Linux服务器上,如何做到精确的把对应网卡的数据从对应的路由方向转发,通常需要用到策略路由这项技术。
在网络领域有时候会接触到传统路由、路由策略、策略路由这些名词,有时候会搞得晕乎晕乎的,我们先把概念搞清楚。
传统路由(普通路由):只看目标IP,通过静态路由、OSPF、BGP 学到的路由,查路由表,掩码最长、优先级、度量值(cost),选一条最优路径转发数据;这就是最基础的设备依据路由表转发数据的依据。
路由策略(Route Policy,也可理解为路由过滤):控制路由表怎么生成,控制哪些路由能进来、哪些路由能出去。比如不让某些网段通过OSPF 发布或者在BGP引入路由时打标签、改属性等。它管路由表如何生成,不管数据转发。通常不同的设备厂商有不同表述,如思科 route-map、华为/ H3C的route-policy、filter-policy、ip-prefix。
策略路由(Policy-Based Routing,PBR):一种高级数据包转发机制,按预设策略(非仅目的IP)决定转发路径,优先级高于传统路由,如策略路由匹配失败后会再根据传统转发。
比如依据数据包的源IP、端口、协议、报文长度、DSCP等进行配置转发。
内核处理数据包,会遍历ip rule 列表(按优先级从小到大)匹配ip rule规则,匹配到某条规则后,去查该规则指定的路由表,在路由表里找到匹配的路由,根据路由信息对数据包执行转发,如果查不到信息,就按规则后续动作(如继续查下一张表或丢包)。
Linux下通过 ip rule命令(规则)实现策略路由的入口,路由表是策略路由里的具体转发信息。规则是入口,路由表是出口。
可以简单理解:Linux策略路由=ip rule+多路由表
在Linux系统里面,ip rule是怎么存在的?可以使用命令:ip rule list查看:

0: from all lookup local #先查local 表(本机IP、广播、loopback)32766: from all lookup main #再查main表(通常使用 ip route 命令默认就会看到main表的路由信息)32767: from all lookup default #最后查default 表(通常空)
核心要点:
1.通过ip rule list查看到的有系统内核里默认动态生成的三张路由表,不是存在其他配置文件里的。如果要自定义添加路由表,重启后会丢失,需要自行写配置持久化。
2.规则表里的数字(0、32766、32767)代表规则的优先级,数值越小优先级越高。如果你要自定义策略路由,需要将规则的数值设置为比main表的数值小(取值可以为1-32765)。
另外,Linux系统有哪些路由表?在哪里查看?
可以使用命令:cat /etc/iproute2/rt_tables 查看

255 local # 对应ip rule 里的local 表(本机回环/网卡IP)254 main # 对应ip rule 里的main 表(日常ip route命令看到的主路由)253 default # 对应ip rule 里的default 表(兜底空表)0 unspec # 保留ID,无实际用途
核心要点:
1./etc/iproute2/rt_tables这个文件可以理解为Linux系统的路由表别名映射表,数值和名称的对应关系。数值(255、254、253、0是系统固定表,不能修改),没有优先级之分。如果要自定义路由表,取值可以是1-252。
2.有些Linux发行版本的多路由表信息并不会默认生成/etc/iproute2/rt_tables 文件,比如Rocky9.6的 iproute2 默认配置文件路径是 /usr/share/iproute2/。如果你需要在这种环境的系统里配置多路由表,一定要将/usr/share/iproute2/目录下的文件拷贝到/etc/iproute2/目录,目录里就包含其中的rt_tables这个文件。也就是自定义规则必须在 /etc/iproute2/ 下操作(先建目录,再复制默认文件修改),系统会优先读取此目录,避免升级覆盖自定义配置。
支持策略路由的Linux版本,从内核2.1 开发版开始引入,2.2 稳定版正式成熟并广泛可用,2.4 +版本持续优化。也就是所有现代发行版均原生支持策略路由。
配置规则和路由的命令ip rule 和ip route 从2.2 起就是标配,和 route命令共存。
1.使用ip rule和ip route组合
ip rule命令配置策略路由优先级,ip route命令配置路由表信息。但是这种方式的配置数据只是临时在内存中生效,一旦重启会丢失(需要自行做好配置数据持久化)。
2.使用nmcli命令
nmcli是NetworkManager的前端工具,其配置的路由规则数据会随网络参数自动保存到网卡的连接配置文件中。
主要有以下两种情况:
(1)现代Linux 系统(如RHEL 8+/CentOS 8+、Fedora、Ubuntu 等),路由规则保存在/etc/NetworkManager/system-connections/ 目录下的对应连接配置文件中(如eno3.nmconnection)。
文件中会以routing-rules 这个字段记录,格式如下:
[ipv4]routing-rules=priority 100 from 2.2.2.2 table 253
(2)在部分仍使用传统ifcfg-* 格式的系统中(如CentOS 7),路由规则可能会保存在/etc/sysconfig/network-scripts/目录下的接口配置文件(如ifcfg-ens33)中,以IPV4_ROUTING_RULES 字段记录:
IPV4_ROUTING_RULES="priority 100 from 2.2.2.2 table 253"或者ROUTING_RULE_1="priority 100 from 2.2.2.2 table 253"
我们以一台Linux配置了两张网卡为例:
目标:
ens6网卡发出去的数据包默认路由走网关2.2.2.254。
ens7网卡发出去的数据包默认路由走网关8.8.8.254.
场景和目标定义好后,我们就开始进行策略路由的配置。下面分别以ip rule/ip route方式和nmcli方式进行配置。
1.使用ip rule/ip route方式配置策略路由
(1)分别针对ens6和ens7新建路由表(只做一次)echo "100 ens6_net" >> /etc/iproute2/rt_tablesecho "200 ens7_net" >> /etc/iproute2/rt_tables(2)分别给每张表写默认路由#表100走ens6网关ip route add default via 2.2.2.254 table 100#表200走ens7网关ip route add default via 8.8.8.254 table 200(3)用ip rule命令做策略分流#源IP 2.2.2.0/24 → 走路由表100ip rule add from 2.2.2.0/24 table 100priority 100#源IP 8.8.8.0/24 → 走路由表200ip rule add from 8.8.8.0/24 table 200priority 200(4)刷新路由,让规则生效ip route flush cache
注意项:通过次方式配置的策略路由只运行在内存中,如果需要持久化保存配置,需要自行将以上命令保存到固定文件中,比如 /etc/rc.local或其他定义systemd服务。
2.使用nmcli方式配置策略路由
(1)分别针对ens6和ens7新建路由表(只做一次)echo "100 ens6_net" >> /etc/iproute2/rt_tablesecho "200 ens7_net" >> /etc/iproute2/rt_tables(2)分别给每张表写默认路由#表100走ens6网关nmcli connection modify ens6 +ipv4.routes "0.0.0.0/0 2.2.2.254 100"#表200走ens7网关nmcli connection modify ens7 +ipv4.routes "0.0.0.0/0 8.8.8.254 200"(3)用ip rule命令做策略分流#源IP 2.2.2.0/24 → 走路由表100nmcli connection modify ens6 +ipv4.routing-rules "priority 100 from 2.2.2.0/24 table 100"#源IP 8.8.8.0/24 → 走路由表200nmcli connection modify ens7 +ipv4.routing-rules "priority 200 from 8.8.8.0/24 table 200"
注意项:
(1)若需要替换现有规则(而非添加),可去掉+ 符号(会覆盖原有规则)
(2)如果需要删除规则使用-(减)号
(3)此种方式的配置会自动将配置保存在网卡连接配置文件中
#查看策略路由(就是ip rule)ip rule show#查看指定路由表ip route show table 100#查看主路由表ip route show
策略路由的通常主要用于流量分流(按用户、部门、应用走不同链路);QoS 保障(对语音、视频等关键流量优先转发);负载分担(多链路场景按策略分担流量,提升链路利用率);安全控制(将特定流量引导至审计、过滤设备,隔离风险流量)等,可以根据实际需求进行配置和应用。