今年4月,看到一则报道说尽管某宽带公司现有技术可以容纳的网络用户容量为400至600万用户,可是目前,在容纳了45万用户的情况下,网络已经拥挤不堪,时常出现断网情况,一到上网高峰,网速就会急剧下降。
为何网络会如此拥挤不堪?这是因为自从出现诸如电驴、Kazaa、BT等P2P软件之后,海量的数据文件(如大容量文件交换、视频文件下载等)逐渐占据了大部分的网络带宽。P2P这一新应用给用户带来了前所未有的方便和丰富的资源,但同时也引发了网络带宽和安全问题。
如何在发挥P2P强大功能的情况下对其进行一些必要的限制呢?本文将介绍在Linux中如何利用netfilter/iptables实现对P2P应用流量的限制。
升级内核
由于在公开发布的Linux内核文件中,有关iptables的各种参数里没有关于P2P属性的参数,所以必须通过升级Linux内核和iptables来打上这个补丁,使其支持P2P属性设置。
在具体操作之前,先要了解一下升级内核补丁需要的一些相关软件:linux-2.4.20-8.tar.gz、patch-o-matic-20040609.tar.bz2、iptables-1.2.8.tar.bz2、iptables-p2p-0.3.0a.tar.gz和ipp2p-0.5c.tar.gz。
这里的测试环境为Red Hat 9.0,内核为2.4.20-8。由于2.4.*是一个稳定的内核,因此不能把当前开发的一些新功能提交到主内核中去,而只能首先在patch-o-matic中测试,然后打补丁到内核中。在CVS中可以找到最新的patch-o-matic包—Patch-o-matic-20040609.tar.bz2。
有了内核支持后,还需要iptables支持,其中iptables-p2p-0.3.0a.tar.gz为netfilter/iptables组织开发的专门支持P2P的iptables扩展软件包;ipp2p-0.5c.tar.gz为Eicke Friedrich开发的一个支持P2P的iptables扩展包。这两个扩展包各有特色,后面将会分别介绍。
装载模块
首先在/usr/src下解压软件包:
#bzip2 -d patch-o-matic-20040609.tar.bz2
生成patch-o-matic-20040609.tar.out。
#tar xvf patch-o-matic-20040609.tar.out
生成补丁目录patch-o-matic-20040609。Red Hat 9.0中默认的内核目录为/usr/src/linux-2.4。进入补丁目录/usr/src/patch-o-matic-20040609,由于支持P2P协议控制选项需要CONNMARK模块,该模块在extra子目录下,因此需要运行如下命令来升级内核补丁。
#KERNEL_DIR=/usr/src/linux-2.4 ./runme extra
运行该命令后会出现一个模块选择界面,界面有两个区域,一个给出相关的模块名、模块功能、用法和语法实例;另一个给出各种选项,如N/y/b/r.../q/?,其中第一个为大写字母,表示缺省选项,n表示下一个模块,y表示确定,b表示上一个模块,q表示退出。
首先应该确定当前的模块是否需要,不需要就按“N”键后回车,继续显示下一个模块的相关信息。当出现需要的模块时,按“Y”键确认,同时应该将里面的相关语法实例抄录下来以备用。选择完所有需要的模块后,按“Q”键退出。
编译内核
进入内核文件所在目录/usr/src/linux-2.4,开始编译内核:
#make mrproper
#make xconfig(或#make menuconfig)
注意,在配置选项中必须选择Networking options→IP:Netfilter Configuration→Connection mark tracking support和CONNMARK target support两个选项。确保关键文件在正确位置:
#make dep
编译大内核:
|
#make bzImage
编译选择的模块:
#make modules
将编译后的模块转移到系统标准位置:
#make modules_install
让系统自动修改启动配置文件grub.conf:
#make install
重新启动系统,选择Red Hat Linux(2.4.20-8custom)选项,则启动了新编译的内核。
升级iptables
安装iptables-1.2.8
首先解压iptables-1.2.8.tar.bz2文件:
#bzip2 -d iptables-1.2.8.tar.bz2 #tar xvf iptables-1.2.8.tar.out
编译iptables-1.2.8:
#make KERNEL_DIR=/usr/src/linux-2.4 #make install KERNEL_DIR=/usr/src/linux-2.4 #make install-devel
拷贝可执行文件到相应目录:
#cp iptables iptables-save iptables-restore /sbin
安装iptables-p2p软件 首先解压iptables-p2p-0.3.0a.tar.gz:
#tar zxvf iptables-p2p-0.3.0a.tar.gz #cd iptables-p2p-0.3.0a
拷贝iptables-1.2.8的头文件到适当的目录:
#cp -a /usr/src/iptables-1.2.8/include/* /usr/include
运行“make”编译iptables-p2p,并拷贝相关文件到相应的目录:
#make #cp kernel/ipt_p2p.o /lib/modules/2.4.20-8custom/kernel/net/ipv4/netfilter/ #cp iptables/libipt_p2p.so /lib/iptables/
安装ipp2p软件
首先修改Makefile文件中的源目录、内核目录和netfilter版本号,将以下内容:
IKERNEL = -I/usr/src/linux/include IUSER = -I/usr/src/iptables-1.2.7a/include NETFILTER_VERSION = \"1.2.7a\"
改为:
IKERNEL = -I/usr/src/linux-2.4/include IUSER = -I/usr/src/iptables-1.2.8/include NETFILTER_VERSION = \"1.2.8\"
编译软件,并拷贝库文件到相应的目录:
#make #cp libipt_ipp2p.so /lib/iptables
装入模块:
#insmod ipt_ipp2p
应用和检测P2P限制功能
iptables-p2p的应用
1.iptables-p2p目前支持如下协议:
◆ FastTrack(KaZaa、Grokster......)
◆ eDonkey(eDonkey、eMule......)
◆ Direct Connect
◆ Gnutella(regular clients and Shareaza's gnutella 2)
◆ BitTorrent
◆ OpenFT(giFT)
需要安装CONNMARK模块,通过CONNMARK模块的标记包来使用iptables-p2p。
2.通过-help参数获取帮助:
#iptables -m p2p -help …… P2P match v0.3.0a options: --p2p-protocol [!] protocol[,...] --p2p ... match application-layer protocol(匹配的应用层协议) Valid p2p protocols:(P2P支持的有效协议如下:) fasttrack gnutella edonkey dc bittorrent openft
iptables-p2p模块通过-m p2p参数来实现对所有已知P2P连接请求的识别。注意,-m p2p只能识别P2P类型的连接请求,不能识别所有的P2P包,可以通过--p2p-protocol子参数来识别P2P的各种已知协议类型。
3.应用实例
#iptables -A FORWARD -m p2p -j DROP
阻塞网络上所有的P2P连接请求。
#iptables -A FORWARD -m p2p --p2p-protocol fasttrack,bittorrent -j DROP
阻塞网络上fasttrack和bittorrent协议连接请求。
在实际使用过程中必须和CONNMARK目标结合起来,然后通过tc过滤才能真正对所有P2P包进行限制。更多的信息可以参考example/limit-p2p.sh的实例脚本。
ipp2p的应用
1.ipp2p目前支持如下Linux内核和iptables版本:
◆ Linux-Kernels 2.6:2.6.3
◆ Linux-Kernels 2.4:2.4.18、2.4.19、2.4.20、2.4.21、2.4.22、2.4.23
◆ iptables(www.netfilter.org)1.2.7a、1.2.8、1.2.9
2.获取ipp2p帮助
# iptables -m ipp2p --help …… IPP2P v0.5c options: --ipp2p Grab all known p2p packets (抓所有已知的P2P包) --ipp2p-data Grab all known p2p data packets (抓所有已知P2P数据包) --edk Grab all known eDonkey/eMule/Overnet packets (抓所有已知的eDonkey/eMule/Overnet类型的包) --edk-data Grab all eDonkey/eMule/Overnet data packets (抓所有已知的eDonkey/eMule/Overnet数据包) --dc Grab all known Direct Connect packets (抓所有已知的直接连接包) --dc-data Grab all Direct Connect data packets (抓所有已知的直接连接数据包) --kazaa Grab all KaZaA packets (抓所有KaZaA包) --kazaa-data Grab all KaZaA data packets (抓所有KaZaA数据包) --gnu Grab all Gnutella packets (抓所有Gnutella包) --gnu-data Grab all Gnutella data packets (抓所有Gnutella数据包) --bit Grab all BitTorrent packets (beta - handle with care) (抓所有BitTorrent包) --apple Grab all AppleJuice packets (beta - handle with care) (抓所有AppleJuice包) --soul SoulSeek (beta - handle with care) (SoulSeek类型的包) ……
3.应用实例
ipp2p只能识别P2P连接请求,而不能识别所有P2P包,因此也必须和CONNMARK目标结合在一起使用,目前只支持TCP协议标示。下面来看一个实例。
#iptables -A PREROUTING -t mangle -p tcp -j CONNMARK --restore-mark
上面代码表明从CONNMARK目标中恢复标记。 #iptables -A PREROUTING -t mangle -p tcp -m mark ! --mark 0 -j ACCEPT
上面代码表明接收所有非0的标记包。 #iptables -A PREROUTING -t mangle -p tcp -m ipp2p --ipp2p -j MARK --set-mark 1
上面代码表明将ipp2p连接标记为“1”。
#iptables -A PREROUTING -t mangle -p tcp -m mark --mark 1 -j CONNMARK --save-mark
上面代码表明保存所有标记为“1”的包到CONNMARK目标中。
通过上面设置得到的结果是,每一个标示为P2P连接的包被标记成“1”,然后再通过tc过滤,执行下面的操作: #tc filter add dev eth0 parent 1:0 protocol ip prio 4 handle 1 fw classid 1:11 #tc filter add dev eth1 parent 2:0 protocol ip prio 4 handle 1 fw classid 2:11
使用HTB和过滤,将所有标记为“1”的包放到每一个设备类中,通过对这些设备类的限制来达到对P2P连接带宽的限制。
更多的信息可以参考http://rnvs.informatik.uni-leipzig.de/ipp2p/。
应用效果
笔者在单位防火墙上应用了iptables-p2p和ipp2p配置,对P2P的FastTrack协议进行限制后,用贪婪BT(ABC)进行测试,取得了理想的效果,能有效地限制P2P通信。
|
此帖于 2005-10-21 21:17 被 zhuomingliang 编辑.
【推荐】在2.6内核下不编译内核给iptables添加模块
阅读:19966 时间:2005-8-14 0:13:03 来源:www.chinaunix.net
看了platinum兄弟写的在2.4内核下给iptables添加模块,想在2.6的内核下也试试,经过一天半的努力,并参考platinum兄弟的文章,
终于成功,写下来跟CU的兄弟们分享,我的系统为fedora2+linux-2.6.5-1.358
1,安装kernel源码
[root@jiecho]# yum install kernel-source
2,下载iptables-1.3.3.tar.bz2和patch-o-matic-ng-20050810.tar.bz2并解包,为了方便,我们都放在/usr/src下,
并把kernel和iptables做符号链接.
[root@jiecho]# cd /usr/src
[root@jiecho]# wget ftp://ftp.be.netfilter.org/pub/netf...s-1.3.3.tar.bz2
[root@jiecho]# wget ftp://ftp.be.netfilter.org/pub/netf...0050810.tar.bz2
[root@jiecho]# tar -jxvf iptables-1.3.3.tar.bz2
[root@jiecho]# tar -jxvf patch-o-matic-ng-20050810.tar.bz2
[root@jiecho]# ln -s linux-2.6.5-1.358 linux
[root@jiecho]# ln -s iptables-1.3.3 iptables
3,给netfilter打补丁,选择你要的模块,为了测试我就选择了ipp2p和time
[root@jiecho]# cd /usr/src/linux
[root@jiecho]# make mrproper
[root@jiecho]# make menuconfig
什么不做,保存退出,然后把Makefile改一下
[root@jiecho]# vi Makefile
把EXTRAVERSION = -1.358custom更改为EXTRAVERSION = -1.358
保持跟uname -a 的版本一致(可详细参考platinum兄弟的文章)
[root@jiecho]# cd /usr/src/patch-o-matic-ng-20050810
[root@jiecho]# ./runme ipp2p
[root@jiecho]# ./runme time
因为事先做好了符号链接,等问你kernel和iptables的位置的时候直接回车就行,
提示你是否添加ipp2p和time模块是就y确定,至此,netfilter的补丁打完了,如果你需要别的模块可以根据需要加上.
××××(要重新编译iptables包)
4,编译kernel的modules
[root@jiecho]# cd /usr/src/linux
[root@jiecho]# make menuconfig
在Device Drivers->Networking support->Networking options->Network packet filtering (replaces ipchains)
->IP: Netfilter Configuration中把下面的两项M选中.
TIME match support
IPP2P match support
然后保存退出
4,编译安装模块
下面就是最重要的步骤了,因为我们的原则是节省时间,不重新编译内核,而只编译其中的模块,
这点2.4的内核跟2.6的内核有所不同,郁闷了我一整天,2.4内核的模块是以*.o形式的,而2.6内核是以*.ko形式的,
这有个改变的方法,参考:http://blog.chinaunix.net/article.p...742&blogId=2662
代码:
[root@jiecho]# make modules
HOSTCC scripts/basic/fixdep
HOSTCC scripts/basic/split-include
HOSTCC scripts/basic/docproc
HOSTCC scripts/conmakehash
HOSTCC scripts/kallsyms
CC scripts/empty.o
HOSTCC scripts/mk_elfconfig
MKELF scripts/elfconfig.h
HOSTCC scripts/file2alias.o
HOSTCC scripts/modpost.o
HOSTCC scripts/sumversion.o
HOSTLD scripts/modpost
HOSTCC scripts/pnmtologo
HOSTCC scripts/bin2c
到这里就可以ctrl+c中止了,因为我们不是要编译所有的模块,这样太浪费时间,而仅仅是netfilter的模块,
但是如果你直接执行make modules SUBDIRS=net/ipv4/netfilter就会出错,这就是2.4和2.6的区别,
我们先生成了scripts目录下的一系列需要的文件后就可以make modules SUBDIRS=net/ipv4/netfilter,
并用modpost等等把*.o文件生成为*.ko文件.
[root@jiecho]# make modules SUBDIRS=net/ipv4/netfilter
编译完成netfilter的模块后拷贝编译完成的模块
[root@jiecho]# cp /usr/src/linux/net/ipv4/netfilter/ipt_ipp2p.ko /lib/modules/2.6.5-1.358/kernel/net/ipv4/netfilter/
[root@jiecho]# cp /usr/src/linux/net/ipv4/netfilter/ipt_time.ko /lib/modules/2.6.5-1.358/kernel/net/ipv4/netfilter/
[root@jiecho]# chmod +x /lib/modules/2.6.5-1.358/kernel/net/ipv4/netfilter/ipt_ipp2p.ko
[root@jiecho]# chmod +x /lib/modules/2.6.5-1.358/kernel/net/ipv4/netfilter/ipt_time.ko
[root@jiecho]# depmod -a
5,编译iptables
[root@jiecho]# cd /usr/src/iptables
参照INSTALL文件我们进行编译安装
[root@jiecho]# make KERNEL_DIR=/usr/src/linux
会有错误编译不过
/usr/src/linux/include/linux/config.h:6:2: [root@jiecho]#error including kernel header in userspace; use the glibc headers instead!
我google了半天也没有找到是什么原因,就自己动手解决
[root@jiecho]# vi /usr/src/linux/include/linux/config.h把下面的三行注释掉
//#ifndef __KERNEL__
//#error including kernel header in userspace; use the glibc headers instead!
//#endif
然后重新编译安装
make KERNEL_DIR=/usr/src/linux
make install KERNEL_DIR=/usr/src/linux
完成安装以后测试一下
代码:
[root@jiecho]# iptables -V
[root@jiecho]# modprobe ipt_time
[root@jiecho]# modprobe ipt_ipp2p
[root@jiecho]# lsmod
ipt_time 2432 0
ipt_ipp2p 7552 0
ipt_REJECT 4736 1
ipt_state 1536 1
ip_conntrack 24968 1 ipt_state
iptable_filter 2048 1
ip_tables 13440 5 ipt_time,ipt_ipp2p,ipt_REJECT,ipt_state,iptable_filter
battery 6924 0
ipv6 184288 10
3c59x 30376 0
binfmt_misc 7176 1
nls_utf8 1536 4
ntfs 81516 4
dm_mod 33184 0
uhci_hcd 23708 0
button 4504 0
asus_acpi 8472 0
ac 3340 0
ext3 102376 4
jbd 40216 1 ext3
测试iptables
[root@jiecho]# iptables -A FORWARD -m ipp2p --edk --kazaa --bit -j DROP
[root@jiecho]# iptables -A INPUT -m time --timestart 8:00 --timestop 18:00 --days Mon,Tue,Wed,Thu,Fri
[root@jiecho]# iptalbes -L
__________________
虚心 +反省
|
Beyond Linux From Scratch: 版本 20030629 |
|
后退 |
章 18. 基本网络程序 |
前进 |
ncftp包包含一个强大的,富有弹性的FTP协议接口。它被用来替代和补充原来的 ftp程序。
有两种方法安装ncftp. 第一种,也是最佳的方法,就是把常用的功能编到共享目录里,然后编译和连接程序,把共享库连接指向它。第二种方法把所有的功能指向可以执行的二进制static代码。这将使其他的程序无法连接到代码库,使用代码。你来选择适合你的方法。注意第二种方法 不创建 一个整个的静态连接执行文件,只有libncftp部分被静态连接。编译和使用共享库是 Clarified Artistic License 所允许的,然而开发使用共享库的程序需要遵守另外一个协议。
用第一种最佳的方法, 运行下面的命令:
./configure --prefix=/usr && cd libncftp && make shared && make soinstall && cd .. && make && make install |
利用第二种方法(把libncftp功能静态连接) 执行下面的命令:
./configure --prefix=/usr && make && make install |
cd libncftp && make shared && make soinstall |
这些命令编译动态链接库 libncftp,这个库将被主程序链接。
~/.ncftp/*; 特别的 ~/.ncftp/prefs_v3
ncftp的大多数配置可以在程序中完成,程序会生成设置文件。一个例外是 ~/.ncftp/prefs_v3,其中很多选项需要在那里完成。
yes-i-know-about-NcFTPd=yes:这将禁止显示NcFTP服务器的splash广告。
在prefs_v3 file中还有许多其他的选项,很多是不需要加以说明的。
ncftp软件包包含 ncftp, ncftpbatch, ncftpbookmarks, ncftpget, ncftpls, ncftpput and ncftpspooler.
一个Ftp浏览程序。
Individual batch FTP job processor
NcFTP书签编辑器
Internet scripts文件传输程序
Internet scripts文件传输程序
Internet scripts文件传输程序
全局批处理 FTP 工作守护进程。
使用TC实现基于linux的流量管理
参考文献:tc weizhishu www.chinalinuxpub.com
Linux Advanced Routing & Traffic Control HOWTO by Bert Hubert
http://www.chinalinuxpub.com/vbbfor...&threadid=18601
请认真阅读上面的文章,掌握好相应的概念。
Red Hat Linux 7.3 内核 2.4.18 以上。
局域网的网络拓扑:
在服务器的eth0 帮定了外部地址 eth0:192.168.1.3
eth1 帮定了内部地址 eth1:1 172.17.1.1
eth1:2 172.18.1.1
eth1:3 172.19.1.1
现在要实现的功能就是整个出口限制在512kbit(上传流量) , 172.17网段的下载流量下载到512Kbit ,172.18 网段限制在128kbit,172.19的网段限制到 3Mbit。
方法如下:
首先帮定相应的地址:(不细述)
实现路由设定,使用iptables实现。
# iptables –A input -F
# iptables -A output -F
# iptables -A forward -F
#echo 1 > /proc/sys/net/ipv4/ip_forward
#允许转发
# iptables -A input –j accept
# iptables -A output -j accept
# iptables -A forward -j accept
# iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -j MASQUERADE
# iptables -t nat -A POSTROUTING -s 172.18.0.0/16 -j MASQUERADE
# iptables -t nat -A POSTROUTING -s 172.19.0.0/16 -j MASQUERADE
#进行IP地址伪装,使得内部的主机的数据包能通过服务器与外界联系。
进行流量管理
#tc qdisc add dev eth0 root tbf rate 512k lantency 50ms burst 1540
#在网卡eth0上使用tbf(TokenBucket Filter)过滤队列,将出口限制在512kbit,延迟50ms,突发数据1540,rate指定的数值就是限制的带宽。
继续在eth1做限制。
#tc qdisc add dev eth1 root handle 1:0 cbq bandwidth 100Mbit avpkt 1000 cell 8
#创建队列,指明网卡为100M网卡,这个跟流量限制无关,用于计算使用。
#tc class add dev eth1 parent 1:0 classid 1:1 cbq bandwidth 100Mbit rate 5Mbit weight 6Mbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
创建根分类,带宽限制在5Mbit,并且不允许借用别的带宽。
Prio 后面的参数为优先级,指定数据包处理的顺序。
#tc class add dev eth1 parent 1:1 classid 1:3 cbq bandwidth 100Mbit rate 512kbit weight 5Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
在跟类底下,创建分类1:3 限制带宽为512kbit,不允许借用带宽,用于172.17网段。
#tc class add dev eth1 parent 1:1 classid 1:4 cbq bandwidth 100Mbit rate 128kbit weight 5Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
在跟类底下,创建分类1:4 限制带宽为128kbit,不允许借用带宽,用于172.18网段。
#tc class add dev eth1 parent 1:1 classid 1:5 cbq bandwidth 100Mbit rate 3Mbit weight 10Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
在跟类底下,创建分类1:5 限制带宽为3Mbit,不允许借用带宽,用于172.19网段。
#tc qdisc add dev eth1 parent 1:3 handle 30: sfq
#tc qdisc add dev eth1 parent 1:4 handle 40: sfq
#tc qdisc add dev eth1 parent 1:5 handle 50: sfq
在每个分类底下,创建队列,使用sfq(Stochastic Fareness Queueing)随即公平队列。
#tc filter add dev eth1 parent 1:0 protocol ip prio 1 u32 match ip dst 172.17.0.0/16 flowid 1:3
#tc filter add dev eth1 parent 1:0 protocol ip prio 1 u32 match ip dst 172.18.0.0/16 flowid 1:4
#tc filter add dev eth1 parent 1:0 protocol ip prio 1 u32 match ip dst 172.19.0.0/16 flowid 1:5
使用u32过滤器,对目的地址进行分类,对应已经创建的队列。
通过以上方式实现了简单的流量控制,限制出口的上传流量以及内口的下载流量。
测试从 172.17.1.2 进行下载 限制的是 512kbit ,下载速率为 64-65kB
172.18.1.2 进行下载 限制的是 128kbit,下载速率为 13-16.3kB
172.19.1.2 进行下载 限制的是 3Mbit,下载速率达到 180-500kB
注:不匹配任何规则的数据包,将已root 设定的规则发送。
发现3M带宽的限制误差比较大。
以上的测试都是基于单机的,没有测试满负载的情况。
以上的文章是匆忙之中写出来的,TC过滤器涉及到的东西极多,有很多中方法可以实现,基于ip地址或者基于端口都可以实现。
希望各位多多讨论,多多完善。
TC(HTB)+iptables作流量控制
文:admin 发表时间2005-5-12 20:56:27
|
TC(HTB)+iptables作流量控制 [ 繁体中文/BIG5 ] [ 简体中文/GB ] |
|
UNIX中文宝库 http://www.douzhe.com |
|
2005年04月03日 作者: 转自: 点击: 358 |
|
一、环境和要求: 线路:ADSL:2M/512K eth0:10.0.0.136,外网口 eth1:192.168.1.1,内网口
业务需求:保证正常的网页浏览,FTP,SMTP,POP3,对其它的所有应用加以限制,以免影响正常业务的使用。
1、让交互数据包保持较低的延迟时间,也就是说上载或下载文件不会打扰SSH/telnet等。 2、上载或下载期间有合理的速率用于网页浏览,即使http属于一种大量数据传输,也不应受其它传输影响太大 3、对FTP-data限速,不会占用所有带宽 4、对SMTP,pop3限速 5、对未分类的进行限制,以免影响 6、保证上载不会影响下载,上载数据流会影响下载的速率,这是相当普遍的现象。 7、对每个IP的下载速率进行限制 8、取得空闲带宽的优先级别如:交互数据,FTP-data,smtp,pop3;网页浏览,其它业务优先级别最低
二、方法:
1、(eth0)使用HTB分成五类:如下图 +---------+ | root 1: | +---------+ | +--------------------------------+ | class 1:1 | +--------------------------------+ | | | | | | +----+ +----+ +----+ +----+ +----+ |1:11| |1:12| |1:13| |1:14| |1:15| +----+ +----+ +----+ +----+ +----+
classid 1:11:
1)这个类优先权最高。拥有最低的延迟并最先取得空闲带宽,因此要设置这个类的峰值速率。 ssh、telnet、dns、quake3、irc,ftp控制,smtp命令和带有SYN标记的数据包都应属于这一类。
2)为了保证上行数据流不会伤害下行流,我们还要把ACK数据包排在队列前面。这就是当发生大批量数据流的时
候,双向传输均受到严重影响的原因。因为下行数据的ACK必须同上行流进行竞争,并在处理过程中被延迟。
3)限制上载速率:把上载速率限制在比可用带宽稍小一些的位置上,于是你的MODEM中就不会形成队列了。
4)排除了下行队列(除了偶尔的突发),保证交互数据包永远排在上行队列的最前面。
classid 1:12:大批量传输的类。主要用来处理浏览网页的数据包,目标端口80,8080,443,8443的包。
classid 1:13:此类是拥用最大吞吐TOS位的数据包。用于处理目的地址为xxxx的FTP-data。
classid
1:14:这里是邮件(SMTP、pop3)相关和TOS要求最小成本的数据流。用于处理目的地址为xxxx的smtp,pop3服务
classid 1:15:最后是经过NAT进行大批量传输的机器,以保证他们不会妨碍正常服务。
2、(eth0)限制下载速率:。丢掉那些太快到来的数据包,不让他们导致TCP/IP的速率低于我们期望的速率。因
为我们不希望轻易地丢弃数据包,所以我们要配置“burst”来容纳突发传输。
3、(eth1)限制下载速率:对每一个IP限制最高下载速率
三、 1、队列处理
#脚本:用384kbps作为峰值速率,调整CEIL为上行速率的75%。 #Set the following values to somewhat lesss than your actual download and uplink speed. DOWNLINK=2000 UPLINK=384
#清空已有的队列,并把出错消息清空 #clean existing down and uplink qdiscs,put the errors to /dev/null tc qdisc del dev eth0 root 2> /dev/null > /dev/null tc qdisc del dev eth0 ingress 2> /dev/null > /dev/null tc qdisc del dev eth1 root 2> /dev/null > /dev/null
########################################uplink###########################################
#建立HTB父类,默认数据由1:15这个类通走 #install root HTB,point default traffic to 1:15: tc qdisc add dev eth0 root handle 1: htb default 15
#设定uplink的最大速率。 #shape everything at $UPLINK speed -this prevents huge queues in your DSL modem which destroy
latency: # main class tc class add dev eth0 parent 1: classid 1:1 htb rate ${UPLINK}kbit ceil ${UPLINK}kbit
#分类,1:11为最高优先级别,stmp,pop3,ftp-data次之,网页浏览再次之。并对每个类限制了最高速率。 #high prio class 1:11: tc class add dev eth0 parent 1:1 classid 1:11 htb rate 128kbit ceil 128kbit prio 0 tc class add dev eth0 parent 1:1 classid 1:12 htb rate 128kbit ceil ${UPLINK}kbit prio 2 tc class add dev eth0 parent 1:1 classid 1:13 htb rate 32kbit ceil ${UPLINK}kbit prio 1 tc class add dev eth0 parent 1:1 classid 1:14 htb rate 32kbit ceil ${UPLINK}kbit prio 1 #bulk & default class 1:15 -gets slightly less traffic,and a lower priority: tc class add dev eth0 parent 1:1 classid 1:15 htb rate 16kbit ceil ${UPLINK}kbit prio 3
可以在类下面再附加上另一个队列规定,以保证带宽的公平使用: #bost get Stochastic Fairness: tc qdisc add dev eth0 parent 1:12 handle 12: sfq perturb 10 tc qdisc add dev eth0 parent 1:13 handle 13: sfq perturb 10 tc qdisc add dev eth0 parent 1:14 handle 14: sfq perturb 10 tc qdisc add dev eth0 parent 1:15 handle 15: sfq perturb 10
2、分类: 上面的队列处理中等于把所有发出的数据包都送给了1:15 (tc qdisc add dev eth0 root handle 1: htb default 15)。 现在应该需要告诉机器那些数据包走哪条路。设置过滤器以便用iptables对数据包进行分类。 可以通过RETURN方法避免遍历所有的规则。 #TOS Mininum Delay (ssh,telnet) in 1:11: tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11 #80,8080,443 in 1:12 tc filter add dev eth0 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12 #ftp-data in 1:13 tc filter add dev eth0 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:13 #smtp,pop3 in 1:14 tc filter add dev eth0 parent 1:0 protocol ip prio 4 handle 4 fw classid 1:14 # tc filter add dev eth0 parent 1:0 protocol ip prio 5 handle 5 fw classid 1:15
这样数据包会有一个特定的FWMARK标记值(hanlde x fw) | | | |