PPPoE网关Iptables MTU怪问题

问题描述
Iptables作SNAT网关时候, 发现一些PC机不能正常访问一些站点,表现为浏览器可以解析站点, 部分打开站点, 接着就超时了。

原因
ADSL的PPPoE连接的MTU是1492, 而Widows和Linux缺省的MTU是1500, 当浏览器相WEB服务器发送请求时, 要求MSS是1460, 一些站点屏蔽了ICMP3/4访问或者禁用了PMTUD协议而导致MSS值是1460, 当WEB服务器返回的包小于1452时,客户端可以正常接受数据, 超过1452时候无法得到数据。

解决方法
1、使用ping找到你的MAX MTU Size
ping -l mtu_size-28 -f your_gateway
从1500开始,知道没有收到错误信息the Packet needs to be fragmented but DF set。 28是IP和ICMP协议所用的字节。一般而言PPPoE是1492。

2、调整PC的MTU

Windows 2000/XP

注册表:HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Services TcpipParameters Interfaces, and (Edit -> New -> DWORD Value), and name the value MTU.
Double-click the new value, choose the Decimal option, and type the MTU value determined above. 重启。

Windows 98

注册表: HKEY_LOCAL_MACHINE System CurrentControlSet Services ClassNet 增加MaxMTU string项,

Linux
ifconfig interface mtu mtu_size

3、调整网关

Iptables

增加规则:

iptables -o ppp_interface -I FORWARD 1 -p tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu
出站包大小改为pppx的MTU尺寸。

或者 clamp mss size in pppoe
RedHat修改/etc/sysconfig/networking-script/ifcfg-ppp0
CLAMPMSS=1452

Debian
修改 /etc/ppp/peers/dsl-provider
增加
pty "/usr/sbin/pppoe -I eth1 -T 80 -m 1452
注释掉 plugin, rp-pppoe.so 好像有bug