<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>芷菁博客 &#187; iptables</title>
	<atom:link href="http://www.stars625.com/tag/iptables/feed" rel="self" type="application/rss+xml" />
	<link>http://www.stars625.com</link>
	<description>记录生活点滴，分享学习体会，专注微嵌开发。</description>
	<lastBuildDate>Sat, 03 Dec 2011 13:05:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>网络地址转换NAT原理及应用</title>
		<link>http://www.stars625.com/nat.html</link>
		<comments>http://www.stars625.com/nat.html#comments</comments>
		<pubDate>Tue, 11 May 2010 13:28:17 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[网络通讯]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[nat]]></category>
		<category><![CDATA[网络地址转换]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=279</guid>
		<description><![CDATA[这是做路由器的时候，学习网络地址转换Network Address Translation后的一些理解整理，主要通过实例和图表的方式展示了NAT的工作原理和每个阶段的状态。本文的NAT是基本于Linux下的iptables命令实现。]]></description>
			<content:encoded><![CDATA[<p><strong>1	概述</strong></p>
<p>1.1	简介</p>
<p>NAT英文全称是“Network Address Translation”，中文意思是“网络地址转换”，它是一个IETF(Internet Engineering Task Force, Internet工程任务组)标准，允许一个整体机构以一个公用IP（Internet Protocol）地址出现在Internet上。顾名思义，它是一种把内部私有网络地址（IP地址）翻译成合法网络IP地址的技术。因此我们可以认为，NAT在一定程度上，能够有效的解决公网地址不足的问题。</p>
<p>1.2	分类</p>
<p>NAT有三种类型：静态NAT(Static NAT)、动态地址NAT(Pooled NAT)、网络地址端口转换NAPT（Port-Level NAT）。</p>
<p>其中，网络地址端口转换NAPT（Network Address Port Translation）则是把内部地址映射到外部网络的一个IP地址的不同端口上。它可以将中小型的网络隐藏在一个合法的IP地址后面。NAPT与 动态地址NAT不同，它将内部连接映射到外部网络中的一个单独的IP地址上，同时在该地址上加上一个由NAT设备选定的端口号。</p>
<p>NAPT是使用最普遍的一种转换方式，在HomeGW中也主要使用该方式。它又包含两种转换方式：SNAT和DNAT。</p>
<p>(1)源NAT（Source NAT，SNAT）：修改数据包的源地址。源NAT改变第一个数据包的来源地址，它永远会在数据包发送到网络之前完成，数据包伪装就是一具SNAT的例子。</p>
<p>(2)目的NAT（Destination NAT，DNAT）：修改数据包的目的地址。Destination NAT刚好与SNAT相反，它是改变第一个数据懈的目的地地址，如平衡负载、端口转发和透明代理就是属于DNAT。</p>
<p><img src="http://www.stars625.com/wp-content/uploads/nat1.gif" alt="" /></p>
<p>1.3	应用</p>
<p>NAT主要可以实现以下几个功能：数据包伪装、平衡负载、端口转发和透明代理。</p>
<p>数据伪装: 可以将内网数据包中的地址信息更改成统一的对外地址信息，不让内网主机直接暴露在因特网上，保证内网主机的安全。同时，该功能也常用来实现共享上网。</p>
<p>端口转发: 当内网主机对外提供服务时，由于使用的是内部私有IP地址，外网无法直接访问。因此，需要在网关上进行端口转发，将特定服务的数据包转发给内网主机。</p>
<p>负载平衡: 目的地址转换NAT可以重定向一些服务器的连接到其他随机选定的服务器。</p>
<p>失效终结: 目的地址转换NAT可以用来提供高可靠性的服务。如果一个系统有一台通过路由器访问的关键服务器，一旦路由器检测到该服务器当机，它可以使用目的地址转换NAT透明的把连接转移到一个备份服务器上。</p>
<p>透明代理: NAT可以把连接到因特网的HTTP连接重定向到一个指定的HTTP代理服务器以缓存数据和过滤请求。一些因特网服务提供商就使用这种技术来减少带宽的使用而不用让他们的客户配置他们的浏览器支持代理连接。</p>
<p><strong>2	原理</strong></p>
<p>2.1	地址转换</p>
<p>NAT的基本工作原理是，当私有网主机和公共网主机通信的IP包经过NAT网关时，将IP包中的源IP或目的IP在私有IP和NAT的公共IP之间进行转换。</p>
<p>如下图所示，NAT网关有2个网络端口，其中公共网络端口的IP地址是统一分配的公共 IP，为202.20.65.5；私有网络端口的IP地址是保留地址，为192.168.1.1。私有网中的主机192.168.1.2向公共网中的主机202.20.65.4发送了1个IP包(Dst=202.20.65.4,Src=192.168.1.2)。</p>
<p><img src="http://www.stars625.com/wp-content/uploads/nat2.gif" alt="" /></p>
<p>当IP包经过NAT网关时，NAT Gateway会将IP包的源IP转换为NAT Gateway的公共IP并转发到公共网，此时IP包（Dst=202.20.65.4，Src=202.20.65.5）中已经不含任何私有网IP的信息。由于IP包的源IP已经被转换成NAT Gateway的公共IP，Web Server发出的响应IP包（Dst= 202.20.65.5,Src=202.20.65.4）将被发送到NAT Gateway。</p>
<p>这时，NAT Gateway会将IP包的目的IP转换成私有网中主机的IP，然后将IP包（Des=192.168.1.2，Src=202.20.65.4）转发到私有网。对于通信双方而言，这种地址的转换过程是完全透明的。转换示意图如下。<br />
<img src="http://www.stars625.com/wp-content/uploads/nat3.gif" alt="" /></p>
<p>如果内网主机发出的请求包未经过NAT，那么当Web Server收到请求包，回复的响应包中的目的地址就是私网IP地址，在Internet上无法正确送达，导致连接失败。</p>
<p>2.2	连接跟踪</p>
<p>在上述过程中，NAT Gateway在收到响应包后，就需要判断将数据包转发给谁。此时如果子网内仅有少量客户机，可以用静态NAT手工指定；但如果内网有多台客户机，并且各自访问不同网站，这时候就需要连接跟踪（connection track）。如下图所示：</p>
<p><img src="http://www.stars625.com/wp-content/uploads/nat4.gif" alt="" /></p>
<p>在NAT Gateway收到客户机发来的请求包后，做源地址转换，并且将该连接记录保存下来，当NAT Gateway收到服务器来的响应包后，查找Track Table，确定转发目标，做目的地址转换，转发给客户机。</p>
<p>2.3	端口转换</p>
<p>以上述客户机访问服务器为例，当仅有一台客户机访问服务器时，NAT Gateway只须更改数据包的源IP或目的IP即可正常通讯。但是如果Client A和Client B同时访问Web Server，那么当NAT Gateway收到响应包的时候，就无法判断将数据包转发给哪台客户机，如下图所示。</p>
<p><img src="http://www.stars625.com/wp-content/uploads/nat5.gif" alt="" /></p>
<p>此时，NAT Gateway会在Connection Track中加入端口信息加以区分。如果两客户机访问同一服务器的源端口不同，那么在Track Table里加入端口信息即可区分，如果源端口正好相同，那么在时行SNAT和DNAT的同时对源端口也要做相应的转换，如下图所示。</p>
<p><img src="http://www.stars625.com/wp-content/uploads/nat6.gif" alt="" /></p>
<p><strong>3	Linux下NAT实现</strong></p>
<p>3.1	netfilter/iptables模块</p>
<p>netfilter/iptables（IP信息包过滤系统）是一种功能强大的工具，根据数据包过滤规则，对经过的网络数据包进行丢弃、改造、转发等处理。</p>
<p>netfilter组件也称为内核空间（kernelspace），是内核的一部分，由一些数据包过滤表组成，这些表包含内核用来控制信息包过滤处理的规则集。</p>
<p>iptables组件是一种工具，也称为用户空间（userspace），它主要用来向用户提供添加、修改、删除内核中数据过滤表的接口。</p>
<p>3.2	基于netfilter/iptables的NAT</p>
<p>netfilter/iptables中的数据包过滤表有三种：filter、nat和mangle。</p>
<p>filter 表用于一般的信息包过滤，它包含 INPUT 、 OUTPUT 和 FORWARD 链。</p>
<p>nat 表用于要转发的信息包，它包含 PREROUTING 、 OUTPUT 和 POSTROUTING 链。</p>
<p>如果信息包及其头内进行了任何更改，则使用 mangle 表。该表包含一些规则来标记用于高级路由的信息包，该表包含 PREROUTING 和 OUTPUT 链。</p>
<p>filter 表用来过滤数据包，我们可以在任何时候匹配包并过滤它们。Mangle不经常使用还在开发当中。我们下面主要介绍Nat表来实现NAT功能。</p>
<p>(1)用户使用iptables命令在用户空间设置NAT规则。通过使用用户空间iptables命令，可以构建用户自己的定制NAT规则。所有规则存储在内核空间的nat表中。根据规则所处理的信息包类型，将规则分组在链中。要做SNAT的信息包被添加到POSTROUTING链中。要做DNAT的信息包被添加到PREROUTING链中。直接从本地出站的信息包的规则被添加到OUTPUT 链中。</p>
<p>(2)内核空间接管NAT工作.做过NAT操作的数据包的地址就被改变了，当然这种改变是根据我们的规则进行的。属于一个流的包只会经过这个表一次。如果第一个包被允许做NAT或 Masqueraded，那么余下的包都会自动地被做相同的操作。也就是说，余下的包不会再通过这个表，一个一个的被NAT，而是自动地完成。这就是我们为什么不应该在这个表中做任何过滤的主要原因。PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址，如果需要的话。OUTPUT链改变本地产生的包的目的地址。下图是数据包穿越整个netfilter/iptables的流程图。</p>
<p><img src="http://www.stars625.com/wp-content/uploads/nat7.gif" alt="" /></p>
<p>（3）NAT工作步骤：</p>
<p>DNAT：若包是被送往PREROUTING链的，并且匹配了规则，则执行DNAT或REDIRECT目标。为了使数据包得到正确路由，必须在路由之前进行DNAT。</p>
<p>路由：内核检查信息包的头信息，尤其是信息包的目的地。</p>
<p>处理本地进程产生的包：对nat表OUTPUT链中的规则实施规则检查，对匹配的包执行目标动作。</p>
<p>SNAT：若包是被送往POSTROUTING链的，并且匹配了规则，则执行SNAT或MASQUERADE目标。系统在决定了数据包的路由之后才执行该链中的规则。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/nat.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>彻底封杀P2P网络下载流量</title>
		<link>http://www.stars625.com/killp2p.html</link>
		<comments>http://www.stars625.com/killp2p.html#comments</comments>
		<pubDate>Wed, 24 Jun 2009 07:33:51 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[网络通讯]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[netfilter]]></category>
		<category><![CDATA[P2P]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=141</guid>
		<description><![CDATA[P2P对网络性能的影响是相当明显在，在同一个网络内如果有一台机器开了使用P2P协议的软件，整个网络的速度都会变慢，打开网页都困难。本文主要介绍了P2P的问题所在，以及分析如何禁止P2P流量。]]></description>
			<content:encoded><![CDATA[<p>P2P最初是使用在BT下载上，出现之初的确带网络带来了一丝新意，下载速度提高明显，但随着使用越来越普遍、应用越来越广泛，迅雷、网络电视等等，给现有的网络建立了大量的链接，占用大量网络时间和流量，影响网内用户的上网速度，增加了网络运营商的流量成本。</p>
<p>目前最常用的方法是封掉P2P软件使用的端口范围，但这种做法做容易破解，只要在软件上重设一个端口就行了，该方法只能限制一小部份的用户；另一种方法就是分析协议，这种方法效率相对较低，因为要分析包内容，本文介绍的是后一种。</p>
<p>在Window平台是常用的一款软件是“P2P终结者”，没有仔细研究过，网上也有“反P2P终结者”这样的话，我想效果也是不太好的吧。文中介绍的是一种在Linux平台下基于Netfilter框架的包过滤机制。</p>
<p>注意本文仅适用于使用Linux作为网关或路由的用户，使用路由器的用户想要禁用P2P的话，可以买带有P2P管控的路由器如TL-WR541G+管控版等，使用DD-WRT的路由器可以参考以下文章：“从实例学习DD-WRT之封杀P2P”http://q.yesky.com/group/review-17574318.html。</p>
<p>参考DD-WRT的源码和网上其它文章，目前Linux下P2P过滤主要有两款工具：</p>
<p>IPP2P http://www.ipp2p.org/</p>
<p>L7-filter http://l7-filter.sourceforge.net/</p>
<p>以上都上基于Netfilter框架的需要下载、编译、安装，综合了源码的难易程序，规模大小，选择IPP2P作为介绍对象，详细信息大家可以参考其官网。</p>
<p>Netfilter框架主要包括Kernel层的包过滤机制和Userland用户层的iptables配置工具，用户通过iptables命令对Kernel层的Netfilter进行配置，实现包过滤。IPP2P就是在Netfilter中载入模块实现对网络包的分析、过滤；在iptables中也通过模块增加了过滤P2P包的选项。因此，安装IPP2P后，可以使用iptables命令来配置P2P过滤规则，也可以将其写入脚本文件实现自动化处理。</p>
<p>首先从IPP2P官网下载最新Src：http://www.ipp2p.org/downloads/ipp2p-0.8.2.tar.gz。里面共有6个文件：COPYING、README、Makefile、ipt_ipp2p.h、ipt_ipp2p.c、libipt_ipp2p.c。</p>
<p>COPYING是版权说明文件，该工具是基于GPL的；README介绍了安装方法、环境要求等，可以先阅读一下；Makefile编译用的；ipt_ipp2p头文件，里面定义了支持过滤的P2P协议、软件；ipt_ipp2p.c该文件是针对Kernel层的，包数据处理、分析模块；libipt_ipp2p.c该文件是针对iptables工具的，提供用户接口，包含帮助信息等。</p>
<p>ipt_ipp2p.c中在模块初始化函数中调用ipt_register_match(&#038;ipp2p_match);注册P2P处理结构，ipp2p_match是一个结构体，包含一些参数，根据内核版本不同，结构体有所不同，里面主要调用一个函数static int match(const struct sk_buff *skb, &#8230;)，对于收到的包都通过这个函数进行分析，首先在match函数里分析是TCP协议还是UDP协议的包，然后根据用户配置信息，对不同的P2P协议进行匹配。</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/*Search for UDP eDonkey/eMule/Kad commands*/</span>
<span style="color: #993333;">int</span> udp_search_edk <span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>haystack<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> packet_len<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*Search for UDP Gnutella commands*/</span>
<span style="color: #993333;">int</span> udp_search_gnu <span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>haystack<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> packet_len<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*Search for UDP KaZaA commands*/</span>
<span style="color: #993333;">int</span> udp_search_kazaa <span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>haystack<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> packet_len<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*Search for UDP DirectConnect commands*/</span>
<span style="color: #993333;">int</span> udp_search_directconnect <span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>haystack<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> packet_len<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*Search for UDP BitTorrent commands*/</span>
<span style="color: #993333;">int</span> udp_search_bit <span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>haystack<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> packet_len<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*Search for Ares commands*/</span>
<span style="color: #993333;">int</span> search_ares <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>payload<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> u16 plen<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*Search for SoulSeek commands*/</span>
<span style="color: #993333;">int</span> search_soul <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>payload<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> u16 plen<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*Search for WinMX commands*/</span>
<span style="color: #993333;">int</span> search_winmx <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>payload<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> u16 plen<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*Search for appleJuice commands*/</span>
<span style="color: #993333;">int</span> search_apple <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>payload<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> u16 plen<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*Search for BitTorrent commands*/</span>
<span style="color: #993333;">int</span> search_bittorrent <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>payload<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> u16 plen<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*check for Kazaa get command*/</span>
<span style="color: #993333;">int</span> search_kazaa <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>payload<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> u16 plen<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*check for gnutella get command*/</span>
<span style="color: #993333;">int</span> search_gnu <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>payload<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> u16 plen<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*check for gnutella get commands and other typical data*/</span>
<span style="color: #993333;">int</span> search_all_gnu <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>payload<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> u16 plen<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*check for KaZaA download commands and other typical data*/</span>
<span style="color: #993333;">int</span> search_all_kazaa <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>payload<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> u16 plen<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*fast check for edonkey file segment transfer command*/</span>
<span style="color: #993333;">int</span> search_edk <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>payload<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> u16 plen<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*intensive but slower search for some edonkey packets including size-check*/</span>
<span style="color: #993333;">int</span> search_all_edk <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>payload<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> u16 plen<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*fast check for Direct Connect send command*/</span>
<span style="color: #993333;">int</span> search_dc <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>payload<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> u16 plen<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*intensive but slower check for all direct connect packets*/</span>
<span style="color: #993333;">int</span> search_all_dc <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>payload<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> u16 plen<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*check for mute*/</span>
<span style="color: #993333;">int</span> search_mute <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>payload<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> u16 plen<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* check for xdcc */</span>
<span style="color: #993333;">int</span> search_xdcc <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>payload<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> u16 plen<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* search for waste */</span>
<span style="color: #993333;">int</span> search_waste<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>payload<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> u16 plen<span style="color: #009900;">&#41;</span></pre></div></div>

<p>以上函数就是对不同协议进行匹配的过程，它主要是通过Payload里的关键字进行匹配的，如果各位想自行添加对其它P2P软件的过滤如迅雷、PPLive等就需要抓包，分析协议供同点，在此新增处理函数，并且在matchlist、udp_list中增加相应的函数指针，更不要忘了在libipt_ipp2p.c增加相应的用户选项。</p>
<p>libipt_ipp2p.c就不多说了，主要是一些命令开关选项等，看到这里是不是感觉很简单呢，自己试试吧，当然有可能遇到很多问题，比如编译内核模块需要内核头文件；内核版本不同，相应的接口函数也不同，总之遇到问题不要害怕，仔细查找原理、解决。</p>
<p>如果还是嫌麻烦的话，已经有网友为我们修改了IPP2P，增加了以下特性：</p>
<p>1、修正部分BT和电驴的过滤特征码。</p>
<p>2、添加PPLive/PPStream/UUSee/QQLive/沸点网络电视/POCO/QVOD的过滤特征码，添加选项&#8211;pp，集合在&#8211;ipp2p选项中。</p>
<p>3、添加Vagaa的过滤代码在&#8211;edk中，集合在&#8211;ipp2p选项中。</p>
<p>4、添加迅雷/QQ超级旋风/百度下吧的过滤特征码，添加选项&#8211;xunlei，未集合在&#8211;ipp2p选项中。</p>
<p>参考发下这篇文章：“IPP2P模块修改版，最新0.99.16”http://linux.chinaunix.net/bbs/thread-914377-1-6.html。</p>
<p>查看最新的DD-WRT V24-SP1源码，好像没找到到IPP2P的身影，不过L7倒是有的，各位也可以去看看L7的工作原理。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/killp2p.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

