ARTICLE DETAIL

资讯详情

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

多平台静态路由综合实验:从路由表到回程路由的排错全解析

多平台静态路由综合实验:从路由表到回程路由的排错全解析 先说一个我观察到的现象很多人学静态路由以为就是把ip route-static三条命令敲上去全网就能通。真做实验的时候PC 能 ping 通直连网关但一跨到对端网段就超时然后开始怀疑模拟器坏了。这个标题说是综合练习恰恰是因为静态路由表面上简单真正要打通的是路由表逻辑、跨平台命令差异、回程路由意识这些底层东西。我这次把实验做成了一个混合环境ensp 里两台路由器做骨干再接一台 Linux 主机当路由器最后落一台 Windows 电脑当终端。这么设计的原因很直接——华为命令行、Linux 的ip命令、Windows 的route命令是网上被问得最多的三类静态路由配置场景。一次实验全遇到比只看单一厂商的文档更能建立完整的网络观。1. 一张多平台混合拓扑把实验目标先拆清楚1.1 为什么要把实验设计成路由器 Linux Windows三端同练先想清楚一个问题静态路由综合练习到底在练什么如果你只打算练华为设备的命令直接在 ensp 里拖三台路由器串联就够。但真实的网络环境从来不是单一厂商包打天下。企业里可能核心是华为路由器旁边跑着一台 Linux 服务器承担转发办公室里大量 Windows 主机需要知道去某个内网网段该走哪个网关。所以我故意把实验设计成三端混合ensp 里的路由器负责典型的三层转发Linux 主机模拟一台软路由让你理解路由器不一定是专用硬件普通系统的转发能力和路由表同样在起作用Windows 电脑作为终端让你体会终端上为什么也要有路由决策以及默认网关和静态路由的关系。实验的验收标准很朴素全网任意两台设备都能双向 ping 通。不是只在 PC-A 上 ping 通一次就算完还要从 Windows 反向 ping 回来从 Linux 上 ping 两端每一段都要通。这样综合二字才有意义。1.2 地址规划与网络拓扑每个网段都要做到心中有数实验拓扑用文字描述就是这样PC-A(192.168.10.10/24) | AR1: GE0/0/0 192.168.10.1/24 GE0/0/1 192.168.20.1/24 | AR2: GE0/0/0 192.168.20.2/24 GE0/0/1 192.168.30.1/24 | Linux-Router: eth0 192.168.30.2/24 eth1 192.168.40.1/24 | Win-PC(192.168.40.10/24, 网关 192.168.40.1)共四个网段192.168.10.0/24、192.168.20.0/24、192.168.30.0/24、192.168.40.0/24。中间两个网段是设备间互联地址两端分别是终端 PC。动手前建议先把地址规划表打印出来或者画在纸上。很多人在命令行里反复敲命令却 ping 不通原因不是命令不会而是忘了 AR1 的 GE0/0/0 到底是哪个地址、AR2 的下一跳又该写谁。地址规划表列清楚了后面的静态路由配置只是照着抄。设备接口IP 地址所在网段PC-A网卡192.168.10.10/24192.168.10.0/24AR1GE0/0/0192.168.10.1/24192.168.10.0/24AR1GE0/0/1192.168.20.1/24192.168.20.0/24AR2GE0/0/0192.168.20.2/24192.168.20.0/24AR2GE0/0/1192.168.30.1/24192.168.30.0/24Linuxeth0192.168.30.2/24192.168.30.0/24Linuxeth1192.168.40.1/24192.168.40.0/24Win-PC网卡192.168.40.10/24192.168.40.0/241.3 动手前先明确真正的验收标准不是配完命令而是双向互通静态路由实验最容易出现的问题是自认为配完了。我在带实验时见过很多学员在 AR1 上配了去往192.168.40.0/24的静态路由然后拿 PC-A 去 ping Windows通了立刻宣布实验完成。这个结论下得太早——PC-A 能出去不代表 Windows 能回来。双向互通要求你在每一端都做回程验证从 PC-A ping Win-PC 的192.168.40.10从 Win-PC ping PC-A 的192.168.10.10从 Linux 上分别 ping192.168.10.10和192.168.40.10最好在 AR1、AR2 上用ping -a或从源接口 ping 对端网段。之所以强调双向是因为静态路由是单向配置的。你给 AR1 配一条到 40 网段的路由只是告诉 AR1去 40 往右走但 AR2、Linux、Windows 并不知道怎么回 10 网段。回包走到某个设备上没有路由就会被丢弃表现就是请求发出去了Reply 一直不回来。这个点后面单独展开。2. 静态路由真正难的是查表逻辑匹配规则和优先级2.1 路由匹配规则中最容易被忽略的最长前缀优先静态路由命令本身不复杂但路由器拿到一个 IP 包后怎么查表是很多人学完就忘的东西。路由器收到一个目的 IP 为192.168.10.99的包它会扫描整张路由表找出所有能匹配这个目的地址的条目。假设路由表里有两条192.168.10.0/24下一跳192.168.20.2192.168.10.0/25下一跳192.168.20.3两条都能匹配192.168.10.99因为/25 范围是192.168.10.0到192.168.10.127确实包含它。此时路由器会选前缀更长、范围更小的那一条也就是/25那一条。这就是最长前缀匹配。这个规则能解释很多诡异现象。比如你配了一条静态路由到192.168.10.0/24但数据总是跑到别的下一跳去很可能因为有更精确的192.168.10.128/25或者直连路由存在。排错时先display ip routing-table看表不要急着怀疑命令敲错。2.2 路由优先级不同来源的路由同时存在时听谁的路由表里的条目可能来自多种渠道接口配好 IP 后自动产生的直连路由、手写的静态路由、动态路由协议学来的路由。它们如果指向同一个目的地谁说了算厂商引入了路由优先级也叫管理距离的概念。华为设备上默认值是路由来源华为默认优先级直连路由0OSPF10静态路由60RIP100BGP255同一目的地有几条不同来源的路由时优先级数字越小越优先。所以直连路由永远压过静态路由这也合理——接口上配了 IP这个网段就在眼前没必要再绕到别处。Linux 和 Windows 没有完全一样的优先级字段但它们也有类似概念。Linux 的路由表用metric值排序数值越小越优先Windows 在route print里能看到跃点数也是越小越优先。跨平台做实验时看到同样的数据包里有的设备走了不同路径先检查是不是优先级或 metric 在起作用。2.3 去程有路由不代表能通回程路由才是重灾区这个问题值得单独拿出来说。因为我在实验里看到最多的失败案例都挂在回程上。用送货类比去程路由解决的是货怎么送到对方小区回程路由解决的是对方怎么把回执送回来。你只规划了去的路人家不知道怎么回来这笔交易照样完不成。在咱们这个拓扑里PC-A 要访问 Windows 的192.168.40.10去程经过的路径是PC-A - AR1 - AR2 - Linux - Win-PC这段要走通需要AR1 知道192.168.40.0/24往192.168.20.2转发AR2 知道192.168.40.0/24往192.168.30.2转发Linux 知道192.168.40.0/24是直连Win-PC 收到包后把回包交给默认网关192.168.40.1。但回程又是一条独立链路Win-PC - Linux - AR2 - AR1 - PC-A这时需要Linux 知道192.168.10.0/24往192.168.30.1转发AR2 知道192.168.10.0/24往192.168.20.1转发AR1 知道192.168.10.0/24是直连PC-A 收到回包后通过自己的默认网关把后续请求继续发出去。很多人在 AR1 上配了去 40 网段的路由却忘了 AR2 上根本没有回 10 网段的路由。于是 PC-A 的 ICMP 请求能一路杀到 WindowsWindows 也回了包可回包到了 AR2AR2 不知道 10 网段在哪直接丢弃。现象就是 ping 一直超时。所以拿到一张拓扑图第一件事不是敲路由而是把所有网段之间的路径都写成去程 回程两条标出每一跳需要哪台设备知道哪个目标网段再动手配置。3. ensp 里的实操命令格式、反掩码与下一跳那些坑3.1 先打通接口和直连路由再谈静态路由在路由器上配接口 IP 属于基本功但我在实验里还是会反复强调静态路由是建立在直连路由基础之上的接口没起来后面全是白搭。AR1 的基础配置system-view sysname AR1 interface GigabitEthernet0/0/0 ip address 192.168.10.1 255.255.255.0 undo shutdown quit interface GigabitEthernet0/0/1 ip address 192.168.20.1 255.255.255.0 undo shutdown quitAR2 的基础配置system-view sysname AR2 interface GigabitEthernet0/0/0 ip address 192.168.20.2 255.255.255.0 undo shutdown quit interface GigabitEthernet0/0/1 ip address 192.168.30.1 255.255.255.0 undo shutdown quit配置完立刻用display ip routing-table看一遍。此时应该能看到192.168.10.0/24、192.168.20.0/24、192.168.30.0/24这些直连路由状态是Direct。如果直连路由都没出现先检查接口是否 up、IP 是否配错不要急着往下走。3.2 ip route-static 完整命令格式静态路由格式别记反华为静态路由的标准格式是ip route-static 目的网络地址 { 掩码 | 掩码长度 } 下一跳地址常见写法可以是ip route-static 192.168.30.0 24 192.168.20.2也可以写成ip route-static 192.168.30.0 255.255.255.0 192.168.20.2在 ensp 里两种都能识别。但要注意顺序先目的网络再掩码最后下一跳。很多人会下意识写成ip route-static 下一跳 目的网络 掩码命令直接报错。AR1 需要知道右侧两个网段怎么走ip route-static 192.168.30.0 24 192.168.20.2 ip route-static 192.168.40.0 24 192.168.20.2AR2 需要知道左右两边的非直连网段怎么走ip route-static 192.168.10.0 24 192.168.20.1 ip route-static 192.168.40.0 24 192.168.30.2这里再补一个常见误区网上很多教程会拿 ACL、OSPF 里的反掩码来说事初学者容易混。静态路由里用的是普通子网掩码比如 /24 对应255.255.255.0不是0.0.0.255。如果在 ensp 里把反掩码填进ip route-static结果多半是路由表里没有你想要的那条。3.3 配下一跳还是配出接口以太网链路下的推荐写法华为静态路由命令还支持一种写法只指出接口ip route-static 192.168.40.0 24 GigabitEthernet0/0/1这个写法在串口、专线这类点到点链路上很常见告诉路由器这个网段就从 0/0/1 口扔出去。但在以太网环境里直接配出接口有个隐患路由器只知道从哪个口发却不知道对端设备的 MAC 地址必须额外依赖 ARP 解析。万一链路上有多个设备行为会变得不确定。我个人的建议是以太网链路上配静态路由时始终把下一跳地址写清楚ip route-static 192.168.40.0 24 192.168.30.2这样路由器查路由表得到下一跳 IP再通过 ARP 去解析下一跳的 MAC语义非常明确。后面如果想让某条静态路由在下一跳不可达时不生效也比只配出接口容易判断。配完后在 AR1 上执行display ip routing-table重点看有没有Static前缀的条目目标网段是不是 30 和 40。如果命令敲了表里却没有最常见的原因是下一跳地址本身不可达——比如你写错了下一跳或者对端接口没配 IP。4. Linux 当路由器从 ip_forward 到 File exists 的完整排错4.1 先打开内核转发不然路由表再正确也不过来Linux 默认不转发 IP 包。普通主机收到一个目的地址不是自己的包会直接丢掉这是出于安全考虑。要让 Linux 变成路由器第一步是打开内核转发开关sudo sysctl -w net.ipv4.ip_forward1如果想重启后依然生效写入配置文件echo net.ipv4.ip_forward1 | sudo tee -a /etc/sysctl.conf sudo sysctl -p这个开关是 Linux 实验里最大的隐性坑点之一。有时候你在 Linux 上把静态路由配得完美无缺iptables 也放行了但 ping 就是不通一查/proc/sys/net/ipv4/ip_forward还是 0。转发开关没开Linux 只会处理发给自己接口的数据包不会做任何中间转发。本实验中 Linux 的接口地址配置可以临时用ip addr完成sudo ip addr add 192.168.30.2/24 dev eth0 sudo ip addr add 192.168.40.1/24 dev eth1 sudo ip link set eth0 up sudo ip link set eth1 up4.2 ip route add 遇到File exists先把现有路由表看清楚这是网上搜Linux 静态路由时出现频率最高的问题之一。我在实验里也故意带着学员复现了一次想要给 Linux 添加去往左侧 10 网段的路由正常命令是sudo ip route add 192.168.10.0/24 via 192.168.30.1 dev eth0结果终端返回RTNETLINK answers: File exists很多人看到英文就慌以为命令写错了。其实File exists的意思是内核路由表里已经存在一条前缀完全相同的路由。Linux 的路由表在同一个路由表内不允许同时存在两条目的网络完全一样的路由条目。出现这种情况有三种常见来源之前手动添加过同一条路由自己忘了NetworkManager、DHCP 客户端等工具自动生成过这条路由你想添加一条default路由但系统里已经有默认路由比如 DHCP 下发的网关。处理办法不是硬删而是先看ip route show如果确实已有这条路由用replace直接覆盖sudo ip route replace 192.168.10.0/24 via 192.168.30.1 dev eth0如果只是想删掉旧的重新加也可以sudo ip route del 192.168.10.0/24 sudo ip route add 192.168.10.0/24 via 192.168.30.1 dev eth0很多人不知道replace这个子命令遇到File exists就反复删了加、加了删最后还可能把正确路由搞丢。ip route replace是更优雅的写法相当于有就更新没有就新增。顺便说一句老式的route add命令也会遇到同样问题。比如sudo route add -net 192.168.10.0 netmask 255.255.255.0 gw 192.168.30.1输出可能直接就是file exists。它和ip route add操作的是同一张内核路由表只是命令封装不同。本实验里 Linux 需要添加的路由如下sudo ip route add 192.168.10.0/24 via 192.168.30.1 dev eth0 sudo ip route add 192.168.20.0/24 via 192.168.30.1 dev eth0如果后续要让 Linux 访问外网还可以再加一条默认路由。默认路由本质就是目的网络0.0.0.0/0通常只有在没有其他默认路由时才直接用add。已经有默认路由的话要注意File exists的问题。4.3 别忘了 FORWARD 链路由通了但被防火墙拦了路由表有条目转发开关也打开了为什么 Linux 还是不转发第三个常见拦截点是 iptables 的 FORWARD 链。Linux 防火墙默认策略在不同发行版上不一样。CentOS/RHEL 系如果开着 firewalldFORWARD 链策略往往是DROP未放行的流量会被直接丢弃。Ubuntu 的 ufw 如果没启用一般不会拦截。做实验时最简单的验证办法是先用iptables -L FORWARD -n看策略sudo iptables -L FORWARD -n如果策略是DROP可以临时放行sudo iptables -P FORWARD ACCEPT或者只放行本实验涉及的两个网段sudo iptables -I FORWARD -s 192.168.10.0/24 -d 192.168.40.0/24 -j ACCEPT sudo iptables -I FORWARD -s 192.168.40.0/24 -d 192.168.10.0/24 -j ACCEPT测试完记得评估防火墙策略别为了图省事直接systemctl stop firewalld就把安全层全关了这在实验环境可以生产环境是绝对不行的。如果前面几项都排查完还是不通就到 Linux 上抓包看看sudo tcpdump -i eth0 icmp sudo tcpdump -i eth1 icmpeth0看到请求、eth1没看到说明 Linux 没转发eth1看到请求、但看不到回包那就是回程路由的问题。抓包能把问题精确锁定在包到底停在哪一跳比对着路由表瞎猜高效得多。5. Windows 终端加静态路由route add 参数和永久路由陷阱5.1 route print 先看清楚默认网关和接口跃点数Windows 作为终端平时大部分流量靠默认网关就够了。但真实办公环境里一台电脑可能同时连着办公网、测试网、虚拟机网段不同目标网段要走不同网关这时候就需要手工添加静态路由。先用管理员身份打开命令提示符执行route print -4重点看两段IPv4 路由表的Network Destination和Interface List。其中0.0.0.0/0那条就是默认路由网关写的是默认网关。如果 Windows 有多块网卡要注意每块网卡对应的接口列表编号和跃点数。5.2 route add 的掩码顺序参数颠倒最容易报 parameter incorrectWindows 添加静态路由的语法是route add 目标网络 mask 子网掩码 网关比如想让电脑访问192.168.50.0/24这个网段时不走默认网关而走192.168.40.1这台路由器命令是route add 192.168.50.0 mask 255.255.255.0 192.168.40.1这里最容易被坑的是参数顺序。route add后面必须是目标网络 →mask关键字 → 掩码 → 网关。如果你写成route add 192.168.50.0 192.168.40.1 mask 255.255.255.0Windows 会提示The route addition failed: The parameter is incorrect.这个错误几乎可以断定是掩码关键字位置不对或者掩码与目标网络不匹配。另外Windows 命令里的mask后面要写完整的子网掩码比如255.255.255.0不支持/24这种写法。不熟悉的人可能把 Linux 的习惯带过来直接在 Windows 上敲route add 192.168.50.0/24 ...也会报错。如果你只加一条临时路由做测试route add 192.168.50.0 mask 255.255.255.0 192.168.40.1它立刻生效但 Windows 重启后就没了。要让路由永久保留必须在末尾加-proute add 192.168.50.0 mask 255.255.255.0 192.168.40.1 -p注意-p是 permanent 的意思不是马上生效的意思。加了-p之后这条路由会写入注册表重启后依然存在。5.3 路由已存在时的处理change 与 delete 的区分Windows 也有类似 LinuxFile exists的情况。比如你想把192.168.50.0/24的下一跳从192.168.40.1改成192.168.40.2直接再执行一次route add会失败提示路由添加失败: 对象已存在。此时不应该删掉再添加更合适的命令是route change 192.168.50.0 mask 255.255.255.0 192.168.40.2route change专门用来修改已有路由。它只改网关不增加条目。想彻底删除某条路由再重新加才用route delete 192.168.50.0多网卡环境下建议在 route 命令里显式指定接口避免 Windows 自己选错网卡。先通过route print -4查看接口列表编号假设连接测试网段的网卡接口编号是 12那么route add 192.168.50.0 mask 255.255.255.0 192.168.40.1 metric 5 if 12 -pif参数强制这条路由从指定的接口出去。如果不加Windows 会根据跃点数自己选有时候会选到默认网关那张网卡导致流量虽然进了网卡但对端根本不可达。还有一个容易被忽视的点添加静态路由里的网关必须和本机某个接口在同一个网段。比如你的 Windows 只有一张网卡IP 是192.168.40.10那就不能把静态路由的网关写成192.168.50.1因为本机根本不在这个网段里ARP 无法解析到网关。命令可能不报错但流量永远发不出去。6. 全网互通的排错检查单从路由表、ARP 到抓包定位6.1 先看现象再缩小范围ping 反馈分别说明什么混合环境实验
返回列表