实现双线机房“按原路返回”需用nmcli配置网卡基础参数,再通过策略路由(ip rule + ip route)绑定源地址与路由表,并关闭rp_filter以避免非对称路径丢包。

要实现双线机房(如电信+联通)的“按原路返回”,核心不是靠 nmcli 直接设置选路,而是用 nmcli 管理好网卡基础配置,再配合 Linux 策略路由(ip rule + ip route)和反向路径过滤(rp_filter)协同生效。nmcli 本身不处理策略路由逻辑,但它能确保各网卡 IP、状态、自动连接等就绪,是整个方案可靠运行的前提。
关键目标:
请求从电信口进 → 响应也必须从电信口出;
请求从联通口进 → 响应也必须从联通口出。
否则会因 rp_filter=1 丢包,或回包走错网卡导致连接中断、SSH 断连、HTTP 超时等。
明确网卡与地址规划
先确认两块网卡名称及各自公网 IP(假设):
-
ens3:电信线路,IP202.96.128.100/24,网关202.96.128.1 -
ens4:联通线路,IP114.255.200.200/24,网关114.255.200.1
用以下命令确认真实设备名:
nmcli device status ip -br a | grep -v 'lo\|down'
用 nmcli 完成基础网卡配置
确保两张网卡都启用静态 IP、禁用默认网关冲突、开启自动连接:
# 配置电信网卡 ens3(设 IP、不设 gateway,避免覆盖) nmcli connection modify "System ens3" ipv4.method manual \ ipv4.addresses "202.96.128.100/24" \ ipv4.gateway "" \ ipv4.never-default yes \ ipv4.dns "" \ connection.autoconnect yes # 配置联通网卡 ens4(同理) nmcli connection modify "System ens4" ipv4.method manual \ ipv4.addresses "114.255.200.200/24" \ ipv4.gateway "" \ ipv4.never-default yes \ ipv4.dns "" \ connection.autoconnect yes # 重载并激活 nmcli connection reload nmcli connection up "System ens3" nmcli connection up "System ens4"
⚠️ 注意:
- 不给任一网卡配
ipv4.gateway,是因为默认网关只能有一个,而策略路由靠的是“源地址查表”,不是靠默认路由。 -
ipv4.never-default yes是强制防护,防止 NetworkManager 后续误写入默认路由。
创建独立路由表并绑定源地址
编辑 /etc/iproute2/rt_tables,追加两行(编号避开 0–99):
echo "100 table_tel" | sudo tee -a /etc/iproute2/rt_tables echo "101 table_cnc" | sudo tee -a /etc/iproute2/rt_tables
然后为每张表添加直连路由 + 默认网关(注意 dev 和 src 必须匹配):
# 电信表 ip route add 202.96.128.0/24 dev ens3 src 202.96.128.100 table table_tel ip route add default via 202.96.128.1 dev ens3 table table_tel # 联通表 ip route add 114.255.200.0/24 dev ens4 src 114.255.200.200 table table_cnc ip route add default via 114.255.200.1 dev ens4 table table_cnc
再添加策略规则(按源 IP 匹配查表):
ip rule add from 202.96.128.100/32 table table_tel priority 100 ip rule add from 114.255.200.200/32 table table_cnc priority 101
✅ 验证是否生效:
ip rule show ip route show table table_tel ip route show table table_cnc
关闭 rp_filter,否则策略路由失效
即使路由和规则全对,只要 rp_filter=1,内核就会拒绝“非对称路径”的响应包(比如请求从 ens3 进、回包从 ens4 出),直接丢弃。
临时关闭(测试用):
echo 0 | sudo tee /proc/sys/net/ipv4/conf/all/rp_filter echo 0 | sudo tee /proc/sys/net/ipv4/conf/ens3/rp_filter echo 0 | sudo tee /proc/sys/net/ipv4/conf/ens4/rp_filter
永久生效(写入 /etc/sysctl.conf):
echo "net.ipv4.conf.all.rp_filter = 0" | sudo tee -a /etc/sysctl.conf echo "net.ipv4.conf.ens3.rp_filter = 0" | sudo tee -a /etc/sysctl.conf echo "net.ipv4.conf.ens4.rp_filter = 0" | sudo tee -a /etc/sysctl.conf sudo sysctl -p
✅ 推荐设为
0(关闭校验),比设2(宽松)更稳妥——因为策略路由本质就是打破“对称路径”,rp_filter=2在某些内核版本下仍有误判风险。
持久化策略路由(重启不丢失)
把上面 ip route 和 ip rule 命令写成脚本(如 /usr/local/bin/setup-policy-route.sh),并设为开机执行:
#!/bin/bash # /usr/local/bin/setup-policy-route.sh ip route flush table table_tel 2>/dev/null ip route flush table table_cnc 2>/dev/null ip rule del priority 100 2>/dev/null ip rule del priority 101 2>/dev/null ip route add 202.96.128.0/24 dev ens3 src 202.96.128.100 table table_tel ip route add default via 202.96.128.1 dev ens3 table table_tel ip route add 114.255.200.0/24 dev ens4 src 114.255.200.200 table table_cnc ip route add default via 114.255.200.1 dev ens4 table table_cnc ip rule add from 202.96.128.100/32 table table_tel priority 100 ip rule add from 114.255.200.200/32 table table_cnc priority 101
赋予可执行权限,并加入 systemd service 或 /etc/rc.local(根据发行版选择)。
验证是否真正“按原路返回”
- 从电信客户端 ping 服务器的电信 IP:
ping 202.96.128.100→ 应通 - 从联通客户端 ping 服务器的联通 IP:
ping 114.255.200.200→ 应通 - 登录后执行:
ip route get 8.8.8.8 from 202.96.128.100→ 输出应含dev ens3 - 同理:
ip route get 8.8.8.8 from 114.255.200.200→ 输出应含dev ens4
若全部符合,说明源地址选路 + 原路返回已稳定生效。











