2009年4月8日星期三

iptables+tc+imq限制网络流量(一)


网络基本架构图


一个公司的内部网络中,经常会有某些人员使用p2p 或者bt工具下载东西,而这些下载工具在下载的同时也在进行上传的动作,这样就会造成某些人员占用了很大的带宽资源,而导致其他同事无法正上网上工作。要解决这个问题必须对网络带宽的进行限制 合理分配资源。


nat主机是centos5.2系统,需要先准备好的软件如下:


[root@imq src]# cd /usr/src
[root@imq src]# ls
iptables-1.4.1-imq.diff l7-protocols-2008-12-18.tar.gz imq-nat.diff
linux-2.6.26.6.tar.bz2 netfilter-layer7-v2.21.tar.gz iptables-1.4.1-rc3.tar.bz2
linux-2.6.25-imq5.diff

编译内核加入Qos 和L7-Filter +imq 支持,在linux中网络流量采用队列式的,队列(queue)是网卡存放外送封包的地方,队列规则就是采用来管制流量的规则,如果没有设定,预设的规则是FIFO(first in first out,就是先进先出),也就是没有任何限制的意思。

QOS 能吧网络带宽分成很多群组,然后每个群组都可以设置一定得保证带宽和最大带宽。而且可以设置优先权,这个时候我们就可以根据我们设置的规则使用iptables把资料分门别类的送到QOS所设置的群组内,这样不同的应用就可以分别享有不同大小的带宽资源了。

在linux中QOS 有很多种 有CBT,HTB,HFSC 其中htb比较容易看懂 而且设置的带宽比较精确,下来我们就用HTB来做QOS管理。

由于QOS的tc机制在一个设备上只能限制上传或者下载,所以无法在用一张网卡上同时限制上传和下载。

因为nat通常都需要使用两张网卡,很多人就是使用对外的网卡控制上传,对内的网卡控制下载,但是这不是一个好的方式,因为NAT主机在很多时候都有可能做为PROXYD等等服务,这样连到NAT主机的服务也会被限制到了,而我们不希望内部人员连到NAT主机的封包也被限制。

这个时候就要通过IMQ 这种虚拟设备来解决这个问题,我的理解就是imq这个机制 可以把很多网卡虚拟为一个网卡 也可以把一张网卡虚拟成多张网卡。什么情况下需要将多个网卡虚拟为一张网卡呢 比如我内网有很多张网卡 我希望把这些内网卡看做一个整体来限制速度 那么就可以把这些内网卡虚拟为一个imq设备 然后对这个imq设备进行设置就好了,而这篇文章开头所显示的网络结构图就要采用把一张网卡虚拟成多个imq设备。


将套件解压

[root@imq src]# tar -jxvf linux-2.6.26.6.tar.bz2
[root@imq src]# tar -zxvf netfilter-layer7-v2.21.tar.gz
[root@imq src]# tar -jxvf iptables-1.4.1-rc3.tar.bz2
[root@imq src]# tar -zxvf l7-protocols-2008-12-18.tar.gz

将核心的目录做个软连接叫linux

[root@imq src]# ln -s /usr/src/linux-2.6.26.6 linux


给 kernel source 上 layer7 和imq 的 补丁。

[root@imq src]# cd linux
[root@imq linux]# patch -p1 < ../netfilter-layer7-v2.21/kernel-2.6.25-2.6.28-layer7-2.21.patch
[root@imq linux]# patch -p1 < ../linux-2.6.25-imq5.diff


给iptables打上补丁

[root@imq linux]# cd ../iptables-1.4.1-rc3
[root@imq iptables-1.4.1-rc3]# cp ../netfilter-layer7-v2.21/iptables-1.4.1.1-for-kernel-2.6.20forward/libxt_layer7.* extensions/
[root@imq iptables-1.4.1-rc3]# patch -p1 < ../iptables-1.4.1-imq.diff
[root@imq iptables-1.4.1-rc3]# cd extensions
[root@imq extensions]# chmod 0755 .IMQ*
[root@imq extensions]# cd /usr/src/linux/drivers/net/
[root@imq net]# patch < imq-nat.diff


编译内核

[root@imq net]# cd /usr/src/linux
[root@imq linux]# cp /boot/config-2.6.18-92.1.13.el5 ./.config
[root@imq linux]# make menuconfig

0 评论: