Chinaunix首页 | 论坛 | 认证专区 | 博客 登录 | 注册
  • 博客访问: 1163034
  • 博文数量: 287
  • 博客积分: 3713
  • 博客等级: 少校
  • 技术积分: 2279
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-11 09:47
个人简介

http://blog.chinaunix.net/uid/16979052.html

文章分类

全部博文(287)

文章存档

2017年(14)

2016年(9)

2015年(17)

2014年(15)

2013年(115)

2012年(117)

微信关注

IT168企业级官微



微信号:IT168qiye



系统架构师大会



微信号:SACC2013

订阅
热词专题
友情链接

分类: LINUX

原文地址:[iptables]解决openwrt无线上网问题 作者:heiyou

  本文适合pppoe,应该也适合vpn,这是在网上搜索得到的判断。但没有试验过。

在默认的AP模式中, 无线上网有些故障,路由器采用pppoe拨号上网。但是lan口接PC上网正常。

故障:
  用手机wifi时,可以得到路由器分配的IP地址。QQ可以上,也可以视频。但UC,优酷上不去。可以解析DNS,但不能得到数据。
另一台PC使用无线网卡也可以得到路由器分配的IP地址,但有些网站可以打开,如百度,便是更多的网站打不开,如http://blog.chinaunix.net。

解决:
  原来使用过routeros,出现的也是这种情况,在routeros里是通过winbox在GUI界面设置成功的。在openwrt中就不知道如何实现一样的效果了。
  经过百度和查iptables FAQ手册,用一条命令解决了这个问题,下面三条命令应该是一样的效果,我只用了第一个:
iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o pppoe-wan -j TCPMSS --set-mss 1452
iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o pppoe-wan -j TCPMSS --clamp-mss-to-pmtu
iptables -A zone_wan_MSSFIX -o pppoe-wan -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

-------------------------解释----------------------------------------------------------------------------
上面的命令是把离开路由器的包的大小限制一下,省的过大会被丢弃。通过MSS的设置实现的.
这个mss是最大分段的大小。
以太网最大承载1500字节,又称mtu。
mss是mtu的一部分。假设一通过网线直连的局域网,这个mtu值在windows里面默认是1500,局域网络内运行很好。便一旦能过路由pppoe拨号,因为ppp包头需要占用8字节,所以在pppoe拨号成功后,每个数据包最大只能是1492字节,这1492字节里面包含tcp/ip包(各20字节)头,用于上层协议如http的只能是1452(1492-40)字节了。所以需要调整这个参数。
pppoe拨号程序也会自动设置。不过它是在mangle表的forward(一种chain,和postrouting负责一头,一尾处理数据包)里面设置的规则(上面第三个命令)。不知为何没有生效。

上面用了两种方法:
一种是通过在mangle表的POSTROUTING链里新添加一新规则。
二种是通过对zone_wan_MSSFIX(这是pppoe拨号后自动建立的)的设定,也是新规则的添加。
需要加强对iptables的了解。这是个有用的工具。
--------------------解释结束------------------------------------------------------

补充:
因为forward没有启用,所以pppoe对mangle表forward的设置没有生效。忘了在哪儿启用了。

在http://zonghe.17xie.com/book/10983136/59881.html有些资料管用

Table 11-13. TCPMSS target options

Option

--set-mss

Example

iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o eth0 -j TCPMSS --set-mss 1460

Explanation

The --set-mss argument explicitly sets a specific MSS value of all outgoing packets. In the example above, we set the MSS of all SYN packets going out over the eth0 interface to 1460 bytes -- normal MTU for ethernet is 1500 bytes, minus 40 bytes is 1460 bytes. MSS only has to be set properly in the SYN packet, and then the peer hosts take care of the MSS automatically.

Option

--clamp-mss-to-pmtu

Example

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

Explanation

The --clamp-mss-to-pmtu automatically sets the MSS to the proper value, hence you don't need to explicitly set it. It is automatically set to PMTU (Path Maximum Transfer Unit) minus 40 bytes, which should be a reasonable value for most applications.

Note

Works under Linux kernel 2.5 and 2.6.

(http://blog.csdn.net/tianyaweizhiren/article/details/7336454)

在http://bbs.jmu.edu.cn/showtopic-66265.aspx也有些管用的。

下面的也有用:
# 如果你的 MSN 一直無法連線,或者是某些網站 OK 某些網站不 OK,
#可能是 MTU 的問題,那你可以將底下這一行給他取消註解來啟動 MTU 限制範圍
# iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu
《http://blog.163.com/roadwalker@126/blog/static/113561841201192711135709/》

-------------------------------------------
其实因为PPPOE需要MTU为1492,因为PPPOE协议要占8字节,所以只需要在pppoe-wan 里设置MTU为1492即可解决上面所说的问题。但pppoe-wan是动态生成的接口所以也需要动态的规则去解决这个问题,使用--tcp-flags SYN,RST SYN  -j TCPMSS --clamp-mss-to-pmtu 可以解决这个问题。

如何寻找合适的MTU,单击这儿

用链接中方法寻找到的MTU就是合适的数字,其实使用上面的(--tcp-flags SYN,RST SYN -o eth0 -j TCPMSS --clamp-mss-to-pmtu )可以自动设置合适的MSS值,有可能更简单。
如果路由是PPPOE上网,这个MTU是不包含PPPOE的8字节的。这可以理解,因为是由PPPOE协议负责向外发包,这个MTU只被本地的PPPOE协议感知,对于网络上的其它终端,只和PPPOE协议通讯,并不能感知到真正的MTU。

---------------------------------------
iptables详解看这儿
阅读(211) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册