Linux 内核使用 Netfilter 来过滤数据包,它允许一些数据包被系统接收或处理,而拒绝其它一些数据包。这个功能被内建在 Linux 内核中,它有以下三个内建的 规则表(tables) 或 规则列表(rules lists):
filter — 处理网络数据包的默认规则表。
nat — 修改数据包来创建新的连接;处理网络地址转换(Network Address Translation) (NAT)。
mangle — 被用来处理特定的数据包。
每个规则表都包括一组内建的 chain,它们与 netfilter 对数据包所执行的行动相对应。
filter 规则表内建的 chain 包括:
INPUT — 应用于目标地址是这个主机的网络数据包。
OUTPUT — 应用于本地产生的网络数据包。
FORWARD — 应用于通过这个主机路由的数据包。
nat 规则表的内建 chain 包括:
PREROUTING — 当到达时修改网络数据包。
OUTPUT — 在把本地产生的网络数据包发出前进行修改。
POSTROUTING — 在把网络数据包发出前进行修改。
mangle 规则表的内建 chain 包括:
INPUT — 修改目标地址为这个主机的网络数据包。
OUTPUT — 在把本地产生的网络数据包发出前进行修改。
FORWARD — 修改经过这个主机路由的网络数据包。
PREROUTING — 在路由进入这个系统的网络数据包前修改它们。
POSTROUTING — 在把网络数据包发出前进行修改。
每个被 Linux 系统发送或接收的网络数据包最少都应该通过一个规则表的检查。但是,一个数据包可能会在到达 chain 的最后前被规则表中的多个规则所应用。各个规则的结构会不相同,但它们通常会涉及到:使用一个特定的网络协议或网络服务;到一个或一组特定 IP 地址的数据包;或从一个或一组特定 IP 地址发送的数据包。
在默认情况下,防火墙规则存储在 /etc/sysconfig/iptables 或 /etc/sysconfig/ip6tables 文件中。
当 Linux 系统启动时,iptables 服务会在所有 DNS 相关的服务启动前被启动。这意味着防火墙规则只使用数字化的 IP 地址(如 192.168.0.1)。在规则中使用域名(如 host.example.com) 将会产生错误。
无论它们的目的地址是什么,当数据包与一个规则表中的某个规则匹配时,一个 target 或行动将会被应用。如果在一个规则中指定了一个 ACCEPT target,和这条规则匹配的数据包将跳过剩下的所有规则,并被发送到它的目标地址中的下一个目的地。如果一条规则指定了 DROP target,和这条规则匹配的数据包将被这个系统拒绝,而发送这个数据包的主机也不会收到任何反馈信息。如果规则指定了 QUEUE target,匹配的数据包会被发送到用户空间。如果一个规则指定了 REJECT target,这个数据包将会被丢掉,而这个数据包的原始发送者则会接收到一个错误信息。
每个 chain 都会有一个默认的政策:ACCEPT、DROP、REJECT 或 QUEUE 。如果 chain 中的规则都不适用于某个数据包,这个数据包将会根据默认政策被处理。
iptables 命令被用来配置这些规则表,并可以在需要时设置新的规则表。