防火墙实验:使用 iptables
Completion requirements
在本实验中,我们将使用 iptables 设置防火墙。除了过滤数据包外,iptables 防火墙还可以对数据包进行修改。为了管理用于不同目的的防火墙规则,iptables 使用了一个分层结构:表(table)、链(chain)和规则(rules)。下表列出了不同表的用途。例如,数据包过滤的规则应该放在 filter 表中,而对数据包进行修改的规则应该放在 nat 或 mangle 表中。
f | f | f |
f | f | f |
f | f | f |
每个表包含若干链,每条链对应一个 Netfilter 钩子。每条链表示其规则被执行的位置。例如,FORWARD 链上的规则在 NF_INET_FORWARD 钩子处被执行,INPUT 链上的规则在 NF_INET_LOCAL_IN 钩子处被执行。
每条链包含一组将被执行的防火墙规则。当我们设置防火墙时,需要将规则添加到这些链中。例如,如果我们希望拦截所有进入的 telnet 流量,可以在 filter 表的 INPUT 链中添加规则。如果我们希望将所有进入的 telnet 流量重定向到不同主机的不同端口(即端口转发),可以在 mangle 表的 INPUT 链中添加规则,因为我们需要对数据包进行修改。
使用 iptables
要向每个表中的链添加规则,可以使用 iptables 命令,这是一条非常强大的命令。学生可以通过输入 "man iptables" 查看 iptables 的手册,也可以在网上找到许多教程。使 iptables 显得复杂的原因在于需要提供许多命令行参数。然而,如果我们理解了这些命令行参数的结构,就会发现这个命令其实并不复杂。
在通常的 iptables 命令中,我们是向某个表中的某个链添加规则或删除规则,因此需要指定表名(默认是 filter)、链名以及对链执行的操作。之后,我们需要指定规则,用于匹配通过的数据包。如果匹配成功,将对该数据包执行一个操作。命令的一般结构如下所示:
iptables -t <table> -<operation> <chain> <rule> -j <target>
---------- -------------------- ------- -----------
表 链 规则 动作
规则是 iptables 命令中最复杂的部分。当我们在后面使用特定的规则时会提供更详细信息。在这里我们列出了一些常用的命令:
// 列出某表格中的所有规则(不显示行号)
iptables -t nat -L -n
// 列出某表格中的所有规则(带有行号)
iptables -t filter -L -n --line-numbers
// 从过滤表的 INPUT 链中删除第2条规则
iptables -t filter -D INPUT 2
// 阻止所有满足<规则>的传入包
iptables -t filter -A INPUT <rule> -j DROP
注意事项。 Docker 依赖 iptables 来管理它创建的网络,因此会向 nat 表中添加许多规则。当我们删除 iptables 规则时,小心不要删除 Docker 的规则。例如,运行 "iptables -t nat -F" 命令将会非常危险,因为它将删除 nat 表中的所有规则,包括许多 Docker 的规则。这会给 Docker 容器带来麻烦。对于 filter 表来说,则没有问题,因为 Docker 并不会用这个表。
Last modified: Saturday, 10 May 2025, 7:19 AM