服务器 频道

Redhat 9.0下限制P2P流量

  【IT168 服务器学院】一、准备工作

  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内。

  这篇文章参考了很多其他高手的文章,在这儿向他们表示感谢!!!


  

0
相关文章