准备放弃的时候,从网上找到了这样一条神奇的命令:
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
我不记得是谁的bug了,反正连接时双方是不做mtu商议的。那个值是算出来的,一般设为1356就可以。
-- 来自USTC LUG
请使用gmail订阅,不要灌水。
更多信息more info:http://groups.google.com/group/ustc_lug?hl=en?hl=en
下面的就可以:
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>:
如果是链路特殊,需重新计算。放在filter中是对的,不需要mangle。
WindyWinter
大概与mangle和filter的原意有关吧,不过实际上能放在filter 的大家就不去动mangle。
我所在的链路没什么特殊的啊,合肥ADSL,通过无线路由器共享宽带,pptpd
server在网络中心,所要访问的目标IP在少院。我觉得最有可能搞鬼的地方,一是运营商,而是无线路由器。
我不记得怎么算了,我的草稿纸上只剩1396这个数了。
pptp本身就是数据链路层协议,1396可能是它的mtu。
这个我理解不了了,pptp不存在链路不对称的问题。
【OT】如果我们的wiki tips搞起来了,可以作为知识积累啊~
2012/10/11 Bojie Li <boj...@gmail.com>:
我怎么觉得你应该改一下vpn 的配置呢……
--