<?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; 网络通讯</title>
	<atom:link href="http://www.stars625.com/category/net/feed" rel="self" type="application/rss+xml" />
	<link>http://www.stars625.com</link>
	<description>记录生活点滴，分享学习体会，专注微嵌开发。</description>
	<lastBuildDate>Sun, 18 Jul 2010 02:55:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>VPN Passthrough 学习记录</title>
		<link>http://www.stars625.com/vpnpassthrough.html</link>
		<comments>http://www.stars625.com/vpnpassthrough.html#comments</comments>
		<pubDate>Fri, 25 Jun 2010 11:44:41 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[网络通讯]]></category>
		<category><![CDATA[IPsec]]></category>
		<category><![CDATA[passthrough]]></category>
		<category><![CDATA[PPTP]]></category>
		<category><![CDATA[VPN]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=306</guid>
		<description><![CDATA[我们在使用VPN连接时，由于VPN数据是经过加密处理的，不同于普通的网络访问数据，在经过网关等网络设备时，有可能将VPN数据作为损坏的数据丢弃，导致VPN连接失败。这个时候我们可以通过开启NAT-T、NAT ALG等VPN Passthrough功能。]]></description>
			<content:encoded><![CDATA[<p><strong>VPN Passthrough概述</strong></p>
<p>VPN Passthrough的应用场景主要有两种：一种是内网的VPN客户端通过Passthrough访问远程的VPN服务器；另一种是内网的VPN服务器通过Passthrouth为远程的其它机器提供VPN服务。对VPN服务器的Passthrough需要根据VPN Server的地址使用NAT工具进行端口映射，主要通过NAT功能实现，这里主要讨论第一种情况VPN Client的Passthrough。</p>
<p>Passthrough的类型，按照VPN的类型也有以下几种：IPSec Passthrough、PPTP Passthrough、L2tp Passthrough等。</p>
<p>在网关设备上，如果防火墙没有打开，那么在该情况下，所有包都是可以通过的；如果防火墙打开了，那么VPN Passthrough功能就是要将VPN服务需使用的协议、端口允许通过。如果在网关设备上开启了NAT功能，由于NAT与VPN有一些冲突，那么Passthrough应该包含两个方面内容：一是PPTP的Passthrough；另外一种是L2TP/IPSec的Passthrough。对于PPTP，NAT中有相应的程序来支持其Passthough，e.g. Linux Netfilter里面的nf_nat_pptp.ko和nf_conntrack_pptp.ko模块。而对于IPSec的Passthough，基本上是VPN客户端/服务器上通过启用NAT-T来实现，如果不使用NAT-T的话，那么NAT设备后的VPN服务器只能建立一路IPSec连接。</p>
<p><strong>IPSec Passthrough</strong></p>
<p>IPSec在3个方面保证了网络数据包的安全：机密性、完整性、认证性。机密性就是保证数据包的原始内容不被看到；完整性即保证数据包的内容不会被修改；认证性保证数据来自被信任的客户端。因此不可避免地需要使用多种的加密算法来修改数据包的内容。修改后的数据包有2种主要的封装形式： AH (Authentication Header) 和ESP (Encapsulating SecurityPayload)。 AH在IP数据包中插入了一个包头，其中包含对整个数据包内容的校验值。AH只用于对IP 数据包的认证，而并不对数据包认证作任何修改。ESP用户加密整个数据包内容，同时也可以对数据包进行认证。AH和ESP 即可以同时使用也可以分开使用。</p>
<p>IPSec 在传输数据的时候也有2 种不同的模式：传输模式和隧道模式。传输模式主要用于主机到主机之间的直接通信；而隧道模式主要用于主机到网关或网关到网关之间。传输模式和隧道模式主要在数据包封装时有所不同（如图1 所示）。</p>
<p><center><img src="http://www.stars625.com/wp-content/uploads/vpnpassthrough1.gif" alt="IPSec VPN" /></center></p>
<p>在传输模式中，只有IP包的传输层部分被修改（认证或者加密）；而在隧道模式中，整个数据包包括IP头都被加密或认证（如图2）。</p>
<p><center><img src="http://www.stars625.com/wp-content/uploads/vpnpassthrough2.gif" alt="IPSec VPN" /></center></p>
<p>在多数情况下NAT 的处理对用户使用是完全透明的，但是当希望使用IPSec 技术组建VPN 网络时，NAT 却带来了很大的麻烦。IPSec协议的主要目标是保护IP数据包的完整性，这意味着IPSec会禁止任何对数据包的修改。但是NAT 处理过程是需要修改IP 数据包的IP 头数据、传输层报文头数据甚至传输数据的内容（如FTP 应用），才能够正常工作。所以一旦经过IPSec 处理的IP 包穿过NAT设备时，包内容被NAT 设备所改动，修改后的数据包到达目的主机后其解密或完整性认证处理就会失败，于是这个报文被认为是非法数据而被丢弃。这就是组建VPN 网关最常见的“IPSec 与NAT 协调工作”的问题。那么我们在什么时候会遇到这个问题呢？如果我们的VPN 设备在NAT设备的后面，如果我们在外地上网需要通过VPN客户端访问公司内网，如果我们没有合法的公网地址，只能通过服务商接入Internet 等等，都会遇到这个问题。</p>
<p>无论传输模式还是隧道模式，AH都会认证整个数据包。不同于ESP 的是，AH还会认证位于AH头之前的IP 头。当NAT 设备修改了IP 头之后，IPSec 就会认为这是对数据包完整性的破坏，从而丢弃数据包。因此AH 是绝对不可能和NAT 在一起工作的。</p>
<p>ESP模式在传输模式时会保护TCP/UDP头，但是并不保护IP头，因此修改IP 地址并不会破坏整个数据包的完整性。但是如果数据包是TCP/UDP数据包，NAT设备就需要修改数据包的校验值，而这个校验值是被ESP 所保护的，这样却会导致完整性校验失败。 所以最终可能和NAT一起工作的只能是隧道模式下的ESP。但是IKE和NAT工作时却有存在着冲突。</p>
<p>现在有许多的解决方案来解决NAT 和IPSec 共存问题，这里我们主要讨论一种最主要的解决方法：NAT-T和NAT穿越。</p>
<p>NAT-T设计简单，不需要改动已有的设备或者协议，只需要边界设备支持即可。这个技术的基本思路是在IPSec 封装好的数据包外再进行一次UDP 的数据封装。这样，当此数据包穿过NAT 网关时，被修改的只是最外层的IP/UDP 数据，而对其内部真正的IPSec 数据没有进行改动；在目的主机处再把外层的IP/UDP 封装去掉，就可以获得完整的IPSec 数据包。NAT-T在实际运作时，第一步是判断通信的双方是否支持NAT-T，这主要通过IKE协商时彼此发送的第一个数据包来判断。在判断双方均支持 NAT-T后，进入到第二步，去发现在上方的链路中间是否存在NAT设备，这一步通常成为NAT发现。NAT发现的原理实际上就是判断通信双发的IP 地址或者端口是否发生了改变。当发现NAT 设备以后，NAT-T 双方开始协商所采用的数据包封装方式，至此完成协商过程。</p>
<p>NAT穿越是在VPN设备上进行设置，选择使用隧道模式下的ESP加密。</p>
<p><strong>PPTP Passthrough</strong></p>
<p>点对点隧道协议（PPTP）是一种支持多协议虚拟专用网络的网络技术。通过该协议，远程用户能够安全访问公司网络，并能拨号连入本地 ISP，通过 Internet 安全链接到公司网络。</p>
<p>PPTP 使用 GRE 的扩展版本来传输用户 PPP 包。这些增强允许为在 PAC 和 PNS 之间传输用户数据的隧道提供低层拥塞控制和流控制。这种机制允许高效使用隧道可用带宽并且避免了不必要的重发和缓冲区溢出。</p>
<p>在同一内网中只能正确建立一路PPTP连接，其他连接会在认证过程中止。这是因为在经过NAT设备时，NAT可能改变数据包中的端口信息，导致数据包不能正确识别。</p>
<p>为了解决NAT穿越问题，可以使用ALG模块。在Linux最新的内核中已经包含了PPTP相当的ALG模块，只需运行中加载相应模块，并且确保防火墙能正常通过即可。</p>
<p>综上，对于使用Linux系统搭建的网关设备要允许VPN数据顺利通过可以在边际设备上启用NAT-T，或在网关设备上加载相关的ALG模块；如果是购买网关设备产品，要注意选择支持VPN Passthough功能的产品，并开启VPN Passthough功能。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/vpnpassthrough.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>0</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>4</slash:comments>
		</item>
	</channel>
</rss>
