简介面向Linux运维人员、网络管理员及服务器使用者这份PDF聚焦CentOS 7系统下的静态路由配置。内容涵盖路由查看、临时添加与删除以及通过network-scripts目录下的route-接口文件实现重启后依然生效的永久路由配置方法并对常见误区如rc.local失效、多网卡默认网关冲突等给出提示。资源为单个PDF文档共1个文件压缩包大小约57KB便于下载后随时查阅或打印。目前已有6564人浏览学习说明该主题具有较高的实用参考价值。通过阅读这份PDF读者可以快速掌握ip route命令的常用操作和永久静态路由的配置规范避免踩坑提升网络配置效率。1. CentOS 7 静态路由为什么重启就失效是常态在做服务器交付和网络排障的时候我拆过不少 CentOS 7 的静态路由配置看着是基础活翻车率却不低。ip route add敲完当时能用重启之后全没了有人顺手把命令塞进/etc/rc.local结果发现也是白搭更常见的是两张网卡的机器默认路由会在重启后随机走其中一个出口外网时通时断甚至 ping 不通百度。这篇文章不会只告诉你怎么敲命令而是把整个链路拆开先用ip route建立临时路由再把条目写进network-scripts下的接口路由文件接着处理多网卡默认网关冲突最后给一套可复现的验证方法。适合做服务器基础配置、网络排障以及刚接触 CentOS 7 网络管理的运维同行对照着一步步来。2. 临时路由三件套用 ip route 查看、添加、删除2.1 为什么现在的 CentOS 7 都用 ip route 而不是 route老一批运维习惯用route add -net这在 CentOS 6 时代没问题但到了 CentOS 7net-tools已经不是默认软件包了很多精简安装的机器上连route命令都没有。系统自带的网络管理工具换成了iproute2也就是ip命令家族。ip route显示的是内核路由表输出信息比route -n更完整而且对 NetworkManager 管理下的连接配置也能看得更清楚。用ip route show查看当前路由表最典型的结果是两行一行是默认路由default via 192.168.150.254 dev enp0s3另一行是直连网段192.168.150.0/24 dev enp0s3。直连网段是网卡配置好 IP 后内核自动生成的默认路由则是手工写网关或 DHCP 分配得到的。两行内容没有共通性格式也比较松散所以我习惯用column -t把输出排一下版[rootcentos7 tmp]# ip route show | column -t default via 192.168.150.254 dev enp0s3 proto static metric 1024 192.168.150.0/24 dev enp0s3 proto kernel scope link src 192.168.150.110这段输出的意思是凡是没匹配到更精确路由的流量都从 enp0s3 发给 192.168.150.254本机所在网段 192.168.150.0/24 是直连路由源地址自动取 192.168.150.110。proto static表示这条路由是手工配置的proto kernel表示它由内核在网卡激活时自动生成。排障的时候先看这两行的dev是否指向预期网卡九成问题都能定位。2.2 添加、删除与验证命令参数逐项拆临时添加一条静态路由命令只有一行[rootcentos7 ~]# ip route add 10.15.150.0/24 via 192.168.150.253 dev enp0s3这条命令里四个要素缺一不可10.15.150.0/24是要访问的目标网段via 192.168.150.253是下一跳网关地址dev enp0s3是流量出去的物理接口。下一跳必须在本机直连网段内否则内核会提示Network is unreachable这是新手最容易踩的点。添加成功后再查路由表能看到新条目10.15.150.0/24 via 192.168.150.253 dev enp0s3 proto static metric 1这里的metric 1是默认权重。如果同一个目标网段存在多条路由metric 数字越小越优先这一点在验证路由走向时很有用。验证是否通直接 ping 对端网关[rootcentos7 ~]# ping 10.15.150.1 -c 3 PING 10.15.150.1 (10.15.150.1) 56(84) bytes of data. 64 bytes from 10.15.150.1: icmp_seq1 ttl63 time1.77 ms 64 bytes from 10.15.150.1: icmp_seq1 ttl63 time1.08 ms 64 bytes from 10.15.150.1: icmp_seq1 ttl63 time1.57 msttl63 说明对端返回的包已经经过了一台三层设备路径和路由都正常。如果 ping 超时或报Destination Host Unreachable先看路由表里有没有这条路由再看下一跳是否可达。删除临时路由更简单把 add 换成 del或者只写目标网段[rootcentos7 ~]# ip route del 10.15.150.0/24如果删除时提示RTNETLINK answers: No such process说明这条路由根本不在表里检查目标网段是否写错。临时路由只对当前运行状态生效重启后全部清空这也是为什么永久配置必须走文件方案。3. 永久路由的正确落点route-interface 文件与 nmcli 激活3.1 /etc/rc.local 和 static-routes 为什么都不靠谱CentOS 6 时代不少人把route add命令写进/etc/rc.local指望开机自动执行CentOS 7 上这个做法基本是徒劳的。一方面/etc/rc.local本身需要可执行权限而且在系统启动流程里执行得比较晚这时候 NetworkManager 可能已经把网卡拉起并重置过路由了另一方面 CentOS 7 的路由配置归属到网络服务生命周期内命令执行得再快也扛不住网络服务重启。RHEL 7 官方文档里已经不提/etc/sysconfig/static-routes这个文件了我在测试环境里试过写上之后重启完全不生效。至于/etc/sysconfig/network它只提供全局默认网关GATEWAYip address和 CentOS 6 语法一样但没法写多条静态路由。想要让静态路由永久生效正确落点是/etc/sysconfig/network-scripts/route-接口名文件每个接口一个文件机器启动或网卡重新激活时自动加载。3.2 route-enp0s3 的语法与字段以刚才的 enp0s3 为例添加永久路由要建一个route-enp0s3文件[rootcentos7 ~]# vi /etc/sysconfig/network-scripts/route-enp0s3 10.15.150.0/24 via 192.168.150.253 dev enp0s3 10.25.250.0/24 via 192.168.150.253 dev enp0s3每一行就是一条静态路由格式与ip route add完全一致。文件命名必须和对应的ifcfg-enp0s3配对route-enp0s3对应 enp0s3 网卡route-eth0对应 eth0 网卡。文件名写错NetworkManager 加载连接配置时根本不会读取这也是改完配置不生效的一大原因。下面这张表是文件里路由字段的说明直接照着写就行字段含义示例目标网络要去的目的网段10.15.150.0/24via下一跳网关192.168.150.253dev出口网卡enp0s3注意如果机器上有多条静态路由可以在这个文件里写多行顺序不影响加载结果。写完之后重启计算机或者重新启用对应网络设备才能生效。我一般不会为了加路由去重启整台机器生产环境里更稳妥的做法是重新加载网络服务或通过 NetworkManager 重新连接设备。3.3 用 nmcli 重新加载为什么必须断开再连接最简单的生效方式是用nmcli让配置重新落到网卡上[rootcentos7 ~]# nmcli dev connect enp0s3但这里有个坑如果设备当前已经处于 connected 状态NetworkManager 可能认为连接没变化不会重新读取 route 文件。我在实验里遇到多次直接 connect 后路由没生效所以实际使用时推荐把断开和连接两个动作连起来执行[rootcentos7 ~]# nmcli dev disconnect enp0s3 nmcli dev connect enp0s3先断开再连接强制 NetworkManager 重新加载 enp0s3 对应的连接配置包括 route-enp0s3 里的路由条目。如果你的机器不是由 NetworkManager 管理而是传统的 network.service也可以执行systemctl restart network但这种方式会重启所有网络接口在线业务会闪断能用 nmcli 就用 nmcli。提示执行 disconnect 的时候和该网卡相关的连接会全部断开如果你是通过 SSH 远程操作的务必要确保管理网卡没有被断开否则你就需要去机房按电源键了。4. 多网卡默认网关冲突GATEWAY 优先级与 dhcp 的锅4.1 一个容易误判的现象静态路由配好、ping 也通了结果重启之后默认路由不在预期网卡上这种问题在多网卡机器上非常常见。现象是执行ip route show看到默认路由的dev字段不是主营网卡有时是 eth0 有时是 eth1外网流量跟着随机跳时通时断甚至 ping 不通百度。表面看像路由器问题实际是系统里出现了两个默认路由内核不知道该把流量交给谁。这个坑我在测试环境里翻车过。当时一台机器有两张网卡第一张 ifcfg-eth0 里手工配了GATEWAY0192.168.150.254第二张 ifcfg-eth1 用的 DHCPDHCP 服务器下发的 option 3 里也带了默认网关。结果启动时两张网卡各写入一条 default 路由系统启动顺序稍有变化默认路由的优先生效方就跟着变。4.2 根因有两层第一层是配置覆盖关系。CentOS 7 里/etc/sysconfig/network的全局GATEWAY是兜底方案只要任意一张网卡的ifcfg-*文件里写了 GATEWAY它就会优先于全局配置被采用这就是正文里提到的GATEWAY0 会覆盖 /etc/sysconfig/network 定义的全局默认网关。更微妙的是ifcfg-*里可以写多个 GATEWAY第一个是 GATEWAY0然后是 GATEWAY1、GATEWAY2实际生效的是尾号最大的那个。比如同时写了GATEWAY0192.168.150.254和GATEWAY1192.168.150.253最终默认网关取后者。第二层是 DHCP 带来的隐性网关。ifcfg-eth1 只要是 BOOTPROTOdhcp且 DHCP 服务器下发了网关NetworkManager 就会顺手把它写进路由表。两个默认路由并存时系统不会智能剔除一个而是都留着重启后谁先被内核处理默认路由就是谁。生产系统一般不会让业务网卡用 DHCP即便用了也会严格控制 DHCP 服务器下发参数防止网关冲突。4.3 生产环境的规避方式要避免默认网关打架我的习惯是三条规则第一静态 IP 网卡只保留一个网关来源要么写在主营网卡的 ifcfg 文件里要么写在 /etc/sysconfig/network 里二者取其一第二DHCP 网卡如果只是用来接入业务网、不需要出公网就在 ifcfg-eth1 里加一行DEFROUTEno明确告诉 NetworkManager 别给这张卡生成默认路由第三服务器交付前用ip route show检查 default 路由只有一条如果出现两条优先排查哪张网卡又拿到了网关。针对正文里说的第二现象实际排查时还要注意连接配置文件的命名。网卡设备名从 enp0s3 改成 eth0 后不只是 ifcfg 文件要改名route-enp0s3 也必须同步改成 route-eth0否则旧的永久路由配置文件不会被加载。这些都是交付前检查清单里容易漏掉的项目。5. 静态路由避坑与排查五条真实记录与命令组合5.1 五条踩坑记录1. 路由已经生效但 ip route show 里看不到。现象ping 目标网段能通查看路由表却找不到对应条目。原因NetworkManager 把连接配置加载到了实际网络中但路由视图没有同步刷新我在实验里遇到过好几次重启后才稳定显示。解决先断开再连接网卡nmcli dev disconnect enp0s3 nmcli dev connect enp0s3还不行就重启网络服务或 reboot。2. 多网卡默认路由随机走。现象重启后 default 路由的 dev 字段在 eth0 和 eth1 之间跳动外网时通时断。原因ifcfg-eth0 里的 GATEWAY0 和 ifcfg-eth1 通过 DHCP 拿到的网关并存两个默认路由抢位置。解决去掉其中一个网关来源DHCP 网卡加DEFROUTEno确保默认路由只保留一条。3. 永久路由配了重启后还是没生效。现象route-enp0s3 文件写得没问题手工ip route add也能通就是重启后路由消失。原因最常见的是网卡设备名对不上比如 ifcfg 已经改名为 eth0route 文件还叫 route-enp0s3。解决确认接口名把 route 文件改成 route-eth0或者反过来统一用 enp0s3 命名。4. 改了永久路由想立即生效直接 connect 没用。现象nmcli dev connect enp0s3执行完新路由没出现在表里。原因网卡已经处于 connected 状态NetworkManager 不认为配置有变化不重新加载连接。解决先用nmcli dev disconnect enp0s3断开再 connect两个命令一起执行中间不要加延时。5. ifcfg 里写了多个 GATEWAY生效的不是你以为的那个。现象明明写了GATEWAY0192.168.150.254默认链路却走 192.168.150.253。原因ifcfg 文件支持 GATEWAY0、GATEWAY1、GATEWAY2 多个条目尾号最大的生效不是第一个。解决如果只有一个网关就只保留 GATEWAY0如果需要多网关场景仔细核对编号别让旧配置残留。5.2 排查命令组合遇到静态路由问题我习惯按顺序看三个信息。第一个是ip route show确认当前表里有哪些路由、default 走了哪个 dev、目标网段有没有进去第二个是ip route get ip比如ip route get 10.15.150.1这个命令能直接告诉我们去某个具体 IP 时数据包实际走哪条路径比盯着路由表猜快得多第三个是nmcli dev show enp0s3看网卡当前的实际配置和连接状态判断 NetworkManager 认为这张卡处于什么状态。三个输出互相印证基本能定位九成问题。[rootcentos7 ~]# ip route show | column -t [rootcentos7 ~]# ip route get 10.15.150.1 [rootcentos7 ~]# nmcli dev show enp0s3 | grep ROUTEip route get适合验证“路由表里有的规则是否真的应用到了数据包”它的输出会显示via和dev一眼就能看出流量是不是按预期走。如果ip route show里没有目标网段条目但流量已经能通就从 NetworkManager 的配置文件状态去查重点确认 route-接口文件是否存在、命名是否正确。6. 验证静态路由生效一套四步检查法静态路由这活儿最怕的不是配置写错而是配完当时看着通了一重启就翻车。所以我每次在 CentOS 7 上做完路由调整都会强制走一遍四步检查法先临时验证再写永久配置再重载验证最后重启确认。# 第一步临时路由验证连通性 ip route add 10.25.250.0/24 via 192.168.150.253 dev enp0s3 ping -c 3 10.25.250.1 # 第二步写入永久配置文件 echo 10.25.250.0/24 via 192.168.150.253 dev enp0s3 /etc/sysconfig/network-scripts/route-enp0s3 # 第三步删除临时路由强制重新加载配置 ip route del 10.25.250.0/24 nmcli dev disconnect enp0s3 nmcli dev connect enp0s3 ip route show | grep 10.25.250 # 第四步重启后再查一次 reboot ip route show | grep 10.25.250第一步先用临时路由做连通性测试确认目标网段的下一跳和出口网卡是对的再进第二步写文件写完后第三步把临时路由删掉然后 nmcli 断开重连让永久配置接管如果第三步查表能看到条目重启后的第四步基本也不会跑偏。这套逻辑的关键点是第三步不能省如果临时路由还留着你会以为永久配置生效了实际是临时路由在扛着这就是最常见的假成功。这套流程我翻过不只一次车没验证临时路由就直接写配置结果重启后目标网段断连回头一查发现是下一跳写错。后来我养成习惯每次给 CentOS 7 加静态路由之前强制先走一遍四步检查宁可多花三分钟也不赌一把。这套操作要点我也整理成了可下载的配置笔记放到需要时对照着敲能少踩不少坑。希望帮到你。本文还有配套的精品资源点击获取