做 Linux 运维久了,你大概率遇到过这种问题:
“IP 配好了,网关也填了,为什么还是上不了网?”
“网关必须和本机 IP 在同一个网段吗?”
“我只是想让机器访问内网,为什么非要配默认网关?”
前两天帮新同事排查网络,他照着文档配完 IP,外网就是 ping 不通。我过去一看,默认网关配到了另一个网段。改完立刻恢复,但他问了一个很典型的问题:“老师说网关是通往其他网络的入口,可到底为什么一定要这么配?”
这篇先讲基础:网关到底是什么,Linux 里它出现在哪里,以及为什么网关大多数时候要和本机同网段。
一、先把概念摆正:网关不是一个神秘开关
日常说“网关”,其实经常混着两层意思。
第一层是广义网关:能帮一个网络把数据转发到另一个网络的设备或系统,都可以叫网关。家用路由器、机房三层交换机、防火墙、Linux 路由主机,都可能承担这个角色。
第二层是 Linux 主机上配置的默认网关。更准确地说,它通常对应路由表里的默认路由:
default via 192.168.31.1 dev eth0
这句话的意思是:如果目标地址没有匹配到更具体的路由,就从 eth0 发给 192.168.31.1 这个下一跳。
所以,在 Linux 主机语境里,默认网关不是一个独立的配置魔法,本质上就是一条兜底路由的下一跳地址。
二、没有网关行不行?
当然行,前提是你的机器不需要访问其他网段。
比如服务器 IP 是 10.0.0.10/24,只需要访问同网段的 10.0.0.20、10.0.0.30。这种通信靠直连路由就够了,不需要默认网关:
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.10
但如果它要访问 8.8.8.8,系统会发现:目标地址不在 10.0.0.0/24 里,也没有其他更具体的路由。这个时候就需要一条默认路由告诉它:“不知道怎么走的流量,先交给谁。”
这里要稍微严谨一点:访问其他网段需要的是“路由”,不一定非得是“默认网关”。如果你只想访问一个指定网段,也可以加静态路由:
ip route add 172.16.0.0/16 via 10.0.0.1 dev eth0
默认网关只是最常见的兜底方案:它覆盖所有没有被其他规则匹配到的目的地址。
三、网关为什么通常要和本机同网段?
这是最容易踩坑的地方。
假设本机是:
IP:192.168.1.10/24网关:192.168.2.1
看起来只差一点,但这通常是错的。
以太网里,本机要把 IP 包交给下一跳,必须先知道下一跳的 MAC 地址。对于同一个二层链路上的 IPv4 地址,Linux 会通过 ARP 查询:“谁是这个 IP?把你的 MAC 告诉我。”
如果网关是 192.168.1.1,它和本机 192.168.1.10/24 同网段,本机认为它在同一条链路上,可以 ARP 到它的 MAC,然后把帧发过去。
但如果网关写成 192.168.2.1,本机按自己的掩码判断:这个地址不在我的直连网段里。一个不在直连链路上的下一跳,本机通常无法直接解析它的 MAC,也就没法把包交出去。
所以工程经验里有一句很实用的话:普通以太网场景下,默认网关要和本机某个地址在同一二层可达网段里。
也有例外,比如:
ip route add default via 192.168.2.1 dev eth0 onlink
onlink 会告诉内核:把这个下一跳当作链路上可达。但这要求你的二层网络、代理 ARP 或上游设备真的支持这种玩法。普通服务器和常规内网环境里,不建议把它当成默认做法。
四、Linux 里的网关到底存在哪?
直接看路由表:
ip route
你可能会看到类似输出:
default via 192.168.31.1 dev eth0 proto dhcp metric 100192.168.31.0/24 dev eth0 proto kernel scope link src 192.168.31.100 metric 100
第一行就是默认路由。
各字段可以这样理解:
| |
|---|
default | |
via 192.168.31.1 | |
dev eth0 | |
proto dhcp | 这条路由来自 DHCP;手工添加时可能显示为 static |
metric 100 | |
手动添加默认网关,本质就是添加默认路由:
ip route add default via 192.168.31.1 dev eth0
删除默认路由:
ip route del default via 192.168.31.1
或者删除所有默认路由:
ip route del default
排查时我更建议先看系统实际会怎么选路:
ip route get 8.8.8.8
这条命令会直接告诉你访问 8.8.8.8 时会走哪块网卡、哪个源地址、哪个下一跳。比单纯盯着配置文件更接近真相。
五、配置文件里的网关,不等于当前正在生效的网关
很多人改了配置文件,以为网络已经变了;也有人只改了当前路由表,重启后发现配置又回去了。
要区分两个层面:
当前生效的是内核路由表,可以用 ip route 看。
持久化的是发行版网络配置,重启网络服务或重启机器后会重新生成路由表。
常见位置大概是:
- CentOS/RHEL 6、7 常见于
/etc/sysconfig/network-scripts/ifcfg-*,例如 GATEWAY=192.168.31.1。 - RHEL 8/9、CentOS Stream 等更推荐通过 NetworkManager 管理,例如
nmcli connection modify ... ipv4.gateway ...。 - Ubuntu/Debian 使用 netplan 时,旧写法可以看到
gateway4,新配置更推荐用 routes 写默认路由。 - systemd-networkd 通常在
.network 文件里配置 Gateway= 或 [Route]。
所以排查网关时,不要只问“配置文件写了什么”,还要问“现在内核路由表里到底是什么”。
六、先记住这 5 句话
- Linux 里常说的默认网关,本质通常是默认路由的下一跳。
- 普通以太网场景下,网关要和本机某个地址二层可达,通常表现为同网段。
- 配置文件负责持久化,
ip route 看到的路由表才是当前生效结果。
上篇先把地基打牢。下篇我们继续看几个日常运维里最常见的坑:多默认网关、网关能 ping 通但外网不通、ARP 缓存异常,以及策略路由里的多网关。