在网络管理中,最大传输单元是一个至关重要的参数,它定义了网络层一次可以传输的数据包的最大尺寸,通常以字节为单位,默认情况下,大多数以太网设备的MTU值被设置为1500字节,在某些特定场景下,如配置VPN、使用特定的网络存储或进行网络性能优化时,调整MTU值是必要的,本文将详细介绍在CentOS系统中检查、临时和永久设置网卡MTU值的方法。
理解MTU及其影响
将网络数据传输想象成用卡车运送货物,MTU就好比是每辆卡车的最大载重量,如果一批货物(一个完整的数据包)超过了卡车的载重,就必须将其拆分成多个小批次(分片)进行运输,到达目的地后再重新组装,这个过程会增加网络设备的处理负担,并可能导致延迟增加或数据包丢失,反之,如果MTU设置得过小,虽然不会发生分片,但因为需要运输的“车次”变多,同样会降低传输效率,找到一个合适的MTU值对于网络性能至关重要。
检查当前MTU设置
在进行任何更改之前,首先需要了解当前网卡的MTU设置,CentOS提供了多种命令来查看这一信息。
使用 ip
命令(推荐)
ip
命令是现代Linux发行版中用于网络配置和显示的标准工具,功能强大。
ip addr show
或者更简洁地,只查看特定网卡(eth0
):
ip addr show eth0
在输出结果中,您会看到类似 mtu 1500
的字段,这表明该网卡当前的MTU值为1500。
使用 ifconfig
命令
ifconfig
是一个较为传统的工具,虽然在较新的系统中逐渐被 ip
命令取代,但因其简洁的输出,仍被广泛使用。
ifconfig
输出结果中同样会包含 MTU:1500
这样的信息。
临时设置MTU
临时设置MTU主要用于测试目的,该设置在系统重启后会失效,这对于验证某个MTU值是否能解决网络问题非常有用。
使用 ip
命令可以轻松地临时修改MTU,语法如下:
ip link set dev [网卡名称] mtu [数值]
要将网卡 eth0
的MTU临时设置为1400,可以执行:
sudo ip link set dev eth0 mtu 1400
执行后,可以再次使用 ip addr show eth0
命令来确认MTU值是否已经更改,这个更改是临时的,重启网络服务或重启系统后,MTU会恢复到原来的值。
永久设置MTU
为了让MTU设置在系统重启后依然生效,需要修改网络配置文件,根据CentOS版本的不同,配置方法有所区别。
适用于 CentOS 7/8 (NetworkManager)
现代的CentOS版本普遍使用NetworkManager来管理网络,推荐使用其命令行工具nmcli
进行配置,这是最稳定和标准的方法。
查看网络连接的名称:
nmcli connection show
您会看到一个连接列表,找到您要修改的网卡对应的连接名称(
System eth0
或Wired connection 1
)。修改连接的MTU设置:
假设连接名称为System eth0
,要将MTU设置为1400,执行以下命令,通常需要同时设置IPv4和IPv6的MTU。sudo nmcli connection modify "System eth0" ipv4.mtu 1400 sudo nmcli connection modify "System eth0" ipv6.mtu 1400
重新激活网络连接以应用更改:
sudo nmcli connection up "System eth0"
完成以上步骤后,MTU设置将被永久保存。
适用于 CentOS 6/7 (编辑网络脚本)
对于不使用NetworkManager或采用传统网络配置方式的系统,可以直接编辑网卡配置文件。
找到并编辑配置文件:
配置文件位于/etc/sysconfig/network-scripts/
目录下,文件名通常为ifcfg-[网卡名称]
,对于eth0
网卡,文件是ifcfg-eth0
。sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0
在文件中添加或修改MTU参数:
在文件末尾或适当位置添加以下行:MTU=1400
保存并退出编辑器,然后重启网络服务:
- 在 CentOS 7 上:
sudo systemctl restart network
- 在 CentOS 6 上:
sudo service network restart
- 在 CentOS 7 上:
最佳实践与测试
设置完MTU后,进行有效的测试是必不可少的。ping
命令是一个绝佳的测试工具,它可以指定数据包大小并禁止分片。
测试MTU是否为1500的命令如下:
ping -M do -s 1472 [目标IP或域名]
这里需要解释一下参数:
-M do
:表示禁止分片,如果数据包大小超过了路径上某个设备的MTU,ping会失败并显示“Message too long”。-s 1472
:指定发送的ICMP数据包大小为1472字节。- 为什么是1472?因为IP头(20字节) + ICMP头(8字节) = 28字节,数据包大小 + 28 = 总的IP包大小。
1472 + 28 = 1500
。
如果这个命令能成功通,说明路径MTU至少是1500,如果失败,可以逐步减小 -s
后的数值,直到找到能成功通过的最大值,然后加上28,就是您当前网络路径的有效MTU值。
相关问答FAQs
问题1:为什么我在修改MTU后,访问某些网站变得很慢或者无法访问,但其他网站正常?
解答: 这种现象通常是“路径MTU发现”机制出现了问题,当您本地设备的MTU设置得过大,而通往某个特定服务器的网络路径中存在一个MTU较小的设备(如VPN网关或某些路由器)时,您发送的大数据包会被该设备丢弃,正常情况下,该设备会返回一个ICMP“需要分片”的报文,您的系统收到后会自动调整后续数据包的大小,这就是PMTUD,但如果中间的防火墙阻止了这种ICMP报文,PMTUD就会失败,导致连接超时或性能急剧下降,解决方法是:1)将本地MTU设置为一个保守的值(如1400);2)检查并放行ICMP Type 3 Code 4的报文。
解答: ifconfig
来自于较旧的 net-tools
软件包,而 ip addr
来自于功能更强大的 iproute2
软件包,在显示MTU方面,两者都能提供基本的信息。iproute2
是当前Linux网络配置的未来和标准,它支持更多现代网络功能(如策略路由、网络命名空间等),并且其输出信息更为详细和精确,强烈建议在日常管理和脚本编写中优先使用 ip
命令族,以确保更好的兼容性和功能完整性。ifconfig
在很多现代发行版中已不再是默认安装项。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复