1. "服务器路由排序替换"到底在解决什么问题
1.1 路由顺序的"蝴蝶效应"
我做运维这些年,最怕听到的一句话就是"网络好像有点卡"。这句话背后的原因可能有一百种,但其中很大一部分,最后都能归结到路由表的顺序问题上。你说它是个基础概念吧,确实基础;但正是这些基础的东西,一旦出错,排查起来能让人怀疑人生。
先花一分钟把概念对齐。所谓路由,就是服务器告诉数据包"你要去某个目的地,下一步该往哪个口走"的一张规则表。这张表是有顺序的,系统在转发数据包时,会从上到下逐条匹配,一旦命中就按这条规则执行。所以路由条目的先后顺序,直接决定了流量走哪条路。这不是理论问题,而是实实在在的线上问题——我遇到过一台双网卡服务器,内网业务一直间歇性超时,排查了三天,最后发现就是两条默认路由的顺序乱了,回程流量走了错误的网口,所有包都被防火墙丢掉。你ping外网是通的,ping内网网关也通,但跨网段访问就是断断续续,这种问题最折磨人。
排序和替换,这两个动作在日常运维里几乎每天都在发生。临时调试要添加路由、切换线路要替换默认网关、多运营商接入要调整路由优先级、迁移机房要成批替换路由配置。每一个动作背后,都是在操作这张"规则表"。但如果只是会敲两三条命令,那只能说入门了。真正要在生产环境里玩转,你需要理解路由的优先级机制、永久配置的持久化方式、动态路由和静态路由的配合,以及批量修改时的脚本化处理。这正是这篇文章想聊清楚的事。
1.2 排序与替换:两个高频动作的使用场景
先盘点一下我在实际工作中遇到的、需要"排序"和"替换"的典型场景,这决定了我们后面要讨论的技术范围。
路由排序场景:多网卡服务器的默认路由冲突、双运营商线路的负载分配、策略路由的优先级控制、VLAN间路由的顺序管理。这类问题的核心是"哪条路由优先",对应到技术点就是metric值、路由表的查表顺序、策略路由的rule优先级。
路由替换场景:主备网关切换、业务迁移时的网关批量修改、临时路由转永久路由、动态路由学习失败后手动替换静态路由。这类问题的核心是"如何在不中断业务的前提下把旧规则换掉",对应到技术点就是ip route replace、配置文件的批量修改、脚本化的比对与推送。
我见过不少同事,遇到路由问题就"重启一下"或者"临时加一条,能用就行"。这种做法在测试环境没问题,但在生产环境就是埋雷。因为你加的临时路由,下一次network restart就没了,而你以为它还在;你手动改的metric,可能在某个服务重启后被DHCP或NetworkManager重置了。所以这篇文章我尽量把"临时操作"和"永久配置"都讲清楚,把排序和替换的底层逻辑讲透。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Linux服务器路由的添加、排序与永久生效
2.1 临时路由和永久路由:别把测试当生产
先区分概念。Linux下添加路由,最直接的方式是:
bash复制# 添加一条到指定网段的路由,下一跳是网关
ip route add 10.10.0.0/16 via 192.168.1.1 dev eth0
# 添加默认路由
ip route add default via 192.168.1.1 dev eth0
# 查看当前路由表
ip route show
这条命令执行后立刻生效,但它只存在于当前内核的路由表中,重启网络服务或重启服务器后就会丢失。这是新手最容易踩的坑:在服务器上加了一条路由,当时测试一切正常,第二天业务同事说网络又不通了,你上去一看,路由表里空空如也。
如果你要的是"永久生效",必须把路由写入系统的网络配置文件中。但是这里的麻烦在于,不同的发行版、不同的网络管理工具,配置方式完全不同:
| 系统/工具 | 永久配置方式 | 适用场景 |
|---|---|---|
| CentOS/RHEL 7+(network-scripts) | 在 /etc/sysconfig/network-scripts/route-eth0 中写入路由 |
传统网络管理方式 |
| Ubuntu(netplan) | 在 /etc/netplan/*.yaml 中配置 routes 段 |
18.04及以上默认 |
| 麒麟V10 | nmcli 或 /etc/sysconfig/network-scripts/ |
国产化环境常见 |
| NetworkManager | nmcli connection modify 配 ipv4.routes / ipv4.gateway |
多数桌面和部分服务器 |
这就是为什么很多运维在服务器上执行ip route add后重启网络服务,发现路由还在,隔天重启服务器就不在了。你只是在"测试"阶段做了操作,却没有把结果"固化"下来。
从我个人的经验来说,生产服务器上配置路由的前三步永远是:
- 备份当前路由表:
ip route show > /tmp/route_backup_$(date +%F).txt - 在测试窗口内先临时添加,验证连通性
- 验证通过后,立即写入对应的持久化配置文件
2.2 麒麟V10添加永久默认路由的三种方式
最近几年国产化服务器用得越来越多,麒麟V10在政务和国企项目里非常常见。这个系统基于CentOS,兼容性不错,但路由配置上还是有一些细节差异,我踩过几次坑,单独说一下。
先说需求本身:向服务器添加一条永久默认路由。这里有三种方式,按推荐程度排序。
方式一:nmcli命令行(推荐)
麒麟V10默认使用NetworkManager管理网络,用nmcli配置是最不容易出错的方式:
bash复制# 查看当前连接名称,通常是 ens160、eth0 等
nmcli connection show
# 给指定连接添加永久默认路由
nmcli connection modify ens160 ipv4.routes "0.0.0.0/0 192.168.10.1"
# 立即生效
nmcli connection up ens160
这里有一个容易混淆的点:ipv4.gateway和ipv4.routes "0.0.0.0/0 ..."在效果上看起来都是设置默认路由,但NetworkManager内部处理逻辑有差异。如果通过ipv4.gateway配置,系统会自动把这条网关对应的路由写入默认路由表,同时ip route show里会标注proto dhcp或proto static。而手动在ipv4.routes里写0.0.0.0/0,相当于强制指定了默认路由的"来源"。我遇到过的情况是,如果在有DHCP的环境中同时配置了两者,DHCP下发的网关会覆盖手动配置的默认路由,导致配置失效。解决办法:在nmcli中显式设置ipv4.ignore-auto-routes yes和ipv4.ignore-auto-dns yes,避免自动路由干扰手动配置。
方式二:nmtui交互界面
如果习惯图形化操作,直接输入nmtui,进入"Edit a connection",选择网卡,在IPv4配置里手动填Gateway和Additional routes。这种方式适合手头没有参考文档、需要快速查看网络配置全貌的场景。但要注意,nmtui操作完后一定要确认是否真正写入了配置文件,因为有些版本在保存时会重写整个连接文件,如果之前手动改过其他参数,可能会被覆盖掉。
方式三:直接改配置文件
麒麟V10的网卡配置文件在/etc/sysconfig/network-scripts/ifcfg-ens160,路由配置文件是/etc/sysconfig/network-scripts/route-ens160。但这里有个坑:麒麟V10默认同时运行NetworkManager和network服务,如果两个服务都在管理同一块网卡,就会出现配置互相覆盖的现象。我建议在直接改配置文件的方案下,先停掉NetworkManager再操作,或者反过来统一用NetworkManager管理。两种工具并存,是路由配置"重启后消失"的头号元凶之一。
bash复制# /etc/sysconfig/network-scripts/route-ens160
# 格式:目标网段 via 下一跳 [dev 网卡]
0.0.0.0/0 via 192.168.10.1 dev ens160
保存后执行systemctl restart network。生效后务必用ip route show确认。
2.3 用metric控制多网卡路由优先级
多网卡服务器的路由排序问题,是运维面试里最喜欢问的,也是实际工作中最容易出问题的。最常见的场景是:服务器同时接了内网和外网,内网通过eth0访问,外网通过eth1访问,默认路由应该走eth1。但系统启动时,可能因为网卡加载顺序、DHCP获取速度等原因,把默认路由指向了eth0,导致外网访问全部失败。
解决这个问题的核心工具就是metric(路由度量值)。在Linux中,metric值越小,路由优先级越高。两条默认路由并存时,系统会优先选择metric值小的那条。
bash复制# 默认路由走 eth1,metric 100
ip route add default via 192.168.10.1 dev eth1 metric 100
# 备用的默认路由走 eth0,metric 200
ip route add default via 192.168.20.1 dev eth0 metric 200
这样配置后,正常情况下流量走eth1,当eth1不可用时,系统自动切换到eth0。这个"自动"说起来轻松,实际要依赖内核的链路检测机制,需要结合ip route show查看路由状态,必要时配合脚本做心跳检测。
如果是永久配置,在route-eth0和route-eth1文件中分别写入:
code复制# route-eth1
default via 192.168.10.1 dev eth1 metric 100
# route-eth0
default via 192.168.20.1 dev eth0 met
