NiceLeeのBlog 用爱发电 bilibili~

备忘录 MTU设置错误导致TCP连接异常

2024-10-25
nIceLee

阅读:


背景:有一台公益机器,以前运行一切正常。但是母鸡的服主是个爱折腾的人,经常搞些配置调优什么的。 突然某一天,HTTP服务失联了。排查了半天,22、80、443端口全都能TCP ping通,SSH也能连接上,但是网页就是访问不了。
然后,偶然发现使用HTTP访问443端口能出现nginx报错的页面。
以及,在SSH操作过程中,cat显示文件信息或者vi进行修改都会使得整个SSH链接“宕机”,只能关闭重来。
但使用tail命令就还好。
搜索试了一下,解决了问题(用break不太妥当,尊重事实就不在事后修改了)。
ssh break when using cat or vi

问题原因

下面摘抄了【大咖讲网络】MTU导致的悲剧的一段话,感觉讲得蛮清楚的。

MTU带来的问题实在太多了,但凡做过运维、实施或者技术支持的工程师,或多或少都会遇到。
一个典型的MTU问题发生在两个子网的MTU大小不一样的网络环境中。

当客户端发给服务器的巨帧经过路由器时,或者被丢包,或者被分片。 这取决于该巨帧是否在网络层携带了DF(Don’t fragment)标志。 如果带了就被丢弃,如果没带就被分片。
分片的情况往往被忽略,因为它只影响一点点性能,大多数时候甚至察觉不出。
丢包的情况就无法忽略了,因为丢包之后再重传多少遍都没用,会一直丢,整个传输就像掉进了黑洞,所以往往会导致严重的后果。

情况对于服务器到客户端同样适用。

解决方案

参考SSH traffic over openvpn connection freezes when I cat a file, 将MTU适当调整。

sudo ip link set dev {tun0} mtu 1350 && echo ":)"

操作记录

root@Plutonus:~# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: eth0@if71: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue state UP group default qlen 1000
    link/ether {Mac 脱敏} brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 {IPv6 脱敏}/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 {IPv6 脱敏}/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether {Mac 脱敏} brd ff:ff:ff:ff:ff:ff
    inet {IPv4 脱敏}/16 brd {IPv4 脱敏} scope global docker0
       valid_lft forever preferred_lft forever
       
root@Plutonus:~# sudo ip link set dev eth0 mtu 1350 && echo ":)"
:)

root@Plutonus:~# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: eth0@if71: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1350 qdisc noqueue state UP group default qlen 1000
    link/ether {Mac 脱敏} brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 {IPv6 脱敏}/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 {IPv6 脱敏}/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether {Mac 脱敏} brd ff:ff:ff:ff:ff:ff
    inet {IPv4 脱敏}/16 brd {IPv4 脱敏} scope global docker0
       valid_lft forever preferred_lft forever
root@Plutonus:~# 

相似文章

内容
隐藏