今天突然发现一个问题,一些常上的网页打不开了,刷新一下才能打开,但QQ连线一直正常,一开始以为是电信在调整服务器,打了个电话,说没有。
我们这里是6M的ADSL,用一台老机做的NAT,拉动整个局域网上网,电信说没事,只好自己开始试验:
断开交换机,直接用一台机器连到ADSL上,独享6M的ADSL

,上网试试,一切正常,看来确实不是电信的原因。
象往常一样接好网关服务,打开局域网里的几台电脑,上网试试,又来了,还是刷新一下才能打开,也不能让大家都“喜刷刷”啊。
解决不了了,上网搜索吧,GOOGLE一下“路由+刷新+打开”,找了半天,有点有用的了,好象是MTU值的问题,再查查,这个MTU是最大传输数据单元,要设置一下才能解决这个问题。
找linux下iptables设置MTU相关的文章,真不错,找到两个,
一个说
引用:
先 # ifconfig ppp0 mtu 1480
注:Redhat 可以修改 /etc/sysconfig/networking-script/ifcfg-ppp0 ,添加 CLAMPMSS=1480 。
最后的解决办法——用 iptables 改 MTU 值。
# iptables -A FORWARD -o ppp0 -p tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:1536 -j
TCPMSS --clamp-mss-to-pmtu
把出站包大小改为 ppp0 的 MTU 尺寸,这下就一切正常了。
MSS 既 Max Segment Size 。
还有一个文章说:
引用:
在 iptables 规则中加入这一句就可以解决了:
-A POSTROUTING -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
–clamp-mss-to-pmtu 意为动态协商 MSS,当然你也可以指定,但要根据ISP的情况。事实上有些时候取决于你访问的网站和你机器之间。
但还有一个问题,只有 TCPMSS 写在第一句的时候,才生效。不然 iptables 读过 SNAT 之后就不读 TCPMSS 了,反之却都读。还不知道为何。
问题已经找到了~ 修改包特性的一些改变,应该放在 mangle 表里面操作。这样就不会冲突了。
比较一下,选择了后者,加到mangle表中了:
#动态协商 MSS
$IPTABLES -t mangle -A POSTROUTING -p TCP --tcp-flags SYN,RST SYN -j TCPMSS --cl
amp-mss-to-pmtu
重新运行iptables脚本,问题解决!
