linux基于源地址的路由选择依赖策略路由:通过自定义路由表(如table_eth0/table_eth1)和ip rule规则,使不同源ip的数据包查对应路由表;需启用ip_forward、关闭rp_filter,并配置各表的直连网段与默认路由。

Linux 实现基于源地址的路由选择,核心是策略路由(Policy Routing):不只看目标 IP,而是根据数据包的源地址决定走哪张路由表。默认情况下内核只用 main 表,无法区分不同网卡出口;必须配合自定义路由表 + ip rule 规则才能生效。
一、准备路由表与基础环境
先确保系统允许转发和宽松反向路径检查:
- 临时启用 IPv4 转发:
echo 1 > /proc/sys/net/ipv4/ip_forward - 临时关闭所有接口的
rp_filter:for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $i; done - 永久生效需在
/etc/sysctl.conf中添加:net.ipv4.ip_forward = 1net.ipv4.conf.all.rp_filter = 0
再为每块网卡注册独立路由表名,编辑 /etc/iproute2/rt_tables,追加两行(数字为优先级,越小越靠前):
100 table_eth0101 table_eth1
二、配置各路由表的路由条目
假设 eth0 地址为 192.168.1.100/24,网关 192.168.1.1;eth1 地址为 10.0.2.100/24,网关 10.0.2.1:
- 为
table_eth0添加直连网段和默认路由:ip route add 192.168.1.0/24 dev eth0 src 192.168.1.100 table table_eth0ip route add default via 192.168.1.1 dev eth0 table table_eth0 - 为
table_eth1添加直连网段和默认路由:ip route add 10.0.2.0/24 dev eth1 src 10.0.2.100 table table_eth1ip route add default via 10.0.2.1 dev eth1 table table_eth1
三、绑定源地址到对应路由表
用 ip rule 告诉内核:来自哪个源地址的数据包,查哪张表:
ip rule add from 192.168.1.100/32 table table_eth0ip rule add from 10.0.2.100/32 table table_eth1
注意:/32 表示精确匹配单个 IP;若想匹配整个子网(如所有 192.168.1.x 主机发出的流量),可写 192.168.1.0/24。规则优先级默认递增,也可显式指定,例如:ip rule add from 192.168.1.100/32 table table_eth0 priority 100。
四、验证与持久化
验证是否生效:
- 查看所有规则:
ip rule show - 查看某张表内容:
ip route show table table_eth0 - 模拟发包并查路径:
ip route get from 192.168.1.100 to 8.8.8.8—— 应返回经 eth0 出口的下一跳
重启后配置会丢失,需持久化。推荐方式:
- 写入
/etc/rc.local(需确保可执行),或 - 使用 systemd-networkd,在
.network文件中通过[RoutingPolicyRule]和[Route]段落声明,更可靠且与发行版集成度高











