为什么MTU设置1500就会导致网络异常无法连接?

moen 2026-06-20 10:10 1

更新


经过更加细致的测试。发现如果网卡MTU 1500 就无法与TLS 1.3完成握手

使用-tls-max 1.2限制为1.2就正常,或者把网卡MTU改小也正常。




很奇怪。今天到手新服务器。下载点东西发现一直卡住,用CURL测试了下是TLS握手失败。 用http协议的话可以正常连接

ifconfig enp35s0 mtu 1472 用这个命令把网卡MTU改为1472就可以连接


10:07:34.109952 [0-0] * [HTTPS-CONNECT] adding wanted h2
10:07:34.110081 [0-0] * [HTTPS-CONNECT] added
10:07:34.110181 [0-0] * [HTTPS-CONNECT] connect, init
10:07:34.110346 [0-0] * Trying x.x.x.x:443...
10:07:34.110528 [0-0] * [HTTPS-CONNECT] connect -> 0, done=0
10:07:34.110625 [0-0] * [HTTPS-CONNECT] Curl_conn_connect(block=0) -> 0, done=0
10:07:34.110771 [0-0] * [HTTPS-CONNECT] adjust_pollset -> 1 socks
10:07:34.139691 [0-0] * ALPN: curl offers h2,http/1.1
10:07:34.140403 [0-0] * TLSv1.3 (OUT), TLS handshake, Client hello (1):
10:07:34.157780 [0-0] * CAfile: /etc/ssl/certs/ca-certificates.crt
10:07:34.157861 [0-0] * CApath: /etc/ssl/certs
10:07:34.157954 [0-0] * [HTTPS-CONNECT] connect -> 0, done=0
10:07:34.158040 [0-0] * [HTTPS-CONNECT] Curl_conn_connect(block=0) -> 0, done=0
10:07:34.158144 [0-0] * [HTTPS-CONNECT] adjust_pollset -> 1 socks
10:07:35.159842 [0-0] * [HTTPS-CONNECT] connect -> 0, done=0
10:07:35.159981 [0-0] * [HTTPS-CONNECT] Curl_conn_connect(block=0) -> 0, done=0
10:07:35.160097 [0-0] * [HTTPS-CONNECT] adjust_pollset -> 1 socks


然后搜了下建议我改下MTU大小。默认是1500.经过我的测试 1472是个阈值。超过就无法连接

为什么会这样?看了下我其他服务器都是1500的MTU没有问题。头一次遇到这种的。很疑惑。


➜  ~ ping 1.1.1.1 -s 1472
PING 1.1.1.1 (1.1.1.1) 1472(1500) bytes of data.
1480 bytes from 1.1.1.1: icmp_seq=1 ttl=60 time=1.61 ms
1480 bytes from 1.1.1.1: icmp_seq=2 ttl=60 time=1.60 ms
^C
--- 1.1.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 1.601/1.605/1.610/0.004 ms
➜ ~ ping 1.1.1.1 -s 1473
PING 1.1.1.1 (1.1.1.1) 1473(1501) bytes of data.
^C
--- 1.1.1.1 ping statistics ---
18 packets transmitted, 0 received, 100% packet loss, time 17393ms

最新回复 (14)
  • rosnode 06-20 10:13
    1

    因为你的加密协议会增加包头数据,数据包超过最大允许的MTU,就会被分片。所以要降低MTU。根据你的路由系统也可以自动探测,例如ROS可以ChangeMSS,Openwrt可以开启MSS钳制。

  • 2bjx3ren 06-20 10:14
    2

    安全点就1420比较合适,通用

  • bncfbb 06-20 10:15
    3

    看起来mtu没问题,payload 1472字节+20字节IP头+8字节ICMP头正好=1500字节

  • moen 楼主 06-20 10:16
    4

    @rosnode #1


    这个是商家的问题吗。看包太大了直接丢弃了。 ^-^ 头一次遇到。看了下其他的VPS,一大半都是1500的。

    斯巴达甚至5000的都能发出去


    ping 1.1.1.1 -s 5000
    PING 1.1.1.1 (1.1.1.1) 5000(5028) bytes of data.
    5008 bytes from 1.1.1.1: icmp_seq=1 ttl=61 time=0.993 ms
    5008 bytes from 1.1.1.1: icmp_seq=2 ttl=61 time=0.981 ms
    5008 bytes from 1.1.1.1: icmp_seq=3 ttl=61 time=0.936 ms



    编辑:又试了下这样也是不行的


    ping -M do -s 1473 1.1.1.1
    PING 1.1.1.1 (1.1.1.1) 1473(1501) bytes of data.
    ping: local error: message too long, mtu=1500
    ping: local error: message too long, mtu=1500

  • MT5 06-20 10:17
    5

    为什么甲骨文默认9000

  • rosnode 06-20 10:18
    6

    其实也不是什么问题 设置不一样罢了。有的鸡还按连续包大小动态限速呢。有的鸡强制ping劫持,有的鸡DNS劫持。都有。

  • zenxds 06-20 10:20
    7

    问下AI


    网络传输是跨越千山万水的,数据包从你的服务器出发,要经过无数个路由交换设备。决定你能发多大包的,不是你服务器的 MTU,而是整条路径上“最窄的那条路”(Path MTU)。


    你的其他服务器和这台新服务器可能处于不同的机房、不同的机架,或者走的是不同的网络运营商/上联链路。

    新服务器上游的某个网络节点(比如机房的交换机、运营商的隧道、或者防火墙)可能使用了某种封装技术:


    PPPoE 拨号(常见于某些非独立线机房):会占用 8 字节,MTU 变成 1492。


    VXLAN / GRE / IPsec 隧道:云厂商或数据中心内部常用的虚拟化技术,会额外占用 20~50 字节的头部。


    如果中间某个路由器的 MTU 只有 1450,而你的服务器硬要发 1500 的大包,且带了 DF(Don't Fragment,不可分片) 标记,这个路由器就会直接把包丢弃。



    1. 为什么 ping -s 1472 成功,说明 MTU 是 1500?在以太网中,数据的计算公式是:$$\text{总包大小 (MTU)} = \text{ICMP 负载 (-s)} + \text{ICMP 头部 (8 字节)} + \text{IP 头部 (20 字节)}$$你测试的时候:当 -s 1472 时:$1472 + 8 + 20 = 1500$ 字节。数据包刚好是 1500,顺利通关。当 -s 1473 时:$1473 + 8 + 20 = 1501$ 字节。超过了 1500,网络开始丢包。这证明你服务器网卡的默认 MTU 确实是 1500。

  • moen 楼主 06-20 10:22
    8

    @bncfbb #3


    很奇怪。搜了下LINUX是会自动分包的啊


    > sysctl net.ipv4.tcp_mtu_probing 
    net.ipv4.tcp_mtu_probing = 1

    我这个不知道为什么没效果。部分网站https没法握手。有的可以有的不行

  • vhyaho1-0 06-20 10:22
    9

    我设置1400,但是udp还是不可用,后面就禁止了udp

  • moen 楼主 06-20 10:24
    10

    @bncfbb #3


    ifconfig enp35s0 mtu 1472 用这个命令把网卡MTU改为1472,明明更小了。但是https反而可以连接了

  • bncfbb 06-20 10:31
    11

    @moen #10 那看起来商家网络中间有隧道占用mtu,网卡mtu改回1500试试ping -M do -s 1472 1.1.1.1能不能通,之前在y系vps上遇到过这情况 ^-^

  • moen 楼主 06-20 10:40
    12

    得到这种奇怪的结果

    1500 可以ping大包没法连接网站。1472ping不了大包。可以连网站


    ➜  ~ ifconfig enp35s0 mtu 1500  
    ➜ ~ ping -M do -s 1472 1.1.1.1
    PING 1.1.1.1 (1.1.1.1) 1472(1500) bytes of data.
    1480 bytes from 1.1.1.1: icmp_seq=1 ttl=60 time=1.54 ms
    1480 bytes from 1.1.1.1: icmp_seq=2 ttl=60 time=1.75 ms
    1480 bytes from 1.1.1.1: icmp_seq=3 ttl=60 time=1.52 ms
    1480 bytes from 1.1.1.1: icmp_seq=4 ttl=60 time=1.54 ms
    ^C
    --- 1.1.1.1 ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 3007ms
    rtt min/avg/max/mdev = 1.521/1.588/1.752/0.094 ms

    ➜ ~ curl https://45.45.xxx.xxx/ --tls-max 1.3 -k
    ^C
    ➜ ~ ifconfig enp35s0 mtu 1472
    ➜ ~ ping -M do -s 1472 1.1.1.1
    PING 1.1.1.1 (1.1.1.1) 1472(1500) bytes of data.
    ping: sendmsg: Message too long
    ping: sendmsg: Message too long
    ping: sendmsg: Message too long
    ^C
    --- 1.1.1.1 ping statistics ---
    3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2052ms

    ➜ ~ curl https://45.45.xxx.xxx/ --tls-max 1.3 -k

    <?xml version="1.0" encoding="UTF-8"?><Error><Code>AccessDenied</Code>

  • moen 楼主 06-20 10:47
    13

    不纠结了艹。改成1450用了。出问题了再说

  • Coremark 06-20 10:54
    14

    小可以,大了不行,在搭建链式代理的过程中也要注意

* 帖子来源NodeSeek
返回