当前位置:首页>Linux>Linux 网关到底是什么?别再把它当成“必填项”了(上)

Linux 网关到底是什么?别再把它当成“必填项”了(上)

  • 2026-10-11 07:33:17
Linux 网关到底是什么?别再把它当成“必填项”了(上)

做 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
下一跳地址,也就是常说的网关 IP
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 句话

  1. Linux 里常说的默认网关,本质通常是默认路由的下一跳。
  2. 只访问同网段机器,不需要默认网关。
  3. 访问其他网段需要路由,默认网关只是兜底路由。
  4. 普通以太网场景下,网关要和本机某个地址二层可达,通常表现为同网段。
  5. 配置文件负责持久化,ip route 看到的路由表才是当前生效结果。

上篇先把地基打牢。下篇我们继续看几个日常运维里最常见的坑:多默认网关、网关能 ping 通但外网不通、ARP 缓存异常,以及策略路由里的多网关。

END

往期推荐

为什么 Linux 没有 .exe?一文讲懂 Linux 到底怎么运行程序

为什么 Linux 要用“挂载”?而不是直接显示 C 盘、D 盘?

一文搞懂Linux磁盘结构与管理:物理磁盘、分区表、文件系统全梳理

Linux 系统中的用户、用户组以及权限管理:从入门到搞懂,其实没那么绕

为什么 Linux 的目录这么奇怪?终于有人讲明白了

重新理解 Linux 网络(一):IP 地址不是机器的门牌号

重新理解 Linux 网络(二):IP 配好了,为什么还是不通?

为什么运维都要学 Shell?终于有人讲明白了

最新文章

随机文章