必须配合策略路由、关闭rp_filter并隔离路由表:1.开启ip_forward;2.关闭all及各网卡rp_filter;3.注册自定义路由表并配置直连/默认路由;4.用ip rule绑定源ip与对应表。

Linux 中开启内核路由转发功能本身很简单,但要让多网卡真正按预期协同工作,不能只开转发——必须配合策略路由、反向路径过滤关闭和路由表隔离,否则会出现响应包从错误网卡发出、SSH 卡死、ping 通但应用不通等问题。
一、开启 IPv4 转发(基础前提)
这是所有转发行为的开关:
- 临时生效(重启失效):
echo 1 > /proc/sys/net/ipv4/ip_forward - 永久生效:
编辑 /etc/sysctl.conf,添加或取消注释这一行:
net.ipv4.ip_forward = 1
然后运行 sysctl -p 加载生效
二、禁用反向路径过滤(关键避坑项)
默认开启的 rp_filter 会检查“回程路径是否与来路一致”。策略路由下,入向和出向走不同网卡是正常设计,但 rp_filter 会把它当成“欺骗包”直接丢弃。
- 临时关闭(测试用):
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter - 永久生效:
在 /etc/sysctl.conf 中追加:
net.ipv4.conf.all.rp_filter = 0
同样执行 sysctl -p
三、配置策略路由(实现多网卡分流)
仅靠 main 表无法同时存在两个默认网关。必须为每张网卡建独立路由表,并绑定源 IP。
- 注册自定义表名:
编辑 /etc/iproute2/rt_tables,末尾加两行(ID ≥100):
100 tab_eth0
101 tab_eth1 - 为每张表添加直连 + 默认路由(以 eth0: 192.168.10.100/24, 网关 192.168.10.1 为例):
ip route add 192.168.10.0/24 dev eth0 src 192.168.10.100 table tab_eth0
ip route add default via 192.168.10.1 dev eth0 table tab_eth0
同理配置 eth1 对应的表和路由 - 绑定源地址与表:
ip rule add from 192.168.10.100/32 table tab_eth0 priority 100
ip rule add from 10.0.20.100/32 table tab_eth1 priority 101
四、验证与持久化
验证命令:
- ip rule show —— 看规则是否写入
- ip route show table tab_eth0 —— 看对应表里有没有直连和默认路由
- ip route get 8.8.8.8 from 192.168.10.100 —— 模拟从该源 IP 发包,看走哪条路径
持久化建议:把上述 ip route 和 ip rule 命令写入网络服务启动脚本(如 /etc/network/if-up.d/ 下的可执行文件),或使用 systemd networkd、NetworkManager 的 routing rules 支持。











