网络流量控制--DUMMYNET

来源:互联网 发布:淘宝买家信用度查询 编辑:程序博客网 时间:2024/06/03 14:52
我们知道在FreeBSD中有一个内核级的功能叫dummynet,利用它我们就可以在系统上
实施一定的网络流量控制。不过dummynet必须配合ipfw一起使用才行,所以需要重新
配置内核,在内核配置文件中加入以下几行,然后编译出新内核。

打开数据包过滤功能
options IPFIREWALL #firewall

通过syslog启用记账功能
options IPFIREWALL_VERBOSE #enable logging to syslogd(8)

限制数据包记账的额度
options IPFIREWALL_VERBOSE_LIMIT=100 #limit verbosity

启用流量控制功能
options DUMMYNET

由于dummynet的功能是通过ipfw的语句来实现的,而关于ipfw的部分我想大家都有自
己的经验,无须我在此解释了。我们只关注与dummynet有关的部分。公司使用一条2M
的ADSL线路向员工提供访问互联网的功能,我根据实际的需要编排了以下的包过滤规
则。其中,流量控制部分的设想是对用户访问进行一定的限制,以防止一些用户拖大
东东而占用全部的带宽。

# 清除系统中现有的所有规则
ipfw -f flush

允许向外进行DNS查询(符合条件则转向流量限制部分)
ipfw add skipto 10000 udp from fxp0 to any 53

允许连接外部WEB站点(符合条件则转向流量限制部分)
ipfw add skipto 10000 tcp from fxp0 to any 80 keep-state

允许连接接外部FTP站点(使用被动模式,符合条件则转向流量限制部分)
ipfw add skipto 10000 tcp from fxp0 to any 21 keep-state
ipfw add skipto 10000 tcp from ${oip} 1023-65534 to any 1023-65534 keep-state
 

不符合以上规则的数据转至第11000条规则作进一步过滤
ipfw add skipto 11000 tcp from any to any

根据ADSL的不对称特性,分別限制上/下行带宽为每秒28K/224K
ipfw add 10000 pipe 1 ip from any to any out
ipfw add pipe 2 ip from any to any in
ipfw pipe 1 config bw 28KByte/s queue 10
ipfw pipe 2 config bw 224KByte/s queue 10

允許从内部网络访问代理器(内部互访则使用另一套流量控制)
ipfw add 11000 queue 5 tcp from 192.168.60.0/24 to vr0 3128 keep-state

允许从内部网路远程登录到服务器以便进行维护管理
ipfw add pass tcp from 192.168.60.0/24 to vr0 23 keep-state

限制內部网络对代理服务器的访问带宽为每秒80M,并根据IP地址平均共享此带宽
ipfw queue 5 config pipe 3 mask src-ip 0x000000ff
ipfw pipe 3 config bw 80Mbit/s

最后,挡掉符合以上规则以外的所有数据包,并把這些可疑的连接尝试记录到日志中
 
ipfw add deny log ip from any to any

  由此,我们可以看到,在dummynet中可以定义两种基本并且最常用的控制单位pipe
和queue。关于这两个单位的语法在dummynet的man中有详细的解释。我的使用感觉是
,pipe就象它本身这个词一样,一般被拿来定义总的流控制大小;而queue则可以在
pipe的基础上进行更进一步的细分。象上面我在定义内部网流量使用的部分中就利用
了mask src-ip这个参数把总的pipe根据当前连入的IP数划分成多个queue,每个地址
使用一个,它的大小取决于当前建立连接的数量,而不会把总的pipe占满。例如,当
9个地址连入80Mbit的带宽时,每人只能用到80Mbit/9=8.9Mbit。而后面紧跟的掩码
是根据你的网络号而定的,因为我的内部网络号是24位的,所以就是0x000000ff,注
意,这是根据主机地址部分进行平均分配的,不应该写成0xffffff00。
  因此,在哪些过滤规则上使用合适的queue或pipe就必须根据你自己的需要来制
定。不过,在这里很容易出错的是,各条规则的跳转会让你搞糊涂,以致最后可能会
出现逻辑完全相反的情况。我在一开始配置时,曾经因为有一条规则在流量控制语句
之前就把所有数据包都match走了,结果还以为是dummynet有问题,查了很长时间来
查到。当然,这可能是我对ipfw掌握得还不好的原因。不过我希望以我的低级错误来
给大家提个醒,在配置dummynet时不要忽略这一点。
  最后,用ipfw pipe list可以查看当前所有pipe的使用状况。下面是这个命令
出的格式,可以看到,內部网络中每一台机器都很平均地分享了代理服务器內部接口
上的指定带宽
proxy# ipfw pipe list
00001: 224.000 Kbit/s 0 ms 10 sl. 1 queues (1 buckets) droptail
mask: 0x00 0x00000000/0x0000 -> 0x00000000/0x0000
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
0 udp 218.4.48.36/1024 202.102.14.141/53 82134 9902326 0 0 135
00002: 1.792 Mbit/s 0 ms 10 sl. 1 queues (1 buckets) droptail
mask: 0x00 0x00000000/0x0000 -> 0x00000000/0x0000
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
0 udp 192.168.60.223/138 192.168.60.255/138 83239 42924464 0 0 205
00003: 640.000 Mbit/s 0 ms 50 sl. 0 queues (1 buckets) droptail
mask: 0x00 0x00000000/0x0000 -> 0x00000000/0x0000
q00005: weight 1 pipe 3 50 sl. 26 queues (64 buckets) droptail
mask: 0x00 0x000000ff/0x0000 -> 0x00000000/0x0000
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
0 ip 0.0.0.192/0 0.0.0.0/0 1133 230526 0 0 0
2 ip 0.0.0.129/0 0.0.0.0/0 187 24901 0 0 0
4 ip 0.0.0.162/0 0.0.0.0/0 68 6961 0 0 0
6 ip 0.0.0.99/0 0.0.0.0/0 10366 1899558 0 0 0
8 ip 0.0.0.4/0 0.0.0.0/0 24 2009 0 0 0
10 ip 0.0.0.197/0 0.0.0.0/0 54 6678 0 0 0
12 ip 0.0.0.70/0 0.0.0.0/0 140 9012 0 0 0
14 ip 0.0.0.103/0 0.0.0.0/0 124 32877 0 0 0
16 ip 0.0.0.72/0 0.0.0.0/0 70 6886 0 0 0
18 ip 0.0.0.73/0 0.0.0.0/0 104 26161 0 0 0
20 ip 0.0.0.106/0 0.0.0.0/0 13 2055 0 0 0
22 ip 0.0.0.235/0 0.0.0.0/0 116 14598 0 0 0
24 ip 0.0.0.76/0 0.0.0.0/0 1236 391629 0 0 0
26 ip 0.0.0.237/0 0.0.0.0/0 37851 25922830 0 0 0
28 ip 0.0.0.46/0 0.0.0.0/0 5229 734426 0 0 0
30 ip 0.0.0.143/0 0.0.0.0/0 982 216251 0 0 0
32 ip 0.0.0.48/0 0.0.0.0/0 147 23382 0 0 0
38 ip 0.0.0.51/0 0.0.0.0/0 802 91239 0 0 0
40 ip 0.0.0.116/0 0.0.0.0/0 35 3293 0 0 0
42 ip 0.0.0.53/0 0.0.0.0/0 39 4570 0 0 0
44 ip 0.0.0.214/0 0.0.0.0/0 330 44163 0 0 0
46 ip 0.0.0.151/0 0.0.0.0/0 139 24427 0 0 0
48 ip 0.0.0.24/0 0.0.0.0/0 39 3451 0 0 0
52 ip 0.0.0.122/0 0.0.0.0/0 155 19472 0 0 0
54 ip 0.0.0.187/0 0.0.0.0/0 131 18635 0 0 0

58 ip 0.0.0.221/0 0.0.0.0/0 467 114305 0 0 0


0 0
原创粉丝点击