Iptables 是大多数 Linux 发行版默认附带的主要防火墙。它负责处理网络安全。它的工作原理是将数据包与一组规则进行对比,根据规则指示系统接受、拒绝或转发连接。在本教程中,我们将向您展示如何列出和删除规则、检查和清除数据包及字节计数器,以及清空链。准备好了吗?让我们开始吧!
前提条件
在开始本教程之前,让我们先明确一点。本指南中演示的所有技巧和窍门都是在独立的虚拟机上进行的。建议您也这样做,因为这可以避免将您的系统搞得一团糟。只有在您掌握了这些过程之后,才应该尝试在实际情况中应用它们。
在本教程中,我们将使用 Ubuntu 来演示所有步骤。不过,无论使用哪种发行版,它们的操作方式都应该类似。
列出规则
按规范列出规则
首先,让我们按规范查看所有活动规则。运行以下命令:
|
1 |
sudo iptables -S |

如果您以前使用过 iptables 规则创建,您可能会注意到其相似之处。除了 “iptables” 部分之外,输出结果与用于创建它们的命令非常相似。它们与 iptables 规则配置文件的结构也类似。
列出特定链
让我们尝试一些更精确的操作。不要报告所有的 iptables 规则,而是让 iptables 报告特定链的规则。例如,TCP、INPUT、OUTPUT 等。为此,请在 “-S” 标志后指定链名称:
|
1 |
sudo iptables -S <chain> |

以表格形式列出规则
在比较不同的规则时,表格视图非常有用。使用 “-L” 标志让 iptables 以表格格式报告所有活动规则:
|
1 |
sudo iptables -L |

输出包含按链排序的所有当前规则。与上一节类似,也可以按特定链(如 INPUT、TCP 和 OUTPUT 等)过滤列表输出。为此,请在 “-L” 标志后指定链:
|
1 |
sudo iptables -L <chain> |

让我们稍微分解一下输出。在我们的例子中,由于规则的原因,输出会显得有点乱。输出的第一行声明了链名称 (INPUT) 及其默认策略 (DROP)。下一行指定了表格列的表头。其余的是该链的规则。让我们来看看这些表头表示什么:
- target:如果数据包与规则匹配,此部分定义应执行的操作。可以是接受数据包、丢弃、记录日志或将其发送到另一个链。
- prot:定义协议,例如 udp、tcp、icmp 或 all。
- opt:此列表示 IP 选项。很少使用。
- source:数据包的源(IP 地址或子网)。值可以是特定的或 anywhere。
- destination:数据包的目的地(IP 地址或子网)。值可以是特定的或 anywhere。
如果您注意到了,最后一列没有标签。这是因为它用于表示规则的选项。它将包含规则中不适合前面字段的所有部分。它可能包含从源/目的端口到数据包连接状态等任何内容。
数据包计数和总大小
清除数据包和字节计数器
当我们列出 iptables 规则时,我们还可以检查与每个特定规则匹配的数据包数量以及数据包的总大小(以字节为单位)。当您需要粗略了解哪些规则正在与数据包匹配时,这是一个非常有用的指标。
在此示例中,我们将使用 INPUT 链。这一次,添加代表详细模式的 “-v” 标志:
|
1 |
sudo iptables -L INPUT -v |

您会注意到表格输出现在包含两个额外的字段:pkts 和 bytes。
重置数据包计数和总大小
在某些情况下,您可能希望重置我们之前演示的计数器。如果系统重启,计数器将自动清零。您也可以手动强制重置。我们将使用 “-Z” 标志来重置数据包计数和总大小:
|
1 |
sudo iptables -v -Z |

请注意,此命令将重置所有链的计数器。与其他命令类似,也可以重置特定链的计数器。例如,下一个命令将重置 INPUT 链的计数器:
|
1 |
sudo iptables -v -Z <chain> |

可以让计数器重置操作更加精确。您可以重置特定链下特定规则的计数器。为此,请在链名称后添加规则编号:
|
1 |
sudo iptables -v -Z <chain> <rule_number> |
删除规则
按规格删除规则
有多种方法可以删除 iptables 规则。第一种删除规则的方法是按规则规格。为了进行删除,我们将使用 “-D” 标志,后跟规则规格:
|
1 |
sudo iptables -v -D INPUT -s 172.217.194.113 -j DROP |

如果您之前添加过任何 iptables 规则,您会注意到其相似之处。这里唯一改变的是使用 “-D” 标志代替了 “-A” 标志。
按链和编号删除规则
按规则规格删除规则需要花费更多精力,对吧?如果我们可以在不记住规则规格的情况下删除它们呢?让我们按链和编号来删除规则吧!与第一种方法(按规格删除)相比,这种方法相对更容易,因为您不需要掌握整个规格。
此方法需要目标规则的链和行号。我们从哪里获取行号?运行以下命令来确定:
|
1 |
sudo iptables -L --line-numbers |

您将获得包含所有规则及其行号的大量输出。要缩小输出范围,请在 “-L” 标志后使用链名称:
|
1 |
sudo iptables -L <chain> --line-numbers |

在输出中,您会注意到多了一列 num。它表示每个规则的行号。一旦我们确定了目标编号,就可以执行删除:
|
1 |
sudo iptables -v -D <chain> <line_number> |
清空链
对于 iptables,什么是清空链?它是删除特定链下所有规则的过程。如果您需要批量删除规则,则可以使用此方法。在执行链清空之前,我们强烈建议您使用 iptables-save 备份现有规则。这是一个内置的 iptables 工具,它将输出所有当前的链和规则。输出可以导出到文本文件:
|
1 |
sudo iptables-save > ~/Desktop/iptables-backup.txt |
![]()
清空单个链
让我们来看看如何清空一个链。使用 “-F” 标志,后跟目标链:
|
1 |
sudo iptables -v -F <chain> |

清空所有链
在清空所有链之前,请确保您明白自己在做什么。这将删除 iptables 防火墙的所有规则。您应该确保事先创建了 iptables 规则备份。
准备好了吗?运行以下命令清空所有 iptables 链:
|
1 |
sudo iptables -v -F |

清空规则、删除链并接受所有流量
执行本节中描述的步骤将有效禁用防火墙,允许不受限制的网络流量。与前一节类似,我们建议在继续之前备份 iptables。首先,我们将每个内置链的默认策略更改为 ACCEPT。这是为了确保 iptables 不会通过 SSH 将您锁定在服务器之外:
|
1 |
sudo iptables -v -P INPUT ACCEPT && sudo iptables -v -P FORWARD ACCEPT && sudo iptables -v -P OUTPUT ACCEPT |

现在,清空 nat 和 mangle 表:
|
1 2 |
sudo iptables -v -t nat -F sudo iptables -v -t mangle -F |


清空所有链并删除所有非默认链:
|
1 2 |
sudo iptables -v -F sudo iptables -v -X |


接下来,让我们查看结果:
|
1 |
sudo iptables -L --line-numbers |
结语
Iptables 是一款功能强大的防火墙。希望本指南对您学习如何列出和删除 iptables 防火墙规则有所帮助。在将它们应用到实际环境之前,请不要忘记进行练习。
祝您使用愉快!



评论
暂无评论。发表第一条评论吧。