ARTICLE DETAIL

资讯详情

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

CentOS 7 静态路由持久化配置与多网卡排错实战

CentOS 7 静态路由持久化配置与多网卡排错实战 简介这份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 routeCentOS 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 与 NetworkManager3.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 ADDRESS010.10.0.0 NETMASK0255.255.0.0 GATEWAY0192.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_CONTROLLEDyes说明这块网卡归 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 GATEWAY192.168.1.1 METRIC100 # 文件/etc/sysconfig/network-scripts/ifcfg-eth1 GATEWAY192.168.2.1 METRIC200metric 小的优先。这样默认路由只有一条生效另一块网卡只走它自己的直连网段和静态路由。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_filter2rp_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_CONTROLLEDyes导致 network 服务不处理这块网卡。 解决grep NM_CONTROLLED /etc/sysconfig/network-scripts/ifcfg-eth1如果是 yes改成 no 并systemctl restart network或者改用nmcli connection modify加路由。现象五加了两条默认路由流量从错误的网卡出去。原因两块网卡都配了GATEWAYmetric 相同或未设内核选择不确定。 解决只给主网卡配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或者抓包确认业务流量确实从预期网卡出去。这四步走完基本不会出现「配置看着对、业务就是不通」的情况。# 上线前验证脚本片段 TARGET10.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_filtereth1 的严格反向路径检查把从 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_filter2是松散模式只检查源地址是否可达不做严格接口匹配all.rp_filter影响全局默认值单网卡配置会覆盖它。写进/etc/sysctl.d/下的独立文件比直接改/etc/sysctl.conf好维护升级系统时不容易被覆盖。CentOS 7 虽然已经进入维护末期但存量机器还很多静态路由这套东西不会因为系统老就失效。把临时命令、持久化文件、策略路由和 rp_filter 这几块理清楚多网卡环境的路由问题基本都能自己扛下来。希望帮到你。本文还有配套的精品资源点击获取
返回列表