linux中无真正“双活路由”,实际是通过策略路由、ecmp或多出口调度实现多路径自动选路与秒级故障切换,核心在于可切换、不中断、路径一致。

Linux中没有真正意义上的“双活路由”概念——路由本身是无状态转发规则,不支持像应用服务那样主主同步或会话共享。所谓“高可用双活路由”,实际是指通过策略路由、多路径(ECMP)或应用层调度,实现多出口自动选路+故障秒级切换,避免单网关单路径的单点失效。关键不在“双活”,而在“可切换、不中断、路径一致”。
确认是否真需双活:先分清场景类型
多数所谓“双活路由”需求其实对应以下三类典型场景,配置逻辑完全不同:
- 双运营商接入(如电信+联通):目标是出向流量按目标地址智能选路(访问电信资源走电信出口),故障时自动切到另一线路。必须用策略路由 + 多路由表 + ip rule。
- 同网段双网关冗余(如双核心交换机):目标是单个子网内默认网关高可用,此时应使用Keepalived + VRRP虚拟IP,而非配置两条默认路由。
- 数据中心内多路径负载(如双上联ToR):目标是提升带宽利用率和链路冗余,需启用内核ECMP(ip route add ... nexthop via ... nexthop via ...),并确保哈希算法稳定、RS侧回程路径对称。
双运营商策略路由:实现“按需出口+故障切换”
这是最接近“双活路由”的实用方案,核心是让入站源IP决定出站路径,保证响应包从同一接口返回,避免 asymmetric routing(非对称路由)导致防火墙或连接追踪异常。
- 在/etc/iproute2/rt_tables中定义两个路由表:
100 telecom101 unicom - 为每个表添加直连网段和默认网关:
ip route add 192.168.1.0/24 dev eth0 src 192.168.1.100 table telecomip route add default via 192.168.1.1 dev eth0 table telecomip route add 10.0.2.0/24 dev eth1 src 10.0.2.100 table unicomip route add default via 10.0.2.1 dev eth1 table unicom - 绑定源地址到对应路由表:
ip rule add from 192.168.1.100/32 table telecomip rule add from 10.0.2.100/32 table unicom - 添加健康检查机制(关键!):
用curl -s --connect-timeout 2 http://192.168.1.1/login探测网关可达性,脚本失败时执行ip rule del from 192.168.1.100临时移除该规则,触发流量自动切到另一路径。
VRRP虚拟网关:替代“双默认路由”的安全做法
若两台网关设备位于同一二层网络(如都接在同一台交换机),严禁在客户端配置两条默认路由(会导致ARP混乱、TCP重传激增)。正确做法是部署Keepalived,对外暴露一个VIP作为唯一默认网关:
- 主备节点
virtual_router_id、子网、interface必须完全一致; - 主节点
state MASTER、priority 100,备节点state BACKUP、priority 90; - 务必配置健康检查(如检测网关进程或上游连通性),否则网关宕机VIP仍滞留,等于没高可用;
- 客户端只配一条默认路由:
ip route add default via 192.168.1.100(VIP),无需感知后端物理设备变化。
持久化与验证要点
所有ip route和ip rule命令均为临时生效,重启即丢。必须固化到启动流程:
- RHEL/CentOS系:写入/etc/sysconfig/network-scripts/ifup-local或/etc/rc.d/rc.local(需
chmod +x); - Ubuntu/Debian系:在/etc/network/interfaces中用
post-up指令,或使用Netplan的routes+routing-policy字段; - 验证是否生效:
ip rule show查规则顺序,ip route get 8.8.8.8 from 192.168.1.100模拟特定源IP的选路结果,tcpdump -i eth0 icmp确认响应包出口是否符合预期。











