MENU

记一次MTU设置不当导致众多网页无法打开

前言

在上一篇Ubuntu 搭建 PPTP VPN 服务又用到设置 MTU,当初看到参考网上例子就设置成1200,但是用的时候出现很大问题。

  • 在手机上连接VPN后,基本上所有的网站都开源访问。
  • 电脑上,连接VPN后出现很多网站访问不了的情况,挂上科学上网后又是无法访问。(一开始,我怀疑是办公室网络问题)

经过网上查找相关的搭建方法,发现设置MTU包的大小的时候,有好多个版本,不懂MTU包的设置,便查找MTU的解析咯。

MTU及MSS介绍

  • MTU,即Maximum Transmission Unit(最大传输单元),此值设定TCP/IP协议传输数据报时的最大传输单元。在默认情况下,TCP/IP在网络中的最大传输单元为1500。例如默认的MTU值为1500字节,那么当传送的数据大于1500时,则会以此为标准,将其分封个若干个1500字节,然后进行封包、解包操作。由此看来,MTU值的大小会影响到封包和解包操作的频率。
  • MSS,即Maximum Segment Size(最大分段大小),MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能,TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。
  • MTU以及MSS之间的关系: MTU = MSS + 20字节的IP数据包包头 + 20字节的TCP数据段的包头

问题解决

用一台设备连接上VPN,然后再提供VPN服务的那台主机上运行netstat –i查看连接情况

输出结果如下

[root@itohost ~]# netstat -i
Kernel Interface table
Iface       MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0       1500   0 562251169      0      0      0 505131403      0      0      0 BMRU
eth1       1500   0  6240518      0      0      0  3827401      0      0      0 BMRU
lo        65536   0    378756      0      0      0    378756      0      0      0 LRU
ppp0       1396   0    56154      0      0      0    77684      0      0      0 MOPRU

其中ppp0即为VPN连接,可以看到MTU为1396,也就是按照上面的计算公式的话:
MSS = 1396 - 20 - 20 = 1356才对是吧,而当初我设置MSS时候设置的是1200。

将上一篇文章的中设置MSS的修改为如下:

iptables -A FORWARD -p tcp --syn -s 192.168.0.0/24 -j TCPMSS --set-mss 1356

聊聊为什么之前MSS设置为1200会出现网络无法访问?

首先,通过netstat –i查看连接情况,我们可以连接VPN的设备的MTU为1396(也就是说MSS为1356),而我在提供VPN服务的服务器上的MSS设置为1200(MTU为1240),那么问题来了(下面直接用MTU来说)。

MTU:           1396      ->     1240
设备:        连接VPN的设备       VPN服务器

假如我连接VPN的设备发送一个1500的ip数据包,因为它(1500) > 设备的MTU(1396),所以是需要拆包处理,拆成( 1396 + 104 )两个数据包,OK,到这里,整个路由拆包装包都是没有问题,但是当设备传送到VPN服务器时候,VPN设置的MTU为1240,那么对于1396这个数据包是一个完整的、不可以在分割的一个数据包,那么传送的时候就是产生丢包(1396-1240=156),多余的156个字节的数据包则会被丢包,此时,连接VPN的设备少了156个字节的数据包就会使得上网出现种种问题。

返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码