只要在联网环境中使用 Linux,您就可以使用内核功能通过操纵网络包将内部网络区域和外部网络区域隔开。 Linux netfilter 框架提供了一种建立有效防火墙的方法,可以将不同网络隔开。 借助 iptables - 用于定义规则集的通用表结构 - 可以精确控制哪些包能通过网络接口。 使用 SuSEfirewall2 和相应的 YaST 模块,您可以轻而易举地设置这种包过滤器。
部件 netfilter 和 iptables 负责网络包的过滤和操纵以及网络地址转换 (NAT)。 过滤准则及与过滤准则关联的所有操作均储存在链中;各个网络包在到达时,必须依次与这些链进行匹配。 要匹配的链储存在表中。 使用 iptables 命令可以更改这些表和规则集。
Linux 内核维护以下三个表,分别对应包过滤器的不同功能:
此表储存大多数过滤规则,因为它执行严格意义上的包过滤机制,例如,决定是让包通过 (ACCEPT) 还是将包丢弃 (DROP)。
此表定义对包的源地址和目标地址所做的任何更改。 使用这些功能还能实现伪装,这是 NAT 的一个特例,用于将专用网络与因特网链接起来。
此表中的规则用于操纵 IP 报头中储存的值(如服务类型)。
这些表包含多个用于匹配包的预定义链:
此链适用于入站包。
此链适用于发往系统内部进程的包。
此链适用于仅在系统中路由的包。
此链适用于从系统自身发出的包。
此链适用于所有出站包。
图 39.1 “iptable:包的可能路径”演示了网络包在特定系统中传送时可能经过的路径。 为了便于说明,图中将表作为链的各个部分列出,但实际上表本身储存了这些链。
在所有可能的情况中最简单的情况是:发往系统本身的入站包到达 eth0 接口。 数据包首先要转到 mangle 表的 PREROUTING 链,然后转到 nat 表的 PREROUTING 链。 随后的步骤(涉及包的路由选择)确定包的实际目标,这是系统自身的过程。 在包经过 mangle 表和 filter 表的 INPUT 链后,只要与 filter 表的规则确实匹配,那么包将最终到达目标。