如何用Netfilter.doc_第1页
如何用Netfilter.doc_第2页
如何用Netfilter.doc_第3页
如何用Netfilter.doc_第4页
如何用Netfilter.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

如何用Netfilter/IPtables限制P2P流量作者:李志明 来源: 发表时间:2006-10-18 浏览次数: 1358 字号:大中小今年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 optionsIP:Netfilter ConfigurationConnection 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/includeIUSER = -I/usr/src/iptables-1.2.7a/includeNETFILTER_VERSION = 1.2.7a改为: IKERNEL = -I/usr/src/linux-2.4/includeIUSER = -I/usr/src/iptables-1.2.8/includeNETFILTER_VERSION = 1.2.8编译软件,并拷贝库文件到相应的目录: #make#cp libipt_ipp2p.so /lib/iptables装入模块: #insmod ipt_ipp2p应用和检测P2P限制功能 iptables-p2p的应用 1iptables-p2p目前支持如下协议: FastTrack(KaZaa、Grokster.) eDonkey(eDonkey、eMule.) Direct Connect Gnutella(regular clients and Shareazas gnutella 2) BitTorrent OpenFT(giFT) 需要安装CONNMARK模块,通过CONNMARK模块的标记包来使用iptables-p2p。 2通过-help参数获取帮助: #iptables -m p2p -helpP2P match v0.3.0a options: -p2p-protocol ! protocol,. -p2p . match application-layer protocol(匹配的应用层协议)Valid p2p protocols:(P2P支持的有效协议如下:)fasttrackgnutellaedonkeydcbittorrentopenftiptables-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的应用 1ipp2p目前支持如下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()1.2.7a、1.2.8、1.2.9 2获取ipp2p帮助 # iptables -m ipp2p -help IPP2P v0.5c options: -ipp2pGrab all known p2p packets (抓所有已知的P2P包) -ipp2p-dataGrab all known p2p data packets (抓所有已知P2P数据包) -edkGrab all known eDonkey/eMule/Overnet packets (抓所有已知的eDonkey/eMule/Overnet类型的包) -edk-dataGrab all eDonkey/eMule/Overnet data packets (抓所有已知的eDonkey/eMule/Overnet数据包) -dcGrab all known Direct Connect packets (抓所有已知的直接连接包) -dc-dataGrab all Direct Connect data packets (抓所有已知的直接连接数据包) -kazaaGrab all KaZaA packets (抓所有KaZaA包) -kazaa-dataGrab all KaZaA data packets (抓所有KaZaA数据包) -gnuGrab all Gnutella packets (抓所有Gnutella包) -gnu-dataGrab all Gnutella data packets (抓所有Gnutella数据包) -bitGrab all BitTorrent packets (beta - handle with care) (抓所有BitTorrent包) -appleGrab all AppleJuice packets (beta - handle with care) (抓所有AppleJuice包) -soulSoulSeek (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 filt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论