Redhat 9.0下限制P2P流量
时间:2006-03-30 来源:noahtang
这篇文章参考了很多其他高手的文章,在这儿向他们表示感谢!!!
一、准备工作
1、 下载iptables-1.3.5.tar.bz2、patch-o-matic-ng-20040621.tar.bz2、ipp2p-0.8.1_rc1.tar.gz、iproute2-ss050607.tar.gz。
注: (1)这儿下载的代码经测试载Redhat 9.0下都是可以使用的;
(2)较新的patch-o-matic-ng中已经没有了我们下面所需的CONNMARK模块。
2、 解压iptables-1.3.5.tar.bz2、patch-o-matic-ng-20040621.tar.bz2、ipp2p-0.8.1_rc1.tar.gz、iproute2-ss050607.tar.gz到/usr/src目录下。(实际上可以把代码解压到任意目录)
3、 Redhat 9.0配置如下:
Eth0 192.168.1.215 网关指向192.168.1.2
Eth1 10.0.0.1
主机配置如下:
Eth0 10.0.0.212 网关指向10.0.0.1
二、不编译内核完全阻断P2P通信
1、 进入ipp2p目录/usr/src/ipp2p-0.8.1_rc1。修改Makefile中的IPTABLES_SRC为IPTABLES_SRC=/usr/src/iptables-1.3.5,使IPTABLES_SRC指向iptables的目录。
2、 进入iptables目录/usr/src/iptables-1.3.5。修改Makefile中的KERNEL_DIR为KERNEL_DIR=/usr/src/linux-2.4,使KERNEL_DIR指向内核源代码目录。
3、 编译并安装iptables。iptables的默认安装目录为/usr/local/sbin/。
4、 编译ipp2p。
把编译好的libipt_ipp2p.so拷贝到/usr/local/lib/iptables/目录下。
把编译好的ipt_ipp2p.o插入内核,insmod -f ipt_ipp2p.o。
5、 测试。执行iptables -m ipp2p --help,若出现ipp2p的相关信息,并且用lsmod可以查看到ipp2p模块,表明ipp2p运行成功。
6、 在NAT表中配置规则:
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.169.1.215。
7、 在FILTER表中配置规则:
iptables -A FORWARD -m ipp2p --ipp2p -j DROP。
(当前的--ipp2p等价于--edk --dc --kazaa --gnu --bit --apple --winmx --soul --ares)
经过如上的配置,可以完全阻断P2P的预连接,使得P2P完全无法通信。我用bitcomet 0.63进行测试,效果非常好,P2P通信流量一直为0。
三、编译内核限制P2P流量
1、 进入patch-o-matic-ng目录/usr/src/patch-o-matic-ng-20040621。iptables中P2P流量控制需CONNMARK模块支持,该模块在extra仓库中,运行如下命令来升级内核补丁。
KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.5 ./runme extra
2、 运行该命令后会出现一个模块选择界面,界面有两个区域,一个给出相关的模块名、模块功能、用法和语法实例;另一个给出各种选项,如N/y/b/r.../q/?,其中第一个为大写字母,表示缺省选项,n表示下一个模块,y表示确定,b表示上一个模块,q表示退出。首先应该确定当前的模块是否需要,不需要就按“N”键后回车,继续显示下一个模块的相关信息。当出现需要的模块时,按“Y”键确认。选择完所有需要的模块后,按“Q”键退出。
3、 给内核打好补丁后,进入源代码文件所在目录/usr/src/linux-2.4,开始编译内核。
4、 在make menuconfig时,在配置选项中必须选择Networking options→IP:Netfilter Configuration→Connection mark tracking support和CONNMARK target support两个选项。
在Networking options→Qos and/or fair queueing中选中所需的队列规程和分类器,如CBQ packet scheduler、HTB packet scheduler对列规程,Firewall based classifier、U32 classifier等。
5、 编译完成后用新内核启动。
6、 删除系统默认安装的iptables:
rpm -e lokkit-0.5-22 iptables-1.2.7a-2
7、 先按(二)中的方式修改Makefile,再编译安装iptables-1.3.5、ipp2p-0.8.1_rc1、iproute2-ss050607。
8、 执行下面的脚本:
#!/bin/bash
#Limit Bandwidth of P2P
#下面的命令清空所有的规则
iptables –F
#下面的命令从CONNMARK目标中恢复标记
iptables -t mangle -A PREROUTING -p tcp -j CONNMARK --restore-mark
#下面的命令接收所有非0的标记包
iptables -t mangle -A PREROUTING -p tcp -m mark ! --mark 0 -j ACCEPT
#下面的命令将ipp2p连接标记为“1”
iptables -t mangle -A PREROUTING -m ipp2p --ipp2p -j MARK --set-mark 1
#下面的命令保存所有标记为“1”的包到CONNMARK目标中
iptables -t mangle -A PREROUTING -p tcp -m mark --mark 1 -j CONNMARK --save-mark
#注:TC只能控制网卡发送包的速率
#下面的命令删除旧有队列
tc qdisc del dev eth0 root
#下面的命令将一个htb根对列绑定到网络设备eth0上,其编号为1:0
tc qdisc add dev eth0 root handle 1: htb default 2
#下面的命令建立根分类1:1,速率限制为256Kbit
tc class add dev eth0 parent 1: classid 1:1 htb rate 256Kbit ceil 256Kbit
#下面的命令创建子分类1:2,其父分类为1:1,速率为200Kbit
tc class add dev eth0 parent 1:1 classid 1:2 htb rate 200Kbit ceil 256Kbit
#下面的命令创建子分类1:3,其父分类为1:1,速率为56Kbit
tc class add dev eth0 parent 1:1 classid 1:3 htb rate 56Kbit ceil 256Kbit
#下面的命令为子分类1:2建立过滤器,其中handle 1对应于iptables中设定的标记
tc filter add dev eth0 parent 1:0 protocol ip prio 4 handle 1 fw classid 1:2
经过如上的配置,可以有效限制P2P的流量。我用bitcomet 0.63进行测试,P2P总通信流量一直为100Kbit内。
|