可靠确认mtu值须用ip link show dev eth0查紧邻接口名行的mtu字段;临时修改需确保接口up、未被networkmanager等覆盖、无驱动限制;长期生效应通过nmcli或配置文件修改并重载连接。

直接改 ip link set dev eth0 mtu 1450 很可能不生效,不是命令写错了,而是系统在背后悄悄把它“还原”了。
怎么确认当前 MTU 值才可靠
别信 ifconfig 或 ip addr show 的输出——它们可能省略或缓存 MTU 字段。唯一稳定可信的方式是:
- 运行
ip link show dev eth0,找紧挨着接口名那行里的mtu 1500 - 若查所有接口,用
ip link show | grep -E '^[0-9]+:|mtu',避免漏掉 DOWN 状态但 MTU 仍有效的接口(比如刚插拔的网卡) -
lo接口默认是 65536,不能当物理网卡参考;容器里看到的值,未必等于 host 上的值
临时修改后没变化?先排查这三件事
命令执行无报错 ≠ 实际生效。常见静默失败点:
- 接口处于
DOWN状态:ip link set dev eth0 mtu 1450要求接口已UP,否则直接忽略 - 被 NetworkManager 或 systemd-networkd 覆盖:它们会在几秒内把 MTU 拉回配置文件设定值,
nmcli device show eth0 | grep MTU可验证是否被接管 - 驱动/虚拟化限制:VMware Workstation 旧版、某些 SmartNIC 卡、Docker Desktop 内置 Linux 子系统,设 9000 可能完全无效
用 nmcli 修改 MTU 是最稳的长期方案
如果你的系统启用了 NetworkManager(桌面环境、多数云镜像默认开启),优先走 nmcli 路径,它比手改配置文件更安全,也比 ip link set 更持久:
- 确认服务运行:
systemctl is-active NetworkManager返回active才继续 - 查当前激活连接名:
nmcli c s --active,别直接用设备名(如ens33),要用连接名(可能是System ens33) - 执行修改:
sudo nmcli connection modify "System ens33" ipv4.mtu 1450,IPv6 同理加ipv6.mtu - 必须 reload + down/up:
sudo nmcli connection reload && sudo nmcli connection down "System ens33" && sudo nmcli connection up "System ens33"
永久生效≠改完就完事,路径和验证缺一不可
Netplan、ifcfg、interfaces 这些配置文件只管“重启后”,不管“现在是否真用上了”。容易忽略的关键点:
- Ubuntu/Debian(Netplan):改
/etc/netplan/*.yaml,在对应 interface 下加mtu: 1450,然后sudo netplan apply—— 不执行这步,配置只是躺在磁盘上 - RHEL/CentOS:改
/etc/sysconfig/network-scripts/ifcfg-eth0,加MTU=1450,再sudo systemctl restart NetworkManager或network(取决于谁在管) - 验证永远用
ip link show dev eth0 | grep mtu,别只看配置文件或nmcli输出,因为最终生效的是内核链路层视图
MTU 不是调大就快,真实可用值由整条路径最小节点决定;哪怕你设了 9000,只要中间某台防火墙或云厂商网关只认 1450,大包就会被丢且不提示——所以务必用 ping -M do -s 1422 x.x.x.x 这类带 -M do 的测试去实锤,而不是凭经验拍脑袋。











