发新话题
打印

通过iptables NAT上网,网页必须刷新才能打开的解决

通过iptables NAT上网,网页必须刷新才能打开的解决

今天突然发现一个问题,一些常上的网页打不开了,刷新一下才能打开,但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脚本,问题解决!

TOP

在CU上看到有的人写的语句是加到FORWARD链中的,不管了,现在能解决就行,
-j TCPMSS 这个动作,后面可以跟别的处理参数,如
-j TCPMSS --set-mss 1356
看来这是强行指定MSS了,有空还得研究下,iptables细致深入学习很复杂的。

今天的问题,为什么以前没有出现过,就不得而知了,不知道是电信做了调整,还是受地震影响?
早起突然连贴吧的链接也打不开,我意识到问题真的严重了,因为百度的服务器一向是稳定的。
呵呵,解决完了,吃饭去!

TOP

发新话题