Linux中查看MTU用ip link show,修改用ip link set dev eth0 mtu N,需配合ping -M do -s测试路径真实MTU,并通过对应网络管理器配置文件实现永久生效。

Linux 查看和修改 MTU 不需要装额外工具,ip 命令就能搞定;但直接改完不验证、不持久化、不匹配路径实际限制,反而容易引发连接中断或分片丢包。
用 ip link show 查看所有接口的 MTU 值
运行 ip link show 会列出全部网络设备,每块网卡的输出中紧挨着 mtu 字样后面的数字就是当前 MTU 值。例如:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
注意:ip link show up 只显示已启用的接口,适合快速筛查活跃链路;如果看到某接口 state DOWN 却又需要调 MTU,得先 sudo ip link set dev eth0 up 启用它。
别用 ifconfig —— 它在多数现代发行版里已被弃用,且输出格式不统一,grep MTU 容易漏掉虚拟接口或 bond 设备。
用 ping -M do -s 诊断路径真实 MTU
接口 MTU 是本地设置,不代表整条路径能通多大包。常见症状如“能 ping 通但 HTTPS 打不开”“SSH 连接卡住”,往往是因为中间某个节点(比如运营商网关、防火墙、VXLAN 封装层)MTU 更小,导致带 DF 标志的包被丢弃。
执行这个命令测通路上的最大不分片包大小:
ping -M do -s 1472 example.com
如果返回 Packet needs to be fragmented but DF set,说明当前值超限,逐步减小 -s 值(如 1452、1432),直到成功收到 reply;再加 28(IP 头 20B + ICMP 头 8B)即为路径 MTU。
- 1472 + 28 = 1500 → 典型以太网环境
- 1392 + 28 = 1420 → 常见于 PPPoE 或某些云平台隧道封装
- 8972 + 28 = 9000 → 确认巨帧(Jumbo Frame)端到端就绪
这一步跳过,直接硬设 mtu 9000 却没检查交换机/对端是否支持,会导致大量连接失败。
用 ip link set dev xxx mtu N 临时修改 MTU
修改立即生效,无需重启网络服务,但重启后丢失:
sudo ip link set dev eth0 mtu 1420
关键约束条件:
- 新值必须 ≥ 128(内核最小允许值),≤ 65535(理论最大)
- 不能大于底层物理设备能力(如某些千兆网卡固件限制最大 9000)
- 若该接口被
NetworkManager或systemd-networkd管理,改完可能被几秒后自动覆盖 —— 调试时建议先停掉:sudo systemctl stop NetworkManager - 修改前确认无活跃 TCP 连接依赖旧 MTU,否则已有连接可能卡死(尤其是长连接、数据库连接)
改完立刻用 ip link show eth0 核对,再用上面的 ping -M do -s 验证是否真能通。
让 MTU 修改永久生效的配置方式
不同发行版写法差异大,核心原则是:别只改 /etc/network/interfaces 或只改 ifcfg-eth0,得看系统实际用哪个网络管理器。
Ubuntu/Debian(使用 ifupdown):
echo 'mtu 1420' | sudo tee -a /etc/network/interfaces.d/eth0.cfg
CentOS/RHEL(使用 network-scripts):
echo 'MTU=1420' | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-eth0
Systemd-networkd 环境(如 Ubuntu Server 22.04+ 默认):
echo 'MTUBytes=1420' | sudo tee -a /etc/systemd/network/10-eth0.network
改完必须重载对应服务:
- ifupdown:
sudo ifdown eth0 && sudo ifup eth0 - network-scripts:
sudo systemctl restart network - systemd-networkd:
sudo systemctl restart systemd-networkd
最容易被忽略的是:改了配置文件却忘了 reload 服务,或者 reload 了错误的服务(比如改了 ifcfg-eth0 却去 restart NetworkManager),结果 MTU 仍是旧值。


















