ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Centos7静态路由配置:临时命令与持久化方案避坑指南

Centos7静态路由配置:临时命令与持久化方案避坑指南 简介一份聚焦CentOS7静态路由配置的PDF技术资料主要面向Linux系统运维人员、网络管理员以及需要精确控制流量走向的服务器维护者。内容系统梳理了ip route show、add、del等常用命令并以实际命令输出展示添加、验证和删除路由的过程同时说明了如何用ping连通性测试确认路由生效重点解答“永久路由”问题旧版static-routes文件在CentOS7已无效应编辑/etc/sysconfig/network-scripts/route-接口文件每条路由单独一行再用systemctl restart network或nmcli重新加载。针对多网卡环境中默认网关冲突、ifcfg文件GATEWAY0与全局网关优先级、连接配置文件改名后route文件需同步改名、路由重启后消失等复杂情况资料也给出了清晰的排错思路和实际经验。压缩包内共1个PDF文档约57KB内容精炼、开卷即用单文件也便于随时查阅。已有6564人浏览下载适合希望快速掌握CentOS7临时与永久静态路由配置的读者尤其适合需要保障路由重启不失效的运维场景。1. Centos7 添加静态路由一条命令能通重启就翻车的真相Centos7 里添加静态路由最常见的画面是敲一条route addping 通了关窗口等下次重启就连不上了。不是命令错了而是你只做了临时路由没做持久化。静态路由解决的是多网段互通问题——默认网关只管把报文送到互联网内网特定网段必须人工指定下一跳。这台机器的运维、网络工程师以及在 VMware 里做网络实验的人最容易碰到临时通、重启丢的翻车现场。这篇笔记按先懂路由表、再用 ip route、再写配置文件、最后排错验证展开给你一套能落地的 Centos7 静态路由方案。2. 先分清临时路由和持久化路由命令选不对后面全是坑2.1 三种主流方式route add、ip route add、配置文件Centos7 里添加静态路由绕不开三条路route命令、ip route命令、写入配置文件。它们之间不是简单的同功能不同写法背后是两代网络工具集的差别也会直接决定路由在重启后还在不在。route来自 net-tools是老牌命令适合临时看一眼路由表和快速做实验ip route来自 iproute2从 Centos7 开始就是系统自带的标准工具能覆盖路由表、策略路由、metric、src 等细节配置文件则是把路由写进/etc/sysconfig/network-scripts/route-ethX由 ifup 脚本在启用网卡时自动加载这才是真正能让路由在重启后重新出现的做法。方式重启后是否保留适合场景我一般怎么用route add / del不保留临时调试、快速验证只在排查时用ip route add / del不保留需要精确指定网卡和源地址临时路由的首选route-ethX 文件保留需要永久生效正式配置的唯一落点rc.local / systemd保留排除 NetworkManager 搅局的场景兜底方案这里多提醒一句不要以为能 ping 通就代表路由持久化了临时命令只在内存里重启后内存清空路由自然消失。真正要交付给一台 Centos7 服务器最稳妥的组合就是先用ip route验证下一跳和网段对不对再把它原样写进route-ethX然后重启验证。2.2 路由表先看懂这几列Destination、Gateway、Genmask、Iface不管是看路由还是改路由先要能看懂路由表。我一般会route -n和ip route两个命令都跑一遍不是为了对比而是它们输出格式不同能看到的信息不完全一样。# 查看传统格式路由表 route -n # 查看 ip 命令格式路由表 ip route showroute -n的输出大致是这样Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0 10.10.10.0 192.168.1.254 255.255.255.0 UG 100 0 0 eth1 172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0Destination 是目标网段Gateway 是下一跳地址Genmask 是子网掩码Iface 是出口网卡。Flags 里的 U 表示该路由可用G 表示需要网关转发。ip route show的输出更直观它会把掩码和网段直接合成 CIDR 格式比如10.10.10.0/24 via 192.168.1.254 dev eth1。理解这几个字段的关键是当系统要发一个包时会先查路由表找最长匹配的 Destination。发往 10.10.10.8 的包会命中第二条而不是默认路由发往 172.16.3.4 的包命中第三条它前面没有 Gateway说明目标是本机直连网段直接走 eth0 就能送到。所谓添加静态路由本质就是往这张表里插入一条目标网段、下一跳、出口网卡的映射。2.3 为什么我更推荐 ip route 而不是 route add如果你是照着老教程在 Centos7 上敲route add -net ... gw ...大多数情况能通但这不是我推荐的方式。理由有三个第一net-tools 在 Centos7 里已经进入维护期Centos8/9 默认不装了你以后写脚本没法拿它当唯一依赖第二route 命令对多网卡、多路由优先级、策略路由的支持很弱很多参数靠猜第三ip route的改造成本低同样的下一跳命令写起来差不多但可定制性强很多。举个例子Centos7 服务器常见多网卡一个连办公网一个连生产网。用 route 指向生产网段时经常遇到目标网段能通但源地址总变成另一个网卡地址的问题排查起来非常玄学。用ip route加一个src参数指定源地址一条命令就能固定下来。下面章节里统一用ip route演示这不是炫技是希望你不论做临时验证还是写脚本最后落地的都是同一套命令语法不至于两套工具来回切。提示检查一台机器装没装 net-tools直接敲route -n如果提示 command not found说明系统里大概率只有 iproute2。Centos7 最小化安装一般不带 net-tools需要yum install -y net-tools才能用 route。3. 用 ip route 添加临时静态路由最小命令与必调参数3.1 添加网段路由和主机路由一个 / 一个 /32临时静态路由最常用的是网段路由。比如服务器在 192.168.1.0/24 网段要访问 10.10.10.0/24 的存储网下一跳是 192.168.1.254命令就一句话# 添加一个网段路由/24 是目标网段掩码 ip route add 10.10.10.0/24 via 192.168.1.254 dev eth0这条命令的意思很直白去 10.10.10.0/24 的报文都交给网关 192.168.1.254从 eth0 送出去。via指定下一跳dev指定出口网卡两个都是常用参数。在某些简单网络里只写via不加dev也能通过因为系统会从路由表里自己推算出口但我的建议是永远显式写dev后面避坑章会讲为什么。如果你想给单台机器加路由比如某个独立 IP 10.200.1.19 不经过默认网关需要单独走一条线路用/32# 主机路由目标是一个具体 IP ip route add 10.200.1.19/32 via 172.16.1.1 dev eth1网段路由和主机路由的区别只在掩码长短。写路由时记住一个原则抑制表项的覆盖范围越精确的路由优先级越高。同一目标网段如果有两条可用路由内核会优先选 prefix 更长的这就是最长前缀匹配。3.2 多网卡环境必须写 dev不写不一定错写了才能躲过玄学在多网卡服务器上dev不只是可选项。下面这段是我踩过的坑一台双网卡 Centos7eth0 是 10.0.0.2/24eth1 是 192.168.1.2/24我想去 192.168.2.0/24下一跳是 192.168.1.254。只敲# 不指定 dev让系统自己选出口 ip route add 192.168.2.0/24 via 192.168.1.254系统会怎么选它会从已有路由里找哪个网卡的地址能到达 192.168.1.254然后自动把它放在 eth1 上。这通常没问题但一旦两个网卡的地址互相可达或者开了策略路由系统选的出口可能不是你想的那个。更隐蔽的问题是源地址。发往 192.168.2.0/24 的包如果没指定源地址内核会按出口网卡的主 IP 作为源。如果你配了多个网卡、多个 IP报文可能带着 10.0.0.2 的源地址从 eth0 出去对端一看源不在预期网段直接丢包。所以稳妥写法是把src也带上# 同时指定出口网卡和源地址避免对端丢包 ip route add 192.168.2.0/24 via 192.168.1.254 dev eth1 src 192.168.1.2src在这里的意思是从本机发往 192.168.2.0/24 的包统一使用 192.168.1.2 作为源IP。这个参数在对接需要精确源地址的网络设备防火墙、业务系统白名单时尤为重要。3.3 用 metric 控制多网关优先级同网段两条路由怎么加有时同一个目标网段有两个可用网关一个主用、一个备用或者链路负载分担。Linux 允许添加两条相同目标的路由但要配上不同的 metric。Metric 值越小优先级越高。# 到 10.0.0.0/8 有两条链路默认走 192.168.1.1备选走 192.168.2.1 ip route add 10.0.0.0/8 via 192.168.1.1 dev eth0 metric 100 ip route add 10.0.0.0/8 via 192.168.2.1 dev eth1 metric 200内核处理相同前缀的两条路由不是简单取最小的 metric 就不管另一条了。它会把两条都放进路由表分别计算权重实际流量可能同时使用两个网关。如果只想主备需要在第一条可达时完全不使用第二条那就涉及到策略路由和 failover 机制临时静态路由解决不了全部问题。metric也可以用在默认路由上。有些环境下配置 DHCP 拿到的默认网关是 eth0你又希望 eth1 的网关优先可以在默认路由上做文章。用ip route add 0.0.0.0/0 via 网关 dev 网卡 metric 数字添加一条新默认路由较低 metric 会成为首选。默认网关的冲突在 Centos7 上很常见后面避坑章单独说。3.4 改和删replace 是后悔药del 要精准临时路由改起来很方便。想修改一条已存在的路由不用先删再加直接 replace 即可# 如果存在 10.0.0.0/8 路由就替换为新的下一跳 ip route replace 10.0.0.0/8 via 192.168.3.1 dev eth0删除路由用ip route del最好把下一跳和网卡带全避免删错。否则当存在两条相似路由时内核可能删掉第一条匹配项而不是你心里想的那条。# 删除刚才的路由参数要和添加时一致 ip route del 10.0.0.0/8 via 192.168.1.1 dev eth0临时路由的作用是验证先临时加测试通达性确认无误后再写进配置文件。整个过程不会留残留重启自动清空。如果你在测试时发现路由表多了一堆半清不楚的条目可以用ip route flush清掉全部路由但这一命令也会把默认路由冲掉会导致网络暂时断开谨慎使用。我一般只在网络坏透了、打算整个重配时才 flush。提示添加临时路由后立刻验证用ip route get 10.0.0.8它会告诉你系统实际选择的路由、下一跳和源地址。这条命令比ip route show更有用几乎是静态路由排错的第一神器。4. 把静态路由永久化route-ethX 文件、rc.local 与 nmcli 姿势4.1 网卡关联文件 route-ethX持久化路由的标准落点临时路由验证通过后把它写进配置文件才算完成一次添加静态路由。Centos7 的网络配置文件沿用/etc/sysconfig/network-scripts/结构静态路由遵循一个约定网卡 eth0 的路由写进/etc/sysconfig/network-scripts/route-eth0eth1 的路由写进route-eth1。文件里写的内容就是 ip route 命令的持久化版本。# 编辑 eth0 的路由配置文件 vim /etc/sysconfig/network-scripts/route-eth0文件内容示例# 到存储网 10.10.10.0/24走网关 192.168.1.254从 eth0 出去 10.10.10.0/24 via 192.168.1.254 dev eth0 # 到备份网 172.16.0.0/16走网关 172.16.1.1从 eth0 出去 172.16.0.0/16 via 172.16.1.1 dev eth0这个文件的格式非常像 ip route 命令CIDR 网段 via 下一跳 dev 网卡名一行一条。ifup 脚本在拉起 eth0 时会读取这个文件把每一行执行成一条静态路由。用 dev 指定出口是因为 route-ethX 文件本身只负责单一网卡但保险起见写上不会有坏处。老教程里还会有一种四段式写法用ADDRESS010.10.10.0NETMASK0255.255.255.0GATEWAY0192.168.1.254表示这是较早版本兼容的格式。Centos7 的实际环境中两种都支持但我建议只用 CIDR 格式理由只有一个一眼能看出网段边界不会因为 255.255.255.0 写成 255.255.255 之类的手误造成奇葩路由。如果同一台服务器上两种格式混用可能会出现部分配置不加载的怪象避免混用是最稳的。4.2 重启网络与重启系统后验证生效别急着关终端写完 route-ethX 后要让配置生效有两种做法重启网络服务或重启系统。Centos7 老一套的重启命令是systemctl restart network但如果机器默认启用了 NetworkManager两者可能互相干扰这点后面避坑章详细说。# 重启 network 服务加载 route-eth0 systemctl restart network # 确认路由是否进入路由表 ip route show # 更直接地看某个目标IP走哪条路 ip route get 10.10.10.8验证时要注意重启 network 服务会短暂断网如果你是通过 SSH 连上去的建议在一条命令里完成重启 挂后台验证或者确保机器的 console 可用。否则路由没对网络起不来你连不回去只能跑到机房那才是真翻车。# 直达验证三连重启服务、查路由、查目标路径 systemctl restart network sleep 3 ip route show ip route get 10.10.10.8这条命令会依次重启网络、等三秒、显示全部路由、再单独看 10.10.10.8 应该走哪条路。输出里如果有期望的via 192.168.1.254 dev eth0说明配置生效了。如果路由没出现优先排查 route-ethX 文件名是否对应实际网卡再确认 network 服务是否真的重新读取了配置。4.3 NetworkManager 会吃掉 route-ethX绕开冲突的三个姿势Centos7 的默认网络管理在桌面和最小化之间的差异很折磨人。桌面版默认启用 NetworkManager最小化服务器用network.service管理。如果你装了桌面版又手动在 route-eth0 里加了路由重启网络后经常发现路由没生效——不是因为你写错了而是 NetworkManager 接管了 eth0它不认识 route-eth0会按自己的连接配置重新生成网络。解决姿势有三种。第一种最干脆不用 NetworkManager使用传统的 network 脚本管理# 停用并禁用 NetworkManager改用 network systemctl stop NetworkManager systemctl disable NetworkManager # 启动传统网络服务确认它是开机自启 systemctl start network systemctl enable network前提是你的网络环境用不到 NetworkManager 的高级功能802.1x、动态配置切换、诊断工具机房服务器通常没问题。第二种是保留 NetworkManager把静态路由加进连接的配置里# 给 eth0 连接追加一条静态路由 nmcli connection modify eth0 ipv4.routes 10.10.10.0/24 192.168.1.254 # 重新加载连接 nmcli connection up eth0这条命令让 NetworkManager 自己管理路由route-eth0 文件可以不用。第三种是把路由写进/etc/rc.local它不属于任何网络管理器开机时总会执行一次适合作为兜底。但要注意 Centos7 的/etc/rc.local对应的是/etc/rc.d/rc.local文件本身需要有可执行权限否则只会被 systemd 跳过。我一般会在三种方案里优先选第一种因为最简单直接管理服务器的运维心智负担最小。4.4 多条路由同一网卡和多网卡路由的编排顺序如果一台 Centos7 上有多个网卡或者一个网卡要配多条静态路由route-eth0、route-eth1 分开写没问题文件之间没有顺序要求。但如果两条路由是到同一个目标网段的注意 metric 是可用的# route-eth0 中给同一网段配置主备路由 10.10.10.0/24 via 192.168.1.254 dev eth0 metric 100 10.10.10.0/24 via 192.168.2.254 dev eth1 metric 200这种写法只在双网卡都启用时才会形成主备效果。如果 eth1 没起来后一行不会被加载不影响主路由如果 eth0 没起来反过来也一样。需要特别注意的是route-ethX 文件依赖对应网卡被 ifup 读取如果网卡没开机启动文件里的路由自然也不会加载这和 rc.local 的执行机制有本质区别。5. Centos7 添加静态路由避坑与排查重启失效、ping 不通、多网卡冲突一次说清5.1 重启后路由消失chmod x 和 NetworkManager 是最常见元凶现象用ip route add测试一遍通了为了持久化把命令写进/etc/rc.local重启后路由消失ip route里什么都没看到。原因Centos7 的/etc/rc.local和/etc/rc.d/rc.local是同一个文件的符号链接但 systemd 默认只把它当作普通脚本入口要求文件必须具备可执行权限。很多教程只让你添加命令没说chmod x /etc/rc.d/rc.local于是开机时文件被跳过命令根本没执行。另一部分环境则是因为 NetworkManager 在网络服务起来后把自己的配置重新加载了一遍覆盖了 rc.local 下通过命令添加的路由。解决先给 rc.local 执行权限再观察路由是否存在# 确认 rc.local 是否可执行 ls -l /etc/rc.d/rc.local # 补上执行权限 chmod x /etc/rc.d/rc.local # 重启后再验证 reboot ip route show如果补完权限还是丢再用systemctl status NetworkManager看它是否接管了网卡。静态路由在这种环境下最靠谱的归宿是 route-ethX 文件而不是 rc.local。如果实在要用 rc.local建议在命令前加sleep 10但这不是根治不如直接用原生配置。5.2 路由表里有路由但 ping 不通三大原因按顺序查现象ip route get 10.0.0.8显示有对应路由ping 10.0.0.8却一直丢包有时候还提示 Network is unreachable。原因和排查顺序很重要。第一检查下一跳可达性本机 ping 不通下一跳网关那路由再正确也没意义。第二检查 IP 转发是否开启静态路由的下一跳往往不是本机直连目标网段的网关你发送的报文需要这台 Centos7 帮转发而net.ipv4.ip_forward默认是 0需要开启。第三检查防火墙是否拦截了 forwarded 流量。# 1. 确认下一跳可达 ping -c 3 192.168.1.254 # 2. 检查本机 IP 转发 sysctl net.ipv4.ip_forward # 如果为 0临时开启 sysctl -w net.ipv4.ip_forward1 # 永久开启 echo net.ipv4.ip_forward 1 /etc/sysctl.conf # 3. 查看防火墙是否放行转发 firewall-cmd --state iptables -L FORWARD -n --line-numbers防火墙这一步经常被忽略。Centos7 默认虽然有 firewalld但对 FORWARD 链的处理让人头大尤其是你刚给 eth1 加了静态路由从 eth0 进来的流量要转发到 eth1firewalld 默认可能只放行本地流量转发流量会被丢。常见做法是给目标网段放行或者直接firewall-cmd --permanent --add-rich-rulerule familyipv4 source address10.0.0.0/8 accept但安全要求高的环境不建议为了一点便利全放行得按业务网段收敛。5.3 VMware 双网卡环境为什么默认路由总是被抢现象VMware 里装多块虚拟网卡NAT 和桥接混用静态路由测试没问题一打开另一个虚拟网卡默认路由就变成了 NAT 侧生产网段又不通了。原因VMware 的 NAT 网卡通常会把 192.168.x.x 作为网关DHCP 下发默认路由另一个桥接网卡可能也有默认路由。两个网卡同时启用时各自的 DHCP 都会试图设置默认路由内核默认按 metric 优先但两个网关的 metric 可能相同或由 DHCP 随机分配于是默认路由反复横跳。静态路由本身没丢但默认路由被抢影响了对外访问。解决给静态路由和默认路由都设 metric并保持 NetworkManager/network 不重复下发。# 查看当前默认路由 ip route show default # 手动调整默认路由优先级bridge 网关设为更低 metric ip route replace default via 192.168.1.1 dev eth0 metric 100 ip route replace default via 192.168.2.1 dev eth1 metric 200 # 给目标网段路由加 metric确保不被默认路由干扰 ip route add 10.0.0.0/8 via 192.168.1.1 dev eth0 metric 50如果 DHCP 总是在启动时把默认路由加回来可以在/etc/sysconfig/network-scripts/ifcfg-eth1中加METRIC200或者用DEFROUTEno禁止某网卡携带默认路由。这个组合拳能解决大多数 VMware 网卡冲突问题。另外要留意 VMware 里虚拟机设置中的虚拟网络编辑器把现网段和虚拟机网段规划好别让多个自定义 VMnet 网段重叠否则路由表会出现更多玄学。5.4 route-ethX 文件低级错误语法、复用、多网卡文件对应现象照着写/etc/sysconfig/network-scripts/route-eth0重启后路由没加载systemctl restart network报错或者 ifup 日志里出现 route-eth0 解析失败。原因最常见的是混用了旧格式和新格式或者在 via 和 dev 之间多了奇怪的引号。还有一个常见错误是复制了别人的配置但文件叫 route-eth0机器上实际网卡名不叫 eth0而是 ens192。Centos7 从 7 开始网卡命名机制就变了新机器可能叫 ens192 或 ens160不看实际 IP 直接套 eth0 会全部落空。解决写文件前先确认网卡名# 查看本机真实网卡名和 IP ip addr show # 用真实网卡名创建路由文件比如 ens160 vim /etc/sysconfig/network-scripts/route-ens160内容再强调一遍当前主流的 CIDR 格式192.168.100.0/24 via 10.0.0.1 dev ens160 10.0.0.0/8 via 10.0.0.254 dev ens160写完跑一次systemctl restart network然后立刻ip route show看有没有报错。如果 network 服务报错说 Failed to bring up eth0大概率是文件里有非 UTF-8 字符或者某行少了 via。把文件逐行用cat -A看一下能看见行尾符差异Windows 编辑过的文件经常会有\r干扰。还有一点route-ethX 文件名中的网卡不能是虚拟子接口eth0:1 之类子接口路由要写到主网卡或直接走策略路由这个坑不大但遇上了很耗时间。5.5 修改静态路由后不重新生效回滚和备份的心智习惯现象静态路由加进去后发现下一跳配错了改 route-ethX然后systemctl restart network但路由表里的老路由还在新路由没进。原因systemctl restart network会调用 ifdown/ifup理论上会清除旧路由再重新加载。但如果 NetworkManager 也参与管理可能在 ifup 之后又把自己的路由表拼回来造成新旧叠加。另一种情况是 eth0 接口异常ifdown 失败导致 route-ethX 没被重新解析。解决先把当前运行配置备份下来再清理再加载# 备份当前路由和网卡配置文件 cp /etc/sysconfig/network-scripts/ifcfg-eth0 /root/ifcfg-eth0.bak ip route save /root/route-table.bak # 显式重启网卡让 route-ethX 生效 ifdown eth0 ifup eth0 # 确认路由 ip route show如果方便重启直接systemctl restart network通常就够了。但如果发现路由表有两个一样的目标网段一个旧下一跳一个新下一跳最干脆的办法是ip route flush后把期望的路由表重新加载一遍或者干脆重启服务器让加载顺序从头开始。运维里最忌讳的是在路由表残留旧路由的情况下反复ip route replace一旦网关不可达流量会在一段时间内断续业务抱怨可比你排查麻烦多了。6. 验证静态路由生效的三种方法与一个小技巧先看路径再跟链路最后盯规则静态路由配好之后我的验证顺序是三步ip route get、traceroute -n、ip rule show。ip route get 10.10.10.8会告诉你系统认为这个目标应该走哪条路源地址是什么只要输出里的 via 和 dev 和预期一致路由表这层就算通过了。然后traceroute -n -i eth0 10.10.10.8会把每一跳的真实路径照出来如果第一跳就是你的网关后面能延伸过去说明转发链路没问题。最后ip rule show是用来防策略路由的Centos7 有时在路由表之外还有优先级规则一旦规则列表里出现高优先级的表指向别的路由表即便主路由表写对了也可能不命中。还有个我更愿意保留的小技巧把重要路由的检查写成一个脚本放到定时任务里一旦路由丢失自动加回来。脚本可以很简单#!/bin/bash # 检查 10.10.10.0/24 是否有路由没有就添加 ip route show | grep -q 10.10.10.0/24 || \ ip route add 10.10.10.0/24 via 192.168.1.254 dev eth0crontab 每五分钟跑一次虽然看起来有点笨但对那些被 NetworkManager 反复干扰的网络环境是个实用的后悔药。我自己的血泪经验是在 VMware 里搭实验环境时只顾着敲临时 route 验证通没通没有写 route-ethX结果第二天整个环境重启业务网全部不通查了半天才发现是路由丢了。从那以后任何静态路由都先临时验证再直接落配置文件最后重启一次确认绝不跳过。这个流程看起来多花五分钟但省掉的排查时间可能是一下午。希望帮到你。本文还有配套的精品资源点击获取
返回列表