为了在 Linux 下使用 divert sockets,您需要两样东西 - 已为 divert sockets 打过补丁的内核源代码,以及同样已为使用 divert sockets 打过补丁的 ipchains-1.3.9 源代码。
这两部分源代码都可以从 divert socket 网站 http://www.anr.mcnc.org/~divert 获取。您可以以两种形式获取 divert sockets 内核的源代码 - 作为 linux-2.2.12 的补丁,您必须将其应用到全新的 2.2.12 源代码上,或者作为已打过补丁的内核 tarball(比补丁大得多)。ipchains 源代码仅以完整的源代码 tarball 形式提供。
编译 ipchains 很简单 - 只需在 ipchains-1.3.9 子目录下输入
make
即可。
当编译 divert-socket 内核时 - 使用您最喜欢的配置方式
make config
或make menuconfig
或make xconfig
在继续之前,不要忘记启用“Prompt for development and/or incomplete code/drivers”(提示开发和/或不完整的代码/驱动程序)。只有三个编译时选项会影响 divert sockets 的行为,它们在下面的 章节 中进行了解释
为了在您的内核中启用 divert sockets,您必须首先启用防火墙和 IP 防火墙。影响 divert sockets 行为的三个内核编译时选项是
在您的内核中启用 divert sockets。
更改 DIVERT 规则的行为:默认情况下,如果防火墙中存在 DIVERT 规则,并且没有应用程序正在监听该规则指定的端口,则任何满足该规则的数据包都会被静默丢弃,就像它是 DENY 规则一样。
启用 pass-through 模式会导致此类数据包继续通过 IP 协议栈,就好像什么都没发生一样。如果您想在防火墙中设置静态规则,但并非总是想监听它,这可能会有所帮助。
更改套接字处理分片的方式。默认情况下,divert socket 接收大于 MTU 的数据包的各个分片,然后将其转发到用户空间。在这种情况下,分片整理的负担在于监听 divert socket 的应用程序。此外,应用程序无法注入任何大于 MTU 的分片,因为它们将被丢弃(这是内核的限制,而不是 divert sockets 的限制 - 高达 2.2.x 的 Linux 内核不分片设置了 IP_HDRINCL 选项的原始数据包)。通常,这没问题,因为如果您只是按接收它们的方式重新注入分片,一切都会正常工作,因为它们都不会大于 MTU。
如果您启用 always defragment 选项,那么所有分片整理都将在内核中为您完成。这会严重影响拦截机制的性能,因为现在您要拦截的每个大型数据包都必须首先重新组装,然后才能转发给您,并且如果您选择重新注入它 - 它将不得不再次分片(启用此选项的内核将能够分片带有 IP_HDRINCL 的原始数据包)
由于防火墙代码的结构方式 - 它只查看每个数据包的第一个分片,并将所有其他分片传递而不查看它们,因此这是 Linux 2.0.36 下 divert sockets 唯一可用的选项。这样,如果第一个分片被防火墙丢弃,其余的分片最终将被分片整理器丢弃。这就是为什么为了使 DIVERT sockets 工作,您被迫编译 always defragment 选项,以便您始终获得整个数据包被分流到您,而不仅仅是第一个分片。
在 2.2.12 中,由于防火墙代码的更改,您现在可以选择让内核或您自己进行分片/分片整理。
注意: 分片整理功能在 divert sockets 的 1.0.4 版本中尚未添加。它正在开发中。