TCPMSS太大,VPN为什么不能用

178 views
Skip to first unread message

Bojie Li

unread,
Oct 11, 2012, 11:45:06 AM10/11/12
to USTC_LUG
我在学校某服务器配了个VPN(违反校纪校规的事,不要举报我……),用的是pptpd。
配好iptables的转发之后发现,能够ping通,但用nc发任何到80的HTTP请求都不行,header较小的返回400 Bad
Request,header较大的就没有响应了;FTP比较能说明问题,一个连接列几次目录就不能用了。因此我怀疑是每个连接只能发出/收到最初的几个包。用tcpdump抓了一下包,果然是在几个回合的发包收包之后就不再能收到数据包了。由于我不懂tcpdump,所以没能从里面发现什么问题。

准备放弃的时候,从网上找到了这样一条神奇的命令:
sudo iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 128
然后一切都正常了。

开始的时候,我自作主张地“简化”了上述命令,结果发现只有HTTP请求能够正常访问,SSH就不行。
sudo iptables -A FORWARD -p tcp --syn -j TCPMSS --set-mss 128
如果把上面的128改成1300,也是正常的;如果改成1400,HTTP就会特别慢;如果改成1500就收不到回复了。

问题1:上面两条命令有什么区别?iptables的文档太长了。

问题2:为什么减小MSS,VPN的数据包就能发过去了?

问题3:TCP的MSS似乎是协商控制分片大小的,为什么VPN服务器不对过大MSS的TCP数据包进行分片?查到IP包头里有一个DF(Donot
Fragment),上层应用为什么要强制禁止分片?

iptables的man里有专门一段说这个问题,求解释:
TCPMSS
This target is used to overcome criminally braindead ISPs or
servers which block "ICMP Fragmentation Needed" or "ICMPv6 Packet Too
Big" packets. The symp‐
toms of this problem are that everything works fine from your
Linux firewall/router, but machines behind it can never exchange large
packets:
1) Web browsers connect, then hang with no data received.
2) Small mail works fine, but large emails hang.
3) ssh works fine, but scp hangs after initial handshaking.
Workaround: activate this option and add a rule to your
firewall configuration like:

iptables -t mangle -A FORWARD -p tcp --tcp-flags
SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

================
本地内核路由表(我加了一条202.38.0.0/16的网关)
$ sudo route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 303 0 0 wlan0
192.168.1.0 0.0.0.0 255.255.255.0 U 303 0 0 wlan0
192.168.101.1 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0
202.38.0.0 192.168.101.1 255.255.0.0 UG 0 0 0 ppp0
VPN的IP 192.168.1.1 255.255.255.255 UGH 0 0 0 wlan0

本地ppp配置文件
$ cat /etc/ppp/peers/ustc
# written by pptpsetup
pty "pptp VPN的IP --nolaunchpppd"
lock
noauth
nobsdcomp
nodeflate
name ustclug
remotename ustc
ipparam ustc
require-mppe-128

VPN服务器的配置(除了fail2ban以外,没有设置其他拒绝规则)
$ sudo iptables -t nat -L -v
Chain PREROUTING (policy ACCEPT 1154 packets, 81536 bytes)
pkts bytes target prot opt in out source
destination

Chain POSTROUTING (policy ACCEPT 31 packets, 2317 bytes)
pkts bytes target prot opt in out source
destination
833 52507 MASQUERADE all -- any eth0 192.168.100.0/24
anywhere

Chain OUTPUT (policy ACCEPT 31 packets, 2317 bytes)
pkts bytes target prot opt in out source destination

WindyWinter

unread,
Oct 11, 2012, 11:49:46 AM10/11/12
to ustc...@googlegroups.com

我不记得是谁的bug了,反正连接时双方是不做mtu商议的。那个值是算出来的,一般设为1356就可以。

-- 来自USTC LUG
请使用gmail订阅,不要灌水。
更多信息more info:http://groups.google.com/group/ustc_lug?hl=en?hl=en

Bojie Li

unread,
Oct 11, 2012, 11:55:25 AM10/11/12
to ustc...@googlegroups.com
我试了一下,
sudo iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1356
sudo iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j
TCPMSS --clamp-mss-to-pmtu
都不行。

下面的就可以:
sudo iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j
TCPMSS --set-mss 128

加不加mangle的区别就是放的table不一样吧,默认是filter表,改放到mangle表不会在效果上有什么区别吧。

2012/10/11 WindyWinter <bsl...@gmail.com>:

WindyWinter

unread,
Oct 11, 2012, 12:04:37 PM10/11/12
to ustc...@googlegroups.com

如果是链路特殊,需重新计算。放在filter中是对的,不需要mangle。

WindyWinter

Bojie Li

unread,
Oct 11, 2012, 12:18:44 PM10/11/12
to ustc...@googlegroups.com
那为什么man iptables给出的例子放在了mangle表呢……我想问这两种方式有区别吗?

WindyWinter

unread,
Oct 11, 2012, 12:20:42 PM10/11/12
to ustc...@googlegroups.com

大概与mangle和filter的原意有关吧,不过实际上能放在filter 的大家就不去动mangle。

Bojie Li

unread,
Oct 11, 2012, 12:22:42 PM10/11/12
to ustc...@googlegroups.com
如何重新计算?根据什么来计算?

我所在的链路没什么特殊的啊,合肥ADSL,通过无线路由器共享宽带,pptpd
server在网络中心,所要访问的目标IP在少院。我觉得最有可能搞鬼的地方,一是运营商,而是无线路由器。

WindyWinter

unread,
Oct 11, 2012, 12:25:49 PM10/11/12
to ustc...@googlegroups.com

我不记得怎么算了,我的草稿纸上只剩1396这个数了。

Bojie Li

unread,
Oct 11, 2012, 12:43:55 PM10/11/12
to ustc...@googlegroups.com
翻了一下《TCP/IP卷1》,在数据链路层,以太网帧和802.3帧的MTU(最大传输单元)分别是1500和1492字节。减掉20字节的IP包头,20字节的TCP包头,就是最大分片大小MSS了吧。还是算不出1356啊。

WindyWinter

unread,
Oct 11, 2012, 12:45:37 PM10/11/12
to ustc...@googlegroups.com

pptp本身就是数据链路层协议,1396可能是它的mtu。

Bojie Li

unread,
Oct 11, 2012, 12:56:21 PM10/11/12
to ustc...@googlegroups.com
我当时怎么没ping -s来测试一下哪个MTU是分界点呢!不过有一点很蹊跷:在MSS=1356的情况下,用curl观察到HTTP
GET请求正常,但SSH就连接不上去。难道两个数据传输方向的MSS不一样?

WindyWinter

unread,
Oct 11, 2012, 12:57:53 PM10/11/12
to ustc...@googlegroups.com

这个我理解不了了,pptp不存在链路不对称的问题。

Bojie Li

unread,
Oct 12, 2012, 1:47:55 AM10/12/12
to USTC_LUG
谁能解释一下MSS的原理和我最初的几个问题?谢谢

WindyWinter

unread,
Oct 12, 2012, 1:59:44 AM10/12/12
to ustc...@googlegroups.com
--syn和--tcp-flags SYN,RST SYN是一样的。

Soli Deo gloria.

WindyWinter
Email: wi...@ream.at
梦.:如此短暂: http://d.ream.at


2012/10/12 Bojie Li <boj...@gmail.com>
谁能解释一下MSS的原理和我最初的几个问题?谢谢

WindyWinter

unread,
Oct 12, 2012, 2:03:04 AM10/12/12
to ustc...@googlegroups.com
哦,错了,--syn和--tcp-flags SYN,RST,ACK,FIN SYN是一样的。


Soli Deo gloria.

WindyWinter
Email: wi...@ream.at
梦.:如此短暂: http://d.ream.at


2012/10/12 WindyWinter <wi...@ream.at>

wzyboy

unread,
Oct 12, 2012, 3:00:07 AM10/12/12
to ustc...@googlegroups.com
非 USTC 学生表示好奇:为啥搭 VPN 是违反校规的?国内服务器上装 VPN 没有翻墙的功效吧……
~~~~
wzyboy
Link:
http://wzyboy.im/
Twitter: @wzyboy
Chatback:
http://wzyboy.im/chat



2012/10/11 Bojie Li <boj...@gmail.com>
我在学校某服务器配了个VPN(违反校纪校规的事,不要举报我……),用的是pptpd。

Bojie Li

unread,
Oct 12, 2012, 3:11:06 AM10/12/12
to ustc...@googlegroups.com
学校可能担心有人拿学校的图书馆数据库(花钱买的,有流量限制)资源给校外人员使用。

wzyboy

unread,
Oct 12, 2012, 5:11:41 AM10/12/12
to ustc...@googlegroups.com
原来是为了防止校外人员访问仅限校内 IP 访问的网站啊……

表示鄙校直接有个收费的 VPN 服务给在家的师生访问学校资源 -_-||

~~~~
wzyboy
Link:
http://wzyboy.im/
Twitter: @wzyboy
Chatback:
http://wzyboy.im/chat



2012/10/12 Bojie Li <boj...@gmail.com>
学校可能担心有人拿学校的图书馆数据库(花钱买的,有流量限制)资源给校外人员使用。

WindyWinter

unread,
Oct 12, 2012, 5:13:33 AM10/12/12
to ustc...@googlegroups.com
我校的VPN只提供给老师,不提供给学生。


Soli Deo gloria.

WindyWinter
Email: wi...@ream.at
梦.:如此短暂: http://d.ream.at


2012/10/12 wzyboy <wzyb...@gmail.com>

Bojie Li

unread,
Nov 4, 2012, 11:48:03 AM11/4/12
to USTC_LUG
我弄明白了,我这里wlan0的MTU在每次获取到IP地址时,都会被自动设置为576。而VPN的ppp0网卡的MTU是1496,ppp0不知道物理链路wlan0的MTU是576从而没有分片,因此大的TCP数据包发不出去。这个自动设置MTU的操作是我的archlinux上的dhcpcd干的,脚本在/usr/lib/dhcpcd/dhcpcd-hooks/10-mtu。我把自动连接无线网的脚本修改了一下,让dhcpcd启动时跳过这个修改MTU的脚本,这样wlan0的MTU就是1500了,VPN服务器上也不需要做特殊配置了,暂时没有发现问题。
sudo dhcpcd -d -C 10-mtu

【OT】如果我们的wiki tips搞起来了,可以作为知识积累啊~

2012/10/11 Bojie Li <boj...@gmail.com>:

Yuanchong Zhu

unread,
Nov 4, 2012, 5:23:02 PM11/4/12
to ustc...@googlegroups.com

我怎么觉得你应该改一下vpn 的配置呢……

--

Morris He

unread,
Nov 6, 2012, 8:21:59 AM11/6/12
to ustc...@googlegroups.com
各位大神,你们讨论的是什么东西啊,我表示一个非常不理解。

Bojie Li

unread,
Nov 6, 2012, 11:39:00 AM11/6/12
to ustc...@googlegroups.com
可以到Google里搜“VPN”和“MTU”,主要跟这两个东西有关。
Reply all
Reply to author
Forward
0 new messages