简介:这份PDF资料面向CentOS 7服务器运维人员与Linux网络初学者,聚焦静态路由的配置与管理,帮助读者精确控制流量走向、解决多网段互通问题。内容围绕ip route命令展开,涵盖路由表查看、静态路由的添加与删除,并重点讲解如何将路由写入route-interface配置文件实现重启后依然生效,同时涉及nmcli设备重连、多网卡默认网关冲突等排错思路。资源包为1个PDF文件,大小约57KB,篇幅精炼、命令与示例输出对照清晰,便于随查随用。目前已有6564人学习下载,适合需要快速掌握CentOS 7永久静态路由配置、对照实验环境查漏补缺的运维人员参考。
1. Centos7 添加静态路由:为什么临时命令重启就丢,怎么让它活过重启
机房里有台 CentOS 7 的业务机,双网卡,一块走内网办公段,一块走专线到数据库。某天运维重启了一次网络服务,业务直接断了——ip route add加的那条路由没了。这不是玄学,是很多人第一次在 CentOS 7 上配静态路由时都会踩的坑:命令行加的路由只存在于内核运行态,systemctl restart network或者重启机器,它就被清得干干净净。
CentOS 7 添加静态路由这件事,表面看就是一条ip route命令,实际要解决的是三件事:路由加在哪张网卡上、用什么方式持久化、以及怎么验证它真的生效而不是被别的规则覆盖。它适合所有还在维护 CentOS 7 的运维和开发——尤其是那些机器不能随便升级、网络拓扑又比单网卡复杂的环境。下面按「先跑通临时路由 → 再做持久化 → 再排错」的顺序讲,命令都能直接抄。
2. 先分清临时路由和永久路由:ip route 与 route 命令的取舍
2.1 两条命令的差别,以及为什么现在优先用 ip route
CentOS 7 里能加路由的命令有两套。一套是老牌的route,来自 net-tools 包;另一套是ip route,来自 iproute 包。CentOS 7 默认最小化安装时,net-tools 可能根本没装,route命令直接报 command not found,而ip命令是随内核工具链一起的,基本都在。
从功能上说,route add -net 10.10.0.0/16 gw 192.168.1.1和ip route add 10.10.0.0/16 via 192.168.1.1效果一样,但ip route的表达更统一:网段、下一跳、出接口、metric 都能在一行里写清楚,而且它和内核里实际的路由表结构是对应的。老route命令在输出格式上做了层包装,排查问题时反而多一层转换。
我一般会直接上ip route,理由很实际:CentOS 7 的持久化配置文件/etc/sysconfig/network-scripts/route-<网卡名>里写的语法,和ip route的写法是对得上的,临时命令和永久配置用同一套语法,脑子不用来回切。
先看临时加一条路由长什么样:
# 添加到 10.10.0.0/16 网段的路由,下一跳是 192.168.1.1 ip route add 10.10.0.0/16 via 192.168.1.1 # 指定从 eth1 这块网卡出去(多网卡环境建议带上 dev) ip route add 10.10.0.0/16 via 192.168.1.1 dev eth1 # 查看是否加成功 ip route show逻辑说明:ip route add把条目写进内核的主路由表,via后面是下一跳网关地址,dev指定出接口。参数上,10.10.0.0/16是目标网段,掩码位数不能省;via的地址必须和本机某块网卡在同一网段,否则内核会报Nexthop has invalid gateway。多网卡机器上如果不写dev,内核可能选错出口,尤其是两块网卡网关都在同一段的时候。
2.2 临时路由的验证和它的寿命
加完不能只看命令没报错就完事,得确认它真的进了路由表并且能走通:
# 精确查这条路由 ip route get 10.10.1.5 # 看完整路由表,确认条目和 metric ip route show # 实际连通性测试 ping -c 3 10.10.1.5 traceroute -n 10.10.1.5ip route get是最有用的一个,它会告诉你内核针对某个目标地址最终选了哪条路由、从哪个接口出、源地址是谁。如果输出里via不是你刚配的网关,说明有另一条更精确或 metric 更小的路由把它盖住了。
临时路由的寿命就到下一次网络栈重置为止。systemctl restart network、ifdown/ifup、重启机器,都会让内核路由表回到配置文件描述的状态。所以临时命令只适合调试和验证,真要长期生效,必须落到配置文件。这也是为什么很多人搜「centos7 无法 ping 通」时,明明手动加过路由还是不通——重启后路由早没了。
提示:调试阶段用临时命令快速试错,确认网关、网段、出接口都对之后,再写进配置文件,能少走很多弯路。
3. 永久静态路由的三种落地方式:route-网卡文件、rc.local 与 NetworkManager
3.1 用 route-<网卡名> 文件做标准持久化
CentOS 7 网络服务读取的持久化路由配置,放在/etc/sysconfig/network-scripts/目录下,文件名格式是route-<网卡名>。比如要给 eth1 加路由,就建route-eth1。这个文件有两种写法,推荐用「网段 + via」的格式,和ip route语法一致:
# 文件:/etc/sysconfig/network-scripts/route-eth1 # 格式一:目标网段 via 网关 10.10.0.0/16 via 192.168.1.1 # 如果要指定出接口,可以写成 10.20.0.0/16 via 192.168.1.1 dev eth1另一种是老的ADDRESS0/GATEWAY0编号格式:
# 文件:/etc/sysconfig/network-scripts/route-eth1 ADDRESS0=10.10.0.0 NETMASK0=255.255.0.0 GATEWAY0=192.168.1.1两种格式不要混在同一个文件里,网络服务解析时会出问题。编号格式每条路由要写三行,路由多了容易数错号;网段格式一行一条,可读性好,我一般用前者。
写完文件要让它生效,有两条路:重启网络服务,或者用ifup单独拉起这块网卡。
# 方式一:重启整个网络服务(会短暂断所有网卡,远程操作要小心) systemctl restart network # 方式二:只重载指定网卡(相对安全) ifdown eth1 && ifup eth1 # 验证 ip route show | grep 10.10参数说明:route-eth1里的eth1必须和ip addr里看到的网卡名完全一致,CentOS 7 默认的网卡命名可能是ens33、enp0s3这种,写错文件名网络服务根本不会读。另外via的网关必须在这块网卡的同网段内,否则ifup时会报错,路由加不上。
3.2 rc.local 方式:能用但不推荐
还有一种流传很广的做法,把ip route add写进/etc/rc.local,靠开机自启执行。CentOS 7 里rc.local默认没有执行权限,得先chmod +x /etc/rc.d/rc.local。
# 文件:/etc/rc.local #!/bin/bash ip route add 10.10.0.0/16 via 192.168.1.1 dev eth1这种方式的问题是执行时机。rc.local在网络服务完全就绪之前可能就跑了,网卡还没起来,ip route add会因为网关不可达而失败,而且失败是静默的,开机后你才发现路由没加上。另外它绕过了网络服务的统一管理,systemctl restart network之后 rc.local 加的路由不会自动恢复,得手动再跑一次。所以它只适合临时救急,不适合当标准方案。
3.3 NetworkManager 环境下的注意点
CentOS 7 默认装了 NetworkManager,但很多服务器实际用的是传统的 network 服务。两者同时管网络会打架。判断当前用哪个:
# 看 network 和 NetworkManager 谁在跑 systemctl status network systemctl status NetworkManager # 看网卡配置文件里有没有被 NM 接管 grep -i nm_controlled /etc/sysconfig/network-scripts/ifcfg-eth1如果ifcfg-eth1里有NM_CONTROLLED=yes,说明这块网卡归 NetworkManager 管,那route-eth1文件可能不生效,得用nmcli加路由:
# 给 eth1 连接加一条静态路由 nmcli connection modify eth1 +ipv4.routes "10.10.0.0/16 192.168.1.1" # 重新激活连接 nmcli connection up eth1 # 验证 ip route show参数说明:+ipv4.routes是追加,-ipv4.routes是删除,格式是「目标网段 下一跳」。如果连接名不叫 eth1,先用nmcli connection show查实际名字。我一般会把NM_CONTROLLED显式设成no,统一交给 network 服务管,避免两套系统互相覆盖配置。
注意:改网络配置前先确认自己有带外管理或者本地终端,远程 SSH 下重启网络一旦配错,连接直接断,没有后悔药。
4. 多网卡与策略路由:静态路由不生效时的排查思路
4.1 多网卡默认网关冲突
双网卡机器最常见的翻车场景:两块网卡都配了GATEWAY,系统里出现两条默认路由,内核只认 metric 小的那条,另一块网卡的回包可能从错误的接口出去,表现为「能 ping 通对方,对方 ping 不回你」或者「加了路由还是不通」。
先看默认路由有几条:
ip route show default如果出现两条default via ...,就要处理。要么在ifcfg-<网卡>里只给主网卡配GATEWAY,另一块不配;要么用 metric 明确优先级:
# 文件:/etc/sysconfig/network-scripts/ifcfg-eth0 GATEWAY=192.168.1.1 METRIC=100 # 文件:/etc/sysconfig/network-scripts/ifcfg-eth1 GATEWAY=192.168.2.1 METRIC=200metric 小的优先。这样默认路由只有一条生效,另一块网卡只走它自己的直连网段和静态路由。
4.2 用 ip rule 做策略路由
有些场景光靠主路由表不够。比如要求「去 10.10.0.0/16 的流量必须从 eth1 出,且源地址用 eth1 的 IP」,这时候需要策略路由,建一张独立的路由表:
# 在 rt_tables 里给自定义表起个名字 echo "100 rt_eth1" >> /etc/iproute2/rt_tables # 往自定义表里加路由 ip route add 10.10.0.0/16 via 192.168.1.1 dev eth1 table rt_eth1 ip route add default via 192.168.1.1 dev eth1 table rt_eth1 # 加规则:来自 eth1 网段的流量查 rt_eth1 表 ip rule add from 192.168.1.0/24 table rt_eth1 # 查看规则 ip rule show逻辑说明:ip rule决定「什么样的包查哪张表」,ip route ... table往指定表里写路由。默认所有包查 main 表,加了规则后,匹配from 192.168.1.0/24的包改查rt_eth1表。参数上,rt_tables里的编号 100 是自定义的,1 到 252 之间避开系统保留值即可。
策略路由的持久化比普通静态路由麻烦,ip rule和自定义表的路由不会自动写进route-<网卡>文件。常见做法是写成一个脚本,用 systemd 服务或者rc.local在开机后执行。这块要单独维护,别指望网络服务帮你记住。
4.3 排查路由不生效的固定动作
路由加了不通,按这个顺序查,基本能定位:
# 1. 确认路由条目在不在,metric 是多少 ip route show # 2. 确认内核针对目标地址实际选了哪条 ip route get 10.10.1.5 # 3. 确认出接口和源地址对不对 ip -s link show eth1 # 4. 确认网关可达 ping -c 2 192.168.1.1 # 5. 确认没被防火墙拦 iptables -L -n -v firewall-cmd --list-allip route get的输出里会带src字段,如果源地址是另一块网卡的 IP,对端可能因为反向路径检查把包丢了。CentOS 7 默认开了rp_filter,多网卡环境容易误伤:
# 查看 rp_filter 设置 sysctl net.ipv4.conf.all.rp_filter sysctl net.ipv4.conf.eth1.rp_filter # 临时关掉某块网卡的严格反向路径检查 sysctl -w net.ipv4.conf.eth1.rp_filter=2rp_filter取值 0 是关闭,1 是严格模式,2 是松散模式。多网卡非对称路由场景下,严格模式会把合法回包丢掉,改成 2 或者 0 能解决。永久生效要写进/etc/sysctl.d/下的配置文件,sysctl -w重启就没了。
提示:
ip route get是排查路由问题的第一命令,它直接告诉你内核的真实决策,比反复 ping 有效得多。
5. 避坑与常见问题:静态路由配了不通的五种典型情况
现象一:ip route add报Nexthop has invalid gateway。原因:via后面的网关地址和本机任何一块网卡都不在同一网段,内核认为这个下一跳不可达。 解决:先ip addr看网卡实际 IP 和掩码,确认网关确实在某个直连网段内。如果网关在别的网段,需要先有一条到那个网段的路由,或者改用dev直接指定出接口(点对点链路场景)。
现象二:route-eth1文件写了,重启网络后路由没出现。原因:文件名和网卡名不一致,或者文件权限、格式有问题,网络服务解析失败但没报明显错误。 解决:确认ip addr里的网卡名,文件名严格对应;检查文件里没有 Windows 换行符(file route-eth1看是不是 CRLF);用ifup eth1单独拉起并观察输出,有语法错误会打印出来。
现象三:路由在表里,ip route get也选对了,但 ping 不通。原因:防火墙拦了,或者对端没有回程路由,或者rp_filter把回包丢了。 解决:先在本地iptables -L -n和firewall-cmd --list-all看规则;再确认对端有没有到你这边的路由;最后查rp_filter,多网卡环境把它调成松散模式试试。
现象四:重启后路由丢失,但配置文件明明在。原因:网卡被 NetworkManager 接管,route-<网卡>文件不生效;或者NM_CONTROLLED=yes导致 network 服务不处理这块网卡。 解决:grep NM_CONTROLLED /etc/sysconfig/network-scripts/ifcfg-eth1,如果是 yes,改成 no 并systemctl restart network;或者改用nmcli connection modify加路由。
现象五:加了两条默认路由,流量从错误的网卡出去。原因:两块网卡都配了GATEWAY,metric 相同或未设,内核选择不确定。 解决:只给主网卡配GATEWAY,或者在ifcfg文件里用METRIC明确优先级,数字小的优先。改完ip route show default确认只剩一条生效的默认路由。
6. 用 ip route get 做上线前验证,以及我踩过的那个 rp_filter 坑
配完静态路由,别急着收工。我现在的习惯是上线前跑一遍固定验证流程,把「路由表里有」和「流量真能走通」分开确认。第一步ip route show看条目和 metric,第二步ip route get <目标IP>看内核实际选路和源地址,第三步ping和traceroute看连通性和路径,第四步ss -tnp或者抓包确认业务流量确实从预期网卡出去。这四步走完,基本不会出现「配置看着对、业务就是不通」的情况。
# 上线前验证脚本片段 TARGET=10.10.1.5 echo "=== 路由条目 ===" ip route show | grep 10.10 echo "=== 内核选路 ===" ip route get $TARGET echo "=== 连通性 ===" ping -c 3 $TARGET echo "=== 路径 ===" traceroute -n $TARGET重点看ip route get输出里的dev和src两个字段。dev必须是你在配置文件里指定的那块网卡,src必须是那块网卡的 IP。如果src是别的网卡地址,对端很可能因为反向路径检查把回包丢掉,表现就是「去包能到、回包回不来」。
我自己踩得最深的一次是双网卡加策略路由,路由、规则、防火墙全查了都没问题,业务就是单向不通。最后翻到rp_filter,eth1 的严格反向路径检查把从 eth0 进来的回包判定为非法,直接丢了。改成松散模式后立刻恢复。这个坑的血泪经验是:多网卡非对称路由场景,配完路由顺手把rp_filter一起检查了,别等业务报障才想起来。
# 永久关闭指定网卡的严格反向路径检查 cat > /etc/sysctl.d/99-rp-filter.conf <<'EOF' net.ipv4.conf.eth1.rp_filter = 2 net.ipv4.conf.all.rp_filter = 2 EOF sysctl -p /etc/sysctl.d/99-rp-filter.conf参数说明:rp_filter=2是松散模式,只检查源地址是否可达,不做严格接口匹配;all.rp_filter影响全局默认值,单网卡配置会覆盖它。写进/etc/sysctl.d/下的独立文件,比直接改/etc/sysctl.conf好维护,升级系统时不容易被覆盖。
CentOS 7 虽然已经进入维护末期,但存量机器还很多,静态路由这套东西不会因为系统老就失效。把临时命令、持久化文件、策略路由和 rp_filter 这几块理清楚,多网卡环境的路由问题基本都能自己扛下来。希望帮到你。
本文还有配套的精品资源,点击获取