1. 什么是路由表——动手之前先搞懂数据包怎么走在敲下第一条route add命令之前我建议你先花几分钟把路由表的底细摸清楚。因为我在实际运维中见过太多人命令背得滚瓜烂熟加完路由却不生效最后折腾半天发现是掩码写错或者网关不在同一网段。路由表本质上是一张摆在操作系统网络栈里的“交通指示牌”。当一个数据包要从本机发出去时内核会拿着数据包的目的IP地址去这张表里逐条比对找到最合适的一条规则然后把数据包从对应的网卡交给下一跳设备。你可以把它理解为快递分拣中心的登记表每个包裹数据包来了分拣员先看目的地址然后查表决定把它扔到哪个传送带网卡。表里没有对应记录的包裹要么走兜底线路默认路由要么直接被退回返回“网络不可达”。1.1 一张表到底长什么样在Linux上执行route -n你会看到类似下面这样的输出Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0 10.10.4.0 192.168.1.1 255.255.255.0 UG 0 0 0 eth0 172.16.8.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1第一行0.0.0.0就是默认路由意思是所有在表里找不到明确匹配项的数据包统一丢给网关192.168.1.1。第二行是我们手动加的静态路由告诉内核去往10.10.4.0/24网段的包也交给同一台网关。第三行是直连路由表示172.16.8.0/24这个网段就在本机eth1网卡上不需要经过任何网关。在Windows上执行route print看到的信息本质相同只是字段名和排序略有不同。理解这张表的结构是所有路由操作的基础。1.2 一条路由表项由哪些字段组成每条路由表项都包含四个关键信息目的网络Destination、子网掩码Genmask、网关Gateway和出接口Iface。此外还有一个容易被忽视的指标——Metric路由优先级。目的网络和子网掩码决定了这条路由匹配哪些IP。比如目的网络10.10.4.0 掩码255.255.255.0代表目标IP在10.10.4.1到10.10.4.254之间的包都走这条路。这里最容易出错的就是掩码很多人把10.10.4.0/24错写成10.10.4.0/16结果半个私网段都被指到了错误的方向。网关字段表示下一跳地址也就是数据包离开本机后要交给谁。出接口则告诉内核从哪个网卡把包发出去。Metric用来在“多条路由同时匹配”时决定谁更优先数值越小优先级越高。实际修障时经常遇到“路由明明加了却不走”的情况凶手往往就是Metric值——系统默认选择数值最小的那条路由。理解了这些字段下一步就是选工具。不同系统、不同命令版本写法差异还真不小。2. 工具选型——Linux的route与ip命令到底用哪个添加IPv4路由表项工具看似简单背后却牵扯出一个老生常谈的话题传统route命令和新一代ip命令怎么选。先说结论如果你用的是CentOS 7、Ubuntu 16.04以上的主流发行版优先用ip route。如果是在老设备、网络设备模拟器或者脚本兼容性要求极高的环境里route命令仍然有它的存在价值。两者并不冲突很多老手两条命令都熟只是日常操作中越来越偏向ip。2.1 Linux下route与ip route的核心差异route命令来自 net-tools 工具包这个包的年代可以追溯到上世纪90年代。它读的是/proc/net/route文件输出格式直观对新手友好。但net-tools已经多年不再维护很多新特性不支持比如策略路由、多路由表等高级功能用route命令根本看不全。ip route来自 iproute2 工具包由内核网络维护者直接维护功能全、输出稳定。它支持按规则筛选、显示指定网段路由、操作多路由表等高级功能。我这里不是劝你非黑即白地站队而是建议你按场景选场景推荐命令原因日常查询路由表ip route输出简洁支持过滤临时添加/删除默认路由route / ip route两种都行看习惯查看明细Flag、多表路由ip route show table allroute命令不支持脚本兼容老系统route老设备上iproute2不一定有网络模拟器/实验环境route命令输出更接近教材方便教学我这边的习惯是查询用ip route改路由用ip route add/del只有连不上服务器、只能靠老命令救命时才用route。实际生产环境里route命令没装的现象越来越常见但ip命令基本是标配。2.2 Windows环境下怎么选Windows环境下就没那么多纠结了命令就是route。系统自带没有额外依赖。Windows的route命令支持查看、添加、删除路由核心用法和Linux的route命令基本一致但参数风格更接近老式路由协议写法掩码是用点分十进制而不是CIDR前缀。用Windows的route命令时要注意一个细节修改路由表需要管理员权限。普通cmd窗口里跑route add会提示“请求的操作需要提升”很多人第一次用就卡在这里。解决办法是右键“以管理员身份运行”命令行窗口。Windows还有一个Linux里没有直接对应的概念-ppersistent参数。加了-p的路由会持久化到注册表重启后依然存在。这一点在实际工作中非常实用但也埋了个坑——如果一条持久化路由写错了重启后就会一直存在排查时需要手动用route delete删掉千万别漏。3. 实操全过程——从查询到添加再到验证一次走通下面进入正题。我以一个最常见的真实场景为例某办公网段192.168.1.0/24网关是192.168.1.1现在要新增一条通往业务网段10.10.4.0/24的静态路由下一跳也是192.168.1.1。目标是用这个案例把Linux和Windows两种环境下的完整操作跑一遍顺带把验证方法和持久化配置一并说清。3.1 动手前的三步自查避免无效操作我见过太多人上来就噼里啪啦敲命令加完发现没反应。添加路由前建议先做一个三步自查第一步确认目标网段规划是否合理。你要访问的10.10.4.0/24需要和现有网段不冲突。如果这个网段同时出现在多条路由里内核只能根据掩码长度和Metric值判断谁优先网段规划没理清后面全是坑。第二步确认网关可达。网关192.168.1.1必须在本地网卡所在网段内并且二层链路是通的。最简单的验证方式就是ping -c 3 192.168.1.1如果网关都ping不通那加再多路由也是白搭。这个“判断网关是否在同一网段”的逻辑我甚至建议你形成条件反射——凡是路由不生效先ping网关。第三步确认接口名称。Linux下网卡名可能是eth0、ens33、enp0s3也可能是eno1用ip addr看清楚再填。很多人习惯性写eth0机器上实际叫ens33命令执行完显示成功实际上加到了错误的接口上路由自然不会起作用。3.2 Linux环境添加路由的两种写法确认完上述几点后就可以添加路由了。Linux下用ip route添加的写法是ip route add 10.10.4.0/24 via 192.168.1.1 dev eth0解释一下这条命令的每个要素10.10.4.0/24是目标网段和掩码via 192.168.1.1指定下一跳网关dev eth0指定出接口。实际使用中dev参数有时可以省略系统会自己判断但我建议你养成写全的习惯——明确指定接口在排查问题时能省很多力气。对应的传统route命令写法是route add -net 10.10.4.0 netmask 255.255.255.0 gw 192.168.1.1 dev eth0注意这里掩码必须是点分十进制格式不能直接写24。两种写法效果一样但ip route更简洁、更不容易看花眼。添加默认路由也顺便说一下因为很多场景下的“添加路由表项”其实就是配默认网关ip route add default via 192.168.1.1 dev eth0如果已经有default路由了会提示RTNETLINK answers: File exists这时候要先ip route del default再重新加或者直接ip route replace default via ...。我个人推荐用replace一步到位不会出现删完加失败导致断网的尴尬。3.3 Windows环境添加路由的完整流程Windows下的操作逻辑基本相同只是命令风格不同。管理员权限打开CMD后先确认当前路由状态route print看看目标网段有没有已存在的路由以及确认接口列表信息。然后添加路由route add 10.10.4.0 mask 255.255.255.0 192.168.1.1这条命令的意思是去往10.10.4.0/24网段的包网关走192.168.1.1。Windows会自动根据IP判断走哪个接口所以不需要显式指定接口索引。如果要指定接口可以追加if 索引号参数索引号从route print输出里的“接口列表”中查。如果要让这条路由重启后依然有效加上-p参数route add 10.10.4.0 mask 255.255.255.0 192.168.1.1 -p加完-p后系统会把它写入注册表。以后每次重启这条路由都自动存在。要注意的是-p只能和add一起用修改已有静态路由时需要先route delete再重新route add -p。3.4 添加完路由后的验证方法命令敲完不代表配置生效。Linux下验证最直接的方式ip route get 10.10.4.1这条命令会告诉你如果目标是10.10.4.1内核会走哪条路由、从哪个接口出去、下一跳是谁。输出符合预期说明路由添加成功。Windows下对应的验证方式tracert -d 10.10.4.1看第一跳是不是到了192.168.1.1如果第一跳直接就是目标地址或者到了预期网关说明路由生效。更进一步可以实际测试连通性ping -c 3 10.10.4.1ping通了说明路由和链路都正常。ping不通也先别急着骂路由可能是目标设备防火墙上没放行ICMP这时候再用tcpdump抓包确认数据包是否真的发到了网关定位问题到底在哪层。3.5 Linux下让路由永久生效的三种落地方式Linux下用命令添加的路由重启后直接消失。要让它永久生效不同发行版有不同的做法。这里分享三种常见的配置方式。第一种是写入/etc/rc.local。这种方式最老但最通用本质上是开机后执行一遍命令。在文件exit 0前加入ip route add 10.10.4.0/24 via 192.168.1.1 dev eth0但要注意CentOS 7之后的系统rc.local默认不执行需要先chmod x /etc/rc.d/rc.local并确认服务启动。这种方式因为简单粗暴我一直用它作为临时环境、模拟器的首选。第二种是按发行版的网络服务配置。CentOS 6及之前写/etc/sysconfig/network-scripts/route-eth0内容格式是10.10.4.0/24 via 192.168.1.1 dev eth0CentOS 7/8配合NetworkManager用的写法略有不同推荐用命令行工具配置nmcli connection modify eth0 ipv4.routes 10.10.4.0/24 192.168.1.1 nmcli connection up eth0Ubuntu 18.04及以上如果使用netplan方案在/etc/netplan/xxx.yaml的对应接口下加routes: - to: 10.10.4.0/24 via: 192.168.1.1第三种是借助systemd网络配置。不同环境差异很大但核心思想一致让网络服务在启动时重新配置路由。需要特别提醒的是在云平台或虚拟化环境的服务器上不要随意配置默认路由和静态路由去覆盖系统原有的默认网关否则可能导致网络断开、远程连接丢失。这种“远程配置路由把自己断网”的事故我见过不止一次。生产环境操作前一定要先确认管理网段的访问不会受到影响或者通过带外管理手段保底。4. 常见问题与排查技巧实录这部分我写点实操中踩过的坑。路由表项的添加本身不难难的是加了不生效、生效了不持久、持久了又影响原有网络。下面这几种典型问题我按照从“最常遇到”到“最隐蔽”的顺序梳理。4.1 路由加了却不生效多半是这四种情况网关不可达是最基础的问题。检查一下路由表中网关IP和当前网卡IP是否在同一网段用ping测一下网关连通性。很多时候不是路由的问题而是下一条设备本身就没起来。掩码写错是新手最容易踩的坑。10.10.4.0/24和10.10.4.0/16路由虽然都能加进去但匹配范围完全不同。加了10.10.4.0/16之后10.10.4.1到10.10.5.1这类目标都会走这条路由如果指向的网关不对整个业务都跟着遭殃。判断方法很简单ip route get 目标IP看看实际走了哪条。Metric值导致路由竞争失败。如果系统里已经存在一条能匹配目标网段的路由新加的静态路由Metric值比它大内核依然会选择旧的路由。查这个问题用route -n看同一目标网络是否有多条记录Metric列谁的数值更小谁就赢。解决方式有两种删除多余的路由或者给新路由设置更小的Metric值。ip route里能用metric 50这样的参数直接控制ip route add 10.10.4.0/24 via 192.168.1.1 dev eth0 metric 50重启后路由消失。这种情况最常见但排查起来最简单——看你用的是命令方式还是持久化方式加的。命令行加的路由临时生效重启必然丢失。如果改的是/etc/rc.local检查文件是否有执行权限如果改的是netplan或network-scripts检查语法和配置是否被网络服务正确加载。一个屡试不爽的排查方式重启网络服务后执行ip route show看看路由在不在。不在说明配置没被读到去检查配置文件的路径和拼写。4.2 排查思路与定位工具遇到路由不生效我的排查顺序是固定的先看路由表里有没有那条记录再用ip route get看内核实际选择然后ping网关确认链路接着用traceroute看数据包走到了哪一跳最后用tcpdump在出接口上抓包确认数据包有没有发出去。有个案例很典型某次承接一个跨网段联调项目服务器上加了路由表项访问业务网段但始终不通。查了路由表规则存在且正确ping网关也通traceroute显示数据包确实到了网关但网关没有回应。后来发现问题根本不在本机而是网关设备上没有回程路由数据包到了网关后不知道往哪儿送。这就是典型的“路由是双向的不光要修本机还要确认对端也认识你”。遇到跨设备通信问题一定要意识到你加了路由只能保证数据包能出去回包能不能回来取决于对端设备的配置。还有个容易忽略的点安全策略和防火墙。Linux的iptables规则如果配置了丢弃转发或阻断特定网段就算路由表项完全正确数据包也会被拦下。排查时执行iptables -L看看有没有相关策略一定程度上能少走弯路。Windows环境同理检查系统防火墙的入站出站规则。4.3 实际项目中的一条常用经验最后分享一条我在多网卡服务器上屡试不爽的经验。当服务器有多块网卡比如eth0是内网管理网段eth1是业务网段访问某个目标网段时默认走了eth0但你希望它走eth1除了添加静态路由还有一点很重要确认业务流量回包时不会因为“非对称路由”被丢弃。解决办法通常是在添加路由的同时使用ip rule配合策略路由按源地址或端口分流。比如ip rule add from 192.168.10.0/24 lookup 100 ip route add default via 192.168.10.1 dev eth1 table 100这样来自192.168.10.0/24的数据包会走独立的表不会和默认路由冲突。这种策略路由属于路由配置的进阶内容但在生产网络中非常实用值得深入学习。我个人在实际操作中的体会是路由表项操作这件事八成的时间不是花在“敲命令”上而是花在“判断该不该加、加了走哪条、加完怎么验证”上。把基础原理吃透多练习几次ip route get和traceroute的配合使用大部分路由问题都能自己搞定。记住一点加路由永远只是开始确认双向可通才是结束。
阅读完成 · 觉得有帮助?