服务器能登录却上不了外网,能访问同机房的内网地址却打不开任何公网域名,或者反过来,内网服务全通、偏偏某几个网段死活访问不了——这类问题十有八九出在默认网关上。网关是服务器通往本网段之外世界的唯一出口,配错了、配重了、被脚本覆盖了,表现都是"网络时通时不通",但根因各不相同。
这篇文章按"先看懂路由表,再定位网关错误,最后修复并持久化"的顺序展开,重点讲三类最容易踩的坑:默认网关压根没配、配了两个网关互相打架、网关地址写错或指到了错误的网卡。每一类都给出现象、验证命令和修复步骤,读完之后你应该能独立判断一台 Linux 服务器的出网路径为什么不对。
需要提前说明的是,现代 Linux 上修改路由的命令是 ip route(来自 iproute2),老的 route、ifconfig 命令虽然还能用但已经废弃,很多新发行版默认就不装了。下面的操作以 ip 命令为主,需要兼容老系统时会补充 route 写法。
一、默认网关到底在做什么
数据包要发到本网段之外的地址,主机没法直接通过 ARP 找到对方,只能把包交给一个"中间人"——这就是网关(gateway),也叫默认路由(default route)。路由表里那条目标是 0.0.0.0/0(IPv6 是 ::/0)的记录,就是默认网关。它的含义是:所有在本机路由表里找不到更精确匹配的流量,都从这里走。
路由匹配遵循"最长前缀优先"原则:一个目标地址如果同时能匹配 0.0.0.0/0 和 192.168.1.0/24,会选后者,因为前缀更长、更精确。所以默认网关只在"没有更具体路由"时才生效。理解这一点很关键,后面很多"网关明明是对的却不通"的怪现象,其实是被另一条更精确的路由截胡了。
网关必须和服务器某个网卡在同一个二层网段里,否则服务器无法和网关建立 ARP 关系。举个反例:网卡地址是 192.168.1.10/24,却把网关配成 192.168.2.1,这两个网段不经路由无法直达,网关自然不通。这是新手最常见的一类错误。
二、先把当前路由表看清楚
排查网关问题,第一步永远是打印路由表。常用命令如下:
# 最常用:查看 IPv4 路由表
ip route show
ip route # 等价简写
# 查看某条目标地址会走哪条路由(非常实用,直接给出决策结果)
ip route get 8.8.8.8
ip route get 192.168.1.100
# IPv6 路由表
ip -6 route show
# 老命令(net-tools 包,新版系统可能没装)
route -n
# RHEL/CentOS/Rocky 安装:yum install net-tools 或 dnf install net-tools
# Debian/Ubuntu 安装:apt install net-tools
# 看网卡地址和状态
ip addr show
ip -br addr # 简洁模式,一行一个接口
ip route show 的典型输出和含义:
default via 192.168.1.1 dev eth0 proto static metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10
169.254.0.0/16 dev eth0 scope link metric 1002
- 第一行
default via 192.168.1.1 dev eth0:默认网关是192.168.1.1,出口网卡eth0。 metric 100:优先级,数字越小越优先。多个网关时靠它决定用哪个。192.168.1.0/24 dev eth0 ... scope link:直连网段,不需要网关。src 192.168.1.10:从这个网段出去时用的源地址。
如果只想快速确认"我到底有没有默认网关",用 ip route get 8.8.8.8 最直观:它会告诉你这个包会从哪个源地址、经哪张网卡、下一跳是谁发出去。没配默认网关时,它会报 Network is unreachable。
三、三种典型错误与现象对照
把常见的网关错误整理成一张表,方便对应现场现象:
| 错误类型 | 典型现象 | ip route get 8.8.8.8 输出 |
定位方法 |
|---|---|---|---|
| 完全没有默认网关 | 只能访问同网段,域名解析失败,外网全不通 | Network is unreachable |
ip route show \| grep default 为空 |
| 网关地址写错 | 同网段能通,跨网段全不通,ARP 请求不到网关 | 有 default,但指向错误地址 | ip neigh 看网关 ARP 是否 FAILED |
| 多个默认网关 | 时通时不通,抓包看到流量从两张网卡乱出 | 显示其中一条,但会变 | ip route show default 有多行 |
| 被更精确路由截胡 | 访问特定网段不走网关,走错网卡 | 显示走的是非预期网卡 | 对比目标网段与 ip route 明细 |
| 网关不在同网段 | 重启后彻底不通 | default 存在但 ping 不通网关 | 核对网卡掩码与网关地址 |
判断"网关到底通不通",可以专门测试:
# 看邻居表里网关的 ARP 状态,REACHABLE 才正常,FAILED/INCOMPLETE 说明二层不通
ip neigh show dev eth0
ping -c 3 192.168.1.1 # 直接 ping 网关
# 只查默认网关这一条
ip route show default
ip route show | grep '^default'
如果 ip neigh 里网关一直是 FAILED 或没有记录,说明服务器和网关之间的二层链路有问题:可能是网关地址填错、VLAN 不对、交换机端口配置不对,或者网线插错了物理接口。这时先别怀疑路由,先确认"这条二层路能不能走通"。
四、用 ip 命令修复默认网关
确认问题后,修复分"临时生效"和"永久生效"两步。临时命令立即见效、重启即失效,适合先验证;确认无误后再改配置文件持久化。
# 1. 删除错误的默认网关(如果存在)
ip route del default via 192.168.1.1 dev eth0
# 2. 添加正确的默认网关
ip route add default via 192.168.1.1 dev eth0
# 3. 如果有多条默认网关,用 metric 指定优先级(数字小的优先)
ip route add default via 192.168.1.1 dev eth0 metric 100
# 4. 替换默认网关的便捷写法(不存在则添加,存在则替换)
ip route replace default via 192.168.1.1 dev eth0
# 5. 验证
ip route get 8.8.8.8
ping -c 3 8.8.8.8
注意:ip route del default 不加参数时如果有多条默认路由会报错提示有多个匹配,这时必须带上 via 和 dev 精确指定要删哪一条。删除默认网关的瞬间,所有出网流量会中断,如果 SSH 是通过公网连的,会立刻掉线。远程操作务必先开一个备用会话(比如云控制台的 VNC/串口),或把"删除+添加"写在同一条命令里一次执行,例如:
ip route replace default via 192.168.1.1 dev eth0
replace 是原子操作,不会出现"删了还没加"的空窗期,远程操作首选它。
五、让配置永久生效:各发行版写法不同
临时命令重启就没了,持久化必须改配置文件。这块各发行版差异很大,是踩坑重灾区,统一整理如下:
| 发行版 / 系统 | 推荐配置文件 | 说明 |
|---|---|---|
| RHEL/CentOS 7+、Rocky、Alma | /etc/sysconfig/network-scripts/ifcfg-eth0 |
设 GATEWAY= 与 BOOTPROTO=none |
| RHEL 9 / Rocky 9(NetworkManager) | nmcli 命令或 /etc/NetworkManager/system-connections/ |
推荐 nmcli con mod |
| Debian 11 及更早 | /etc/network/interfaces |
加 gateway 192.168.1.1 |
| Ubuntu 18.04+ / Debian 12 | /etc/netplan/*.yaml |
YAML 缩进敏感,改完 netplan apply |
| 通用(NetworkManager 系统) | nmcli |
命令行改,兼容性好 |
RHEL/CentOS/Rocky 示例:
# 传统 ifcfg 文件方式(编辑 /etc/sysconfig/network-scripts/ifcfg-eth0)
# 关键两行:
# BOOTPROTO=none
# GATEWAY=192.168.1.1
# 保存后重启网络:
systemctl restart network # CentOS 7
nmcli con reload # NetworkManager 系统
nmcli con up eth0
# 推荐用 nmcli 直接改(Rocky 8/9 通用)
nmcli con mod eth0 ipv4.gateway 192.168.1.1
nmcli con up eth0
nmcli con show eth0 | grep -i gateway
Debian/Ubuntu 示例:
# Debian 11 及更早:/etc/network/interfaces
# iface eth0 inet static
# address 192.168.1.10
# netmask 255.255.255.0
# gateway 192.168.1.1
systemctl restart networking
# Ubuntu 18.04+ / Debian 12:/etc/netplan/01-netcfg.yaml
# network:
# version: 2
# ethernets:
# eth0:
# addresses: [192.168.1.10/24]
# routes:
# - to: default
# via: 192.168.1.1
# nameservers:
# addresses: [223.5.5.5, 119.29.29.29]
netplan apply
netplan try # 改前先 try,120 秒内无确认自动回滚,远程改网必用
netplan try 是一个非常友好的设计:应用新配置后如果 120 秒内没有确认,会自动回滚到旧配置。远程改网卡配置时强烈建议用它,避免改错把自己关在门外。
六、多网卡多网关的坑
一台服务器有两张网卡、各接一个网段时,如果两张网卡都配了默认网关,就会出现"出网流量随机从某张网卡出去"的问题,表现为外网时通时不通,或者某些服务回包源地址不对导致被对端丢弃。这种情况的规律是:内核只允许一条默认路由生效(相同 metric 下会来回切换),多网关必须用 metric 区分优先级,或者用策略路由按源地址/目的地址分流。
# 查看所有默认路由及其 metric
ip route show default
# 给主出口更高的优先级(数字更小)
ip route add default via 192.168.1.1 dev eth0 metric 100
ip route add default via 10.0.0.1 dev eth1 metric 200
# 确认最终选了哪条
ip route get 8.8.8.8
如果业务需要"内网流量走 eth1、公网流量走 eth0",单靠默认网关的优先级是做不到的,需要上策略路由(policy routing),也就是基于源地址或目的地址建立多张路由表。这部分内容较多,涉及 ip rule、自定义路由表和 rt_tables 文件,属于进阶话题,核心思路是"先分类,再分别选出口",改错了会导致路由黑洞,操作前务必备份 ip rule show 和 ip route show table all 的输出。
七、风险提示与回滚
修改网关和路由属于高风险操作,做之前务必留好后路:
# 1. 修改前先完整备份当前路由状态(出问题时照着重放即可回滚)
ip route show > /root/route.bak
ip rule show > /root/rule.bak
ip route show table all > /root/route-all.bak
# 2. 确认备用登录通道可用:云控制台 VNC、串口、带外管理口
# 3. 用 ip route replace 而非先删后加,避免流量空窗
# 4. 改完立即在另一个会话验证,别在同一会话里等断线
回滚方式:如果需要恢复到备份时的状态,先清掉新加的规则,再按备份文件逐条重加;或者直接重启网络服务让配置文件里的设置重新加载。对于临时 ip route add 加进去的路由,重启网络服务或重启系统即自动消失,这是它"安全"的一面。
特别提醒:不要用 ip route flush all 这种一把清空的命令,它会连同直连路由一起清掉,把服务器彻底变成网络孤岛,只能靠带外管理恢复。远程运维时这条命令等同于"手滑拔网线"。
常见问题
Q:ip route show 里没有 default 行,但服务器能上网,是怎么回事?
可能是通过更具体的路由表或策略路由出网的,也可能是 NetworkManager 动态下发的路由还没落到主表。用 ip route show table all 和 ip rule show 看全量。另外容器环境(Docker/K8s)里网卡众多,默认路由可能绑在别的接口上。
Q:网关地址能 ping 通,但就是上不了外网,怎么查?
网关通说明二层没问题,往上查两层:一是 DNS 是否可用(cat /etc/resolv.conf、dig @223.5.5.5 example.com),二是上游是否有 NAT/转发(网关自己能不能出网)。也检查防火墙有没有把出向流量拦了(iptables -L -n 看 FORWARD/OUTPUT 链)。
Q:改完配置文件重启网络,SSH 立刻断了,怎么办?
说明新配置有误。立刻从云控制台 VNC 或带外登录,用备份的 route.bak 恢复,或把配置文件改回旧值重启网络。这也是为什么强烈建议用 netplan try 或 nmcli 的 --timeout 机制——它们有自动回滚。
Q:为什么重启后网关又变回去了?
临时用 ip route add 加的路由不会持久化,重启就丢。真正要长期生效必须写进配置文件。反过来,如果配置文件里写对了但重启后被覆盖,通常是 NetworkManager 与传统的 network 服务同时启用、互相打架,二选一即可。
Q:多个默认网关时 metric 一样会怎样?
内核会在多个等价路由之间做 ECMP 负载均衡,源地址和出接口可能随机变化,导致"时通时不通"和回包源地址不一致。解决方法是给不同的默认路由设置不同的 metric,明确主备关系。
总结
默认网关就是路由表里 0.0.0.0/0 那条记录,出错时先看现象:只能访问同网段多半是没配网关,跨网段不通多半是网关地址错,时通时不通多半是多个网关打架。
排查固定三步:ip route show 看路由表,ip route get 8.8.8.8 看实际决策结果,ip neigh 和 ping 看网关二层是否可达。三者结合基本能定位。
修复时临时用 ip route replace default via <网关> dev <网卡> 验证,确认后再改配置文件持久化。RHEL/Rocky 用 ifcfg 或 nmcli,Debian 用 /etc/network/interfaces,Ubuntu 18.04+ 用 netplan。
多网卡多出口场景不要靠两条等价默认路由硬扛,要用 metric 区分主备,或上策略路由做分流。
远程改网关前先备份 ip route show 输出、确认带外通道可用、改用 replace 原子操作;切勿使用 ip route flush all。
企业QQ咨询




