Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2202917
  • 博文数量: 230
  • 博客积分: 9346
  • 博客等级: 中将
  • 技术积分: 3418
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-26 01:58
文章分类

全部博文(230)

文章存档

2015年(30)

2014年(7)

2013年(12)

2012年(2)

2011年(3)

2010年(42)

2009年(9)

2008年(15)

2007年(74)

2006年(36)

分类: LINUX

2006-01-26 02:19:51

iptables中有个limit模块,遗憾的是他只能限制packet,而不是Bytes
不过……  先来看一个网络实例

[root@platinum root]# ifconfig
eth0     Link encap:Ethernet  HWaddr 00:0A:EB:07:22:82
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:443747 errors:0 dropped:0 overruns:0 frame:0
         TX packets:417700 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:218731248 (208.5 Mb)  TX bytes:65766454 (62.7 Mb)
         Interrupt:9 Base address:0xac00

eth1     Link encap:Ethernet  HWaddr 00:E0:4C:39:6D:96
         inet addr:172.25.39.254  Bcast:172.25.39.255  Mask:255.255.255.0
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:691411 errors:0 dropped:0 overruns:0 frame:0
         TX packets:960662 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:82794610 (78.9 Mb)  TX bytes:976909968 (931.6 Mb)
         Interrupt:11 Base address:0xc800

lo       Link encap:Local Loopback
         inet addr:127.0.0.1  Mask:255.0.0.0
         UP LOOPBACK RUNNING  MTU:16436  Metric:1
         RX packets:1106 errors:0 dropped:0 overruns:0 frame:0
         TX packets:1106 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0
         RX bytes:314982 (307.5 Kb)  TX bytes:314982 (307.5 Kb)

ppp0     Link encap:Point-to-Point Protocol
         inet addr:221.219.204.209  P-t-P:61.149.164.1  Mask:255.255.255.255
         UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1492  Metric:1
         RX packets:438850 errors:0 dropped:0 overruns:0 frame:0
         TX packets:412803 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:3
         RX bytes:208763034 (199.0 Mb)  TX bytes:56389653 (53.7 Mb)

ppp37    Link encap:Point-to-Point Protocol
         inet addr:10.39.1.254  P-t-P:10.39.1.1  Mask:255.255.255.255
         UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1480  Metric:1
         RX packets:14728 errors:0 dropped:0 overruns:0 frame:0
         TX packets:12451 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:3
         RX bytes:1327878 (1.2 Mb)  TX bytes:2772440 (2.6 Mb)

[root@platinum root]#
 
eth0 是我的 WAN 网卡
eth1 是我的 LAN 网卡
ppp0 是通过 PPPoE 方式拨叫网通线路
ppp37 是我自己的 PPPoE SERVER,给其他用户接入使用,用户使用的是WINXP系统

从上面的资料可以看到 MTU 这个东西,eth0 和 eth1 都是 1500,ppp0 是 1492,ppp37 是 1480(如果客户端是 WIN2000 则也是 1492)

什么是MTU?
MTU 是 Maximum Transmission Unit 的缩写。意思是网络上传送的最大数据包,单位是字节。如果本机的MTU比网关的MTU大,大的数据包就会被拆开来传送,这样会产生很多数据包碎片,增加丢包率,降低网络速度。把本机的MTU设成比网关的MTU小或相同,就可以减少丢包。不同的接入方式,MTU值是不一样的,下面是常用的几种接入方式默认的MTU值:
EtherNet (以太网)1500
PPPoE(ADSL) 1492
Dial-up(modem) 576

由此可以看出,一个标准以太网 Frame 是 1500 Bytes,那么我们知道了这一点,可以利用iptables来进行带宽限制

iptables中有个limit模块,遗憾的是他只能限制packet,而不是bytes
但是我们现在已经知道了一个标准Ethernet Frame是1500 Bytes,这样就好做了

下面给大家演示一个限制upload速率的实例(已经通过测试)


# Limit Platinum
iptables -A FORWARD -s 10.39.1.1 -m state --state NEW,ESTABLISHED,RELATED -m limit --limit 20/s -j ACCEPT
iptables -A FORWARD -s 10.39.1.1 -j DROP

当然,用这种方法可以比 tc 更灵活,可以基于 IP、PORT 去进行控制,也可以针对 INPUT/OUTPUT/FORWARD 进行限制

这样唯一不好的是,不一定每个 packet 都是 1500 Bytes,这样的限制只是一个大概,并非精确,一般速度均有所偏差

阅读(4259) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~