一台 Linux 服务器接两条线(一个内网、一个电信网),要求”不同 IP 走不同网络”做流量分离,靠的是 Linux 的策略路由(多路由表 + 路由规则)。

图片素材来自免费商用图库(pixabay),非本站项目实拍。

一、路由规则与路由表

Linux 路由由”路由规则(ip rule)”和”路由表”组成:规则决定满足条件的数据包查哪张表,表决定下一跳。ip rule 默认有 local/main/default 三条(内核最多 32768 条规则);系统支持 256 张表(编号 0-255,别名在 /etc/iproute2/rt_tables 配),main 是主表。ip route list table main 看到默认网关走内网那一侧。

二、给第二个网段单开一张表

目标是让 192.168.1.0/24 的流量走电信网关 eth1。用编号 200 的表:ip rule add from 192.168.1.0/24 table 200(把该源网段导向 200 表),再 ip route add default via 192.168.1.1 dev eth1 table 200(200 表的默认出口是电信网关)。验证:ip route get 8.8.8.8 from 192.168.1.100 应显示走 eth1、from 192.168.0.100 走 eth0,分流即成功。

三、持久化

以上设置重启即失效,需保存:ip route save/ip rule save 或写入开机脚本(如 rc.local、netplan 配合 routing-policy)。服务器做网关/多线分流时,策略路由比默认路由精细,但要注意防火墙与反向路由(rp_filter)别把合法回程包丢掉。

四、多网卡路由出口设置

  • 策略路由 → ip rule + ip route table 按源地址选出口,解决多出口不对称。
  • 默认网关 → 主路由表只放一个默认,其余走自定义表。
  • 源地址 → 出接口用 iptables/nft SNAT 固定源 IP,避免回包走错口。

多网卡最坑:默认网关只能一个,第二个出口靠策略路由+SNAT 补;否则从网卡 B 进来的包从网卡 A 出去,连接直接断。