介绍
iptables 是一款防火墙,在大多数 Linux 系统的网络安全中扮演着至关重要的角色。虽然许多 iptables 教程都教你如何创建防火墙规则来保护服务器,但本文则侧重于防火墙管理的另一个方面:规则的列出和删除。.
本教程将介绍如何执行以下 iptables 任务:
- 列出规则
- 清除数据包和字节计数器
- 删除规则
- 清除链(删除链中的所有规则)
- 清除所有链和表,移除所有链,并接受所有流量
先决条件
本教程假设您使用的是已安装 iptables 命令的 Linux 服务器,并且您的用户拥有 sudo 权限。如果您在初始设置方面需要帮助,请参阅 Ubuntu 20.04 服务器初始设置指南。.
按规格列出规则
我们先来看看如何列出规则。查看已激活的 iptables 规则有两种不同的方式:以表格形式或以规则规范列表形式。两种方法提供的信息大致相同,只是格式不同。.
要按规范列出所有活动的 iptables 规则,请运行带有 -S 选项的 iptables 命令:
sudo iptables -SOutput
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-N ICMP
-N TCP
-N UDP
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT
...如您所见,输出结果与创建这些规则时使用的命令完全相同,只是省略了之前的 iptables 命令。如果您曾经使用过 iptables-persistent 或 iptables save 命令,那么这与 iptables 规则配置文件的配置方式也类似。.
列出特定链条
如果要将输出限制为特定链(INPUT、OUTPUT、TCP 等),可以在选项后直接指定链名称。 -S 例如,要显示 TCP 链中的所有规则,请运行以下命令:
sudo iptables -S TCPOutput
-N TCP
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT现在让我们来看另一种查看活动 iptables 规则的方法,即以规则表的形式查看。.
表格中的规则列表
以表格形式列出 iptables 规则有助于比较不同规则。要以表格形式输出所有活动的 iptables 规则,请运行带有 -L 选项的 iptables 命令:
sudo iptables -L这将生成所有当前规则,并按链进行排序。.
如果要将输出限制为特定链(INPUT、OUTPUT、TCP 等),可以在 -L 选项后直接指定链名称。.
我们来看一个输入链的例子:
sudo iptables -L INPUTOutput
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere
DROP all -- anywhere anywhere ctstate INVALID
UDP udp -- anywhere anywhere ctstate NEW
TCP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
ICMP icmp -- anywhere anywhere ctstate NEW
REJECT udp -- anywhere anywhere reject-with icmp-port-unreachable
REJECT tcp -- anywhere anywhere reject-with tcp-reset
REJECT all -- anywhere anywhere reject-with icmp-proto-unreachable输出的第一行显示链的名称(本例中为 INPUT),后跟其默认策略(DROP)。下一行包含表中每一列的标题,以及链规则。让我们回顾一下每个标题的含义:
- 目标:如果数据包符合某条规则,目标将指定如何处理该数据包。例如,数据包可以被接受、丢弃、记录,或者发送到另一个链以与更多规则进行比较。.
- prot:协议,例如 TCP、UDP、ICMP 或 all
- 选项:此列很少使用,显示 IP 选项
- 来源:流量的源 IP 地址或子网,或任何位置
- 目标地址:流量的目标 IP 地址或子网,或任何位置
最后一列(未标注)显示规则的选项。这部分包含规则中未在前面几列中显示的任何内容,例如源端口和目标端口,以及数据包连接的状态等等。.
显示包裹数量和总大小
列出 iptables 规则时,可以显示匹配每条规则的数据包数量和数据包总大小(以字节为单位)。这在想要大致了解哪些规则匹配哪些数据包时非常有用。要实现这一点,请同时使用 -L 和 -v 选项。.
例如,让我们再次使用 -v 选项来看一下 INPUT 链:
sudo iptables -L INPUT -vOutput
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
284K 42M ACCEPT all -- any any anywhere anywhere ctstate RELATED,ESTABLISHED
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 DROP all -- any any anywhere anywhere ctstate INVALID
396 63275 UDP udp -- any any anywhere anywhere ctstate NEW
17067 1005K TCP tcp -- any any anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
2410 154K ICMP icmp -- any any anywhere anywhere ctstate NEW
396 63275 REJECT udp -- any any anywhere anywhere reject-with icmp-port-unreachable
2916 179K REJECT all -- any any anywhere anywhere reject-with icmp-proto-unreachable
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh ctstate NEW,ESTABLISHED请注意,列表现在多了两列, 包 和 字节 这是。.
既然您已经知道如何以不同的方式列出活动的防火墙规则,那么让我们看看如何重置数据包和字节计数器。.
重置数据包数量和总大小
如果您想清除或清零规则的数据包和字节计数器,请使用 -Z 选项。重启后,这些计数器也会重置。如果您想查看服务器是否接收到符合现有规则的新流量,这将非常有用。.
要清除所有链和规则的计数器,请使用该选项。 -Z 单独使用:
sudo iptables -Z要清除特定链中所有规则的计数器,请使用该选项。 -Z 使用并指定链。例如,要清除链计数器。 输入 运行以下命令:
sudo iptables -Z INPUT如果要清除特定规则的计数器,请指定链名称和规则编号。例如,要清除链中第一条规则的计数器, 输入运行以下命令:
sudo iptables -Z INPUT 1既然您已经知道如何重置 iptables 数据包和字节计数器,那么让我们来看看可以用来删除它们的两种方法。.
根据规范删除规则
删除 iptables 规则的一种方法是指定要删除的规则。为此,您可以运行带有 `-D` 选项的 `iptables` 命令,并在其后输入规则名称。如果您想使用此方法删除规则,可以使用 `iptables -S` 命令查看规则列表的输出以获取帮助。.
例如,如果您想删除丢弃无效输入数据包的规则(-A INPUT -m conntrack –ctstate INVALID -j DROP),您可以运行以下命令:
sudo iptables -D INPUT -m conntrack --ctstate INVALID -j DROP请注意,此处应省略用于指示规则在创建时的位置的 -A 选项。.
基于链和数字的删除规则
另一种删除 iptables 规则的方法是按链和行号删除。要指定规则的行号,请以表格形式列出规则,并添加 --line-numbers 选项:
sudo iptables -L --line-numbersOutput
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
2 ACCEPT all -- anywhere anywhere
3 DROP all -- anywhere anywhere ctstate INVALID
4 UDP udp -- anywhere anywhere ctstate NEW
5 TCP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
6 ICMP icmp -- anywhere anywhere ctstate NEW
7 REJECT udp -- anywhere anywhere reject-with icmp-port-unreachable
8 REJECT tcp -- anywhere anywhere reject-with tcp-reset
9 REJECT all -- anywhere anywhere reject-with icmp-proto-unreachable
10 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ctstate NEW,ESTABLISHED这会将行号添加到与标题关联的每个规则行中。 数字 已显示。.
确定要删除的规则后,记下链号和规则行号。然后运行命令 `iptables -D`,后跟链号和规则行号。.
例如,如果我们想要移除丢弃无效数据包的入站规则,我们会发现规则 3 位于 INPUT 链中。因此,我们需要运行以下命令:
sudo iptables -D INPUT 3
既然您已经知道如何删除防火墙规则,那么让我们来看看如何清除规则链。.
闪现链条
iptables 提供了移除链中所有规则(即刷新链)的方法。本节将介绍多种实现方式。.
冲洗链条
要刷新特定链(这将删除链中的所有规则),可以使用 -F 或等效的 -flush 选项以及要刷新的链名称。.
例如,要删除链中的所有规则 输入运行以下命令:
sudo iptables -F INPUT闪烁所有链条
要清除所有链(即删除所有防火墙规则),可以使用 -F 选项或其等效选项 -flush:
sudo iptables -F清除所有规则,移除所有链,并接受所有规则。
本节将向您展示如何清除所有防火墙规则、表和链,并允许所有网络流量。.
首先,将每个内部链的默认策略设置为 ACCEPT。这样做的主要目的是为了确保您不会通过 SSH 被锁定在服务器之外:
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT然后刷新 NAT 表和 Mangle 表,清除所有链(-F),并删除所有非默认链(-X):
sudo iptables -t nat -F
sudo iptables -t mangle -F
sudo iptables -F
sudo iptables -X您的防火墙现在将允许所有网络流量。如果您现在列出您的规则,您会发现没有任何规则,只剩下三个默认链(INPUT、FORWARD 和 OUTPUT)。.
结果
完成本教程后,您已经了解了如何列出和删除 iptables 防火墙规则。请记住,通过 iptables 命令所做的任何更改都是暂时的,必须保存才能在服务器重启后仍然有效。这在“常用防火墙规则和命令”教程的“保存规则”部分有详细介绍。.









