保护您的网络免受 Kazaa 侵害
Kazaa 是当今最流行的文件共享应用程序。像它这样的应用程序被称为对等网络,或 P2P,允许用户相互搜索和下载文件。Kazaa 显然最常用于共享音频文件,这违反了版权法。
Kazaa 的专有网络协议,称为 FastTrack,已授权给许多类似产品的开发者,包括 iMesh 和 Grokster。Kazaa 的精简版本 KazaaLite 也可用。还有许多其他的 P2P 应用程序,但 FastTrack 系列是迄今为止最流行的,也是最难用数据包过滤防火墙(如 Linux 的 iptables)阻止的。
许多网络管理员希望在其防火墙上阻止 P2P 流量,因为其带宽使用率高、不受控制的文件交换存在安全隐患以及版权所有者可能采取法律行动。这并不像听起来那么容易。在互联网上搜索有关使用 iptables 阻止 FastTrack 流量的信息,会得到诸如“阻止端口 1214”、“制定策略并惩戒违规者”或“无法完成”之类的答案。阻止端口 1214 曾经适用于早期版本的 FastTrack,但不适用于最近的版本。需要更复杂的方法。虽然一些“代理”防火墙能够阻止 FastTrack 流量,但基于 iptables 的防火墙存在需要解决的问题。
本文介绍了一个名为 P2Pwall 的新开源项目,该项目开发软件以防止您网络上的 P2P 客户端与外部对等方建立联系。其 ftwall 组件阻止 FastTrack 流量。将在适当的时候编写更多组件来控制其他 P2P 协议,我们邀请您作为开发人员参与进来。该软件已通过以下 FastTrack 客户端测试:Kazaa 2.1.1、Kazaa 2.5、KazaaLite 2.0.2、iMesh 4.1(build 132)和 Grokster 1.7。
现代 Linux 发行版包括 Netfilter 和 iptables 工具。这些组件协同工作,使 Linux 系统可以用作简单但有效的防火墙;然而,FastTrack 网络协议给它们带来了一些有趣的挑战
它不使用固定的端口号。
它不限于与少量对等方对话。它保存了 200 个对等方地址的缓存,并在启动时尝试连接到所有这些地址。列表定期更改,并且在每台机器上都不同。
对等方查找逻辑不依赖于中央目录。
协议的关键部分采用强加密。
防火墙传统上使用两种理念之一。第一种是严格的,阻止所有端口,除了需要的特定端口。第二种是宽松的且不对称的,允许几乎无限的出站连接,同时阻止几乎所有入站连接。使用这两种方法,端口灵活的 FastTrack 都会寻找并利用合法开放的端口。它甚至可以利用端口 80。严格的范例加上端口 80 代理是阻止 FastTrack 所必需的,但这种方法对于希望在阻止 P2P 流量的同时保留宽松范例的网络来说过于限制。
P2Pwall 项目旨在通过提供许多工具和文档来解决这些问题,这些工具和文档能够过滤 P2P 流量。FastTrack 过滤器 ftwall 是第一个这样的工具,可根据 GPL 从 p2pwall.sourceforge.net 下载。ftwall 使用 QUEUE 目标与 iptables 交互。它分析正在通过防火墙转发的数据包,并根据对 FastTrack 协议特征的理解,决定是否应转发或丢弃这些数据包。它试图阻止任何 FastTrack 流量离开,从而进入网络。
ftwall 的作用是仅阻止出站 FastTrack 连接,前提是入站连接已被 iptables 规则阻止。许多防火墙已经对入站连接使用全面阻止,并启用有限数量的服务器连接。但是,如果内部的 FastTrack 客户端连接到外部的对等方,则外部人员可以通过已建立的连接回呼内部人员。因此,如果我们能够依靠防火墙阻止入站连接,并依靠 ftwall 阻止出站连接,我们就有了解决方案;但是,我们需要同时具备这两个部分。
安装和配置 ftwall 只需下载源代码、编译它们并编写一些 iptables 规则即可。一个可能的复杂之处是,逻辑的一个可选增强功能要求内核中存在 ip_string 模块。该模块目前被认为是实验性的,因此未包含在许多 Linux 发行版中。如果您想使用它,可能需要自己添加它。有关更多信息,请参阅 P2Pwall 网站。
当 iptables 规则将 QUEUE 指定为目标时,任何与该规则匹配的数据包都会放入队列中,以供诸如 ftwall 之类的应用程序收集。然后,程序可以丢弃数据包或将其传递回 Netfilter 以进行进一步检查和转发。调用此机制的典型规则如下所示
iptables -A FORWARD -p tcp -i eth0 -dport 123 \ -syn -j QUEUE
有了这条规则,来自连接到 eth0 的网络且目标端口为远程主机上的 123 的所有 SYN 数据包都会首先传递给程序。程序读取数据包,并使用 libipq 库和 ip_queue 模块返回其判决。
QUEUE 是 iptables 软件的标准部分,随大多数流行的发行版一起提供。要验证它在您的系统上是否可用,请键入insmod ip_queue并检查是否显示错误消息。有关更多详细信息,请参阅 Netfilter FAQ,网址为 www.netfilter.org/documentation/FAQ/netfilter-faq-4.html。
为了解释 ftwall 的工作原理,描述需要与 FastTrack 连接逻辑的部分解释齐头并进。FastTrack 使用三种不同的方法连接到对等方:UDP 数据包洪流、并行 TCP/IP 连接和更传统的 TCP/IP 连接模式。如果软件认为它被阻止,则会在模式之间切换。ftwall 努力使客户端尽可能长时间地在第一种模式下运行,因为这是最容易识别的,并且允许构建对等方地址列表。
当客户端启动时,它会通过防火墙发送大量 UDP 数据包,这些数据包可以通过其长度和内容来识别。Netfilter 将这些数据包排队以供 ftwall 处理(图 1)。然后,ftwall 记录数据包的源地址和目标地址的内部注释,并欺骗性地回复客户端,从而防止客户端得出 UDP 数据包被防火墙阻止的结论,并使其在第一种模式下运行更长时间。
假设 eth0 是家庭网络接口,则设置此排队的 iptables 规则是
iptables -A FORWARD -p udp -i eth0 -j QUEUE
当 FastTrack 收到欺骗性回复时,它会尝试使用 UDP 请求一些额外的设置信息,然后尝试与同一地址建立 TCP/IP 连接。这些 UDP 和 TCP 数据包会传递给 ftwall,ftwall 现在知道目标地址指的是 FastTrack,因此会丢弃它们(图 2)。其他 UDP 非 FastTrack 数据包和 TCP/IP SYN 数据包将返回给 Netfilter 以进行进一步检查并转发到其目的地。
将 SYN 排队到 ftwall 的规则是
iptables -A FORWARD -p tcp -i eth0 --syn -j QUEUE
客户端会在一段时间内重复此 UDP 和 SYN 序列——通常(但并非总是)直到它知道的所有地址都至少尝试过一次。这意味着所有这些地址现在也为 ftwall 所知,应该被过滤。
过一段时间后,客户端会改变策略,并切换到具有强数据包加密的并行 TCP/IP 连接逻辑。ftwall 继续阻止与在第一阶段记录的地址的连接。对于任何其他地址,唯一可以将其识别为 FastTrack 连接的线索是在短时间内看到的大量 SYN 数据包。如果 ftwall 仅依靠 UDP 数据包进行阻止,则它将被击败,特别是如果客户端在第一阶段没有尝试其所有已知地址。此问题的解决方案是时间锁定。
在这种新模式下,客户端将 TCP/IP 连接尝试与 ftwall 已经知道的地址混合在一起,并与其他尚未透露的地址混合在一起(如果有)。ftwall 记录最近一次尝试已知地址的时间,并在之后的可配置时间内阻止来自同一源 IP 地址的所有 TCP/IP 连接。发送到已知地址的每个 SYN 数据包都会重置计时器。如果这些连接尝试足够频繁,ftwall 将继续阻止它们。
此逻辑的副作用是,当 FastTrack 在流氓工作站上运行时,来自该工作站的所有 TCP/IP 连接都会被阻止,包括对 Web 和 FTP 站点的访问。可以认为这是可以接受的,因为工作站的用户违反了组织的策略。一旦客户端应用程序关闭,计时器将停止刷新,并且 TCP/IP 连接将在计时器到期后再次被允许。使用默认配置,这需要两分钟。
在 FastTrack 在此模式下工作一段时间后,它似乎得出结论,并行连接尝试样式正在导致问题,并且它切换到其第三种模式。现在,它减慢了连接尝试的速度,并使用更传统的方法,一次尝试一个地址,每个地址的超时时间为几秒钟。这种新方法挫败了我们迄今为止构建的逻辑,客户端最终会突破。这可能需要一个多小时才能实现,但早期未透露所有已知地址的客户端很有可能在此阶段建立连接。一旦建立单个连接,就会下载一组全新的地址,如果我们在一开始没有采用阻止措施,我们的情况也不会比现在更好。
为了击败这第三种模式,ftwall 需要更多信息来使其能够确定是否仍在使用 FastTrack。它可以做到这一点的一种方法是进行更多欺骗。ftwall 不时向客户端发送一个 UDP 数据包,该数据包是客户端自身用于打开与对等方通信的数据包的副本(图 3)。如果 FastTrack 软件正在工作站上运行,它会回复一个可以轻松识别的数据包,从而导致锁定计时器重置。这些探测数据包的数量和大小相对较小,这意味着对网络使用的影响是最小的。
因为此数据包不是为了转发到公共地址,而是注定要发往防火墙本身,所以 INPUT 链中的 iptables 规则是必需的,以便将其传递给 ftwall。要使用的规则是
iptables -A INPUT -p udp -i eth0 -j QUEUE
这使客户端永久脱机,但效率有点低。如果我们选择合适的时间锁定计时器,则在计时器半过期时发送这些 UDP 数据包就足以将计时器维持在使客户端保持阻止的值。
最后一块拼图是一个安全网,理论上不应该需要它。上述逻辑取决于一组可识别的 UDP 数据包,这些数据包为 ftwall 提供了它需要的信息,但是我们需要考虑如果这些 UDP 数据包没有到达会发生什么——例如,如果用户使用工作站的防火墙软件禁用了 UDP 传输。在这种情况下,我们没有任何东西可以用来确定正在联系的对等方的地址。
但是,我们仍然有一个选择:检查所有 TCP/IP 数据包,以尝试检测文件的实际传输。FastTrack 对加密的使用仅限于连接握手和搜索。共享文件使用明文 HTTP 传输,尽管这不限于端口 80。HTTP 请求标头包括许多字段,这些字段标识 FastTrack 用户、协议和超级节点的地址,超级节点是提供索引信息的节点。如果这些数据包被排队以供 ftwall 检查,它会识别出那些看起来像是 FastTrack 文件下载开始的数据包。从 HTTP 标头中包含的信息,ftwall 会将其阻止地址列表添加到目标 IP 地址和超级节点地址,并将客户端地址添加到应用时间锁定逻辑的地址列表中。
ftwall 的安装过程在软件随附的 INSTALL 文件和项目网站上进行了深入描述,但总而言之,步骤如下:
从 P2Pwall.sourceforge.net 下载源代码并解压缩它们。
安装 libipq 库(如果尚未安装)。在某些系统(包括 Red Hat 7.x 和 8)上,这意味着获取 iptables 源代码并编译它们。
通过运行编译和安装 ftwallmake和make install.
在引导加载程序目录 /etc/rc3.d 中添加一个条目,以启动 ftwall。
验证 QUEUE 机制是否可用,如果不可用,则添加它。大多数最新的 Linux 都已经安装了它,但可以通过修补和重建内核将其添加到没有安装的 Linux 中。
在 INPUT 和 FORWARD 链中创建 iptables 规则。
如果您想调用检查文件下载的 HTTP 标头的安全措施选项,以防您的网络上阻止了 UDP,请将字符串模块添加到内核和 iptables 中。这涉及内核补丁和重建。
重启。
通过在防火墙上运行 ftwall,可以阻止 FastTrack 流量到达 Internet。如果您的防火墙也阻止入站连接,则您的网络是 Kazaa 防护的。网络中的 FastTrack 客户端仍然可以相互通信,但与外部对等方的文件共享被阻止。
此方法的局限性在于仅专注于 FastTrack;但是,P2Pwall 项目旨在扩展其范围,以在未来解决其他 P2P 协议。如果您想以任何方式参与该项目,请发送电子邮件至 chris@lowth.com 与我联系。
ftwall 适用于撰写本文时可用的 FastTrack 客户端。FastTrack 协议将来可能会更改,在这种情况下,可能需要修改 ftwall 以进行匹配。
Chris Lowth (chris@lowth.com) 在 Intercai Mondiale (www.intercai.co.uk) 工作,Intercai Mondiale 是一家位于英国的电信、IT 和业务咨询公司。他与妻子、三个儿子和金毛寻回犬住在英国伦敦。他弹吉他、设计基于 Linux 的安全软件、比起日光浴更喜欢好的雷暴,并通过严格的法国奶酪和印度美食饮食来保持体重。