如何列出和删除iptables防火墙规则

来自菜鸟教程
跳转至:导航、​搜索

介绍

iptables 是一种防火墙,在大多数 Linux 系统的网络安全中起着至关重要的作用。 虽然许多 iptables 教程将教您 如何创建防火墙规则以保护您的服务器 ,但本教程将关注防火墙管理的不同方面:列出和删除规则。

在本教程中,我们将介绍如何执行以下 iptables 任务:

  • 列出规则
  • 清除数据包和字节计数器
  • 删除规则
  • 刷新链(删除链中的所有规则)
  • 刷新所有链表,删除所有链,接受所有流量

注意: 使用防火墙时,请注意不要通过阻止 SSH 流量(端口 :22,默认情况下)将自己锁定在自己的服务器之外。 如果您因防火墙设置而失去访问权限,您可能需要通过带外控制台连接到它以修复您的访问权限。


先决条件

本教程假设您使用的是安装了 iptables 命令的 Linux 服务器,并且您的用户具有 sudo 权限。

如果您需要有关此初始设置的帮助,请参阅我们的 Initial Server Setup with Ubuntu 20.04 指南。 它也适用于 DebianCentOS

规范上市规则

我们先来看看如何列出规则。 有两种不同的方式可以查看您的活动 iptables 规则:在表格中或作为规则规范列表。 这两种方法以不同的格式提供大致相同的信息。

要按规范列出所有活动的 iptables 规则,请运行带有 -S 选项的 iptables 命令:

sudo iptables -S
Output-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-persistentiptables save,这看起来也类似于 iptables 规则配置文件。

列出特定链

如果要限制输出到特定的链(INPUTOUTPUTTCP等),可以在[后直接指定链名X147X] 选项。 例如,要显示 TCP 链中的所有规则规范,您可以运行以下命令:

sudo iptables -S TCP
Output-N TCP
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT

现在让我们看一下查看活动 iptables 规则的另一种方法:作为规则表。

以表格形式列出规则

在表视图中列出 iptables 规则对于比较不同的规则很有用。 要在表中输出所有活动的 iptables 规则,请运行带有 -L 选项的 iptables 命令:

sudo iptables -L

这将输出按链排序的所有当前规则。

如果要限制输出到特定的链(INPUTOUTPUTTCP等),可以在[后直接指定链名X147X] 选项。

让我们看一个示例 INPUT 链:

sudo iptables -L INPUT
OutputChain 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)。 下一行包含表中每一列的标题,然后是链的规则。 让我们看一下每个标题的含义:

  • target:如果一个数据包匹配规则,目标指定应该如何处理它。 例如,一个数据包可以被接受、丢弃、记录或发送到另一个链以与更多规则进行比较
  • prot:协议,如tcpudpicmpall
  • opt:很少使用,此列表示IP选项
  • source:流量的源IP地址或子网,或anywhere
  • destination:流量的目的IP地址或子网,或anywhere

最后一列未标记,表示规则的选项。 这是前面列中未指明的规则的任何部分。 这可以是从源端口和目标端口到数据包连接状态的任何内容。

显示数据包计数和聚合大小

列出 iptables 规则时,还可以显示匹配每个特定规则的数据包数量和数据包的总大小(以字节为单位)。 当试图大致了解哪些规则与数据包匹配时,这通常很有用。 为此,请同时使用 -L-v 选项。

例如,让我们再看一下 INPUT 链,带有 -v 选项:

sudo iptables -L INPUT -v
OutputChain 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

请注意,列表现在有两个附加列,pktsbytes

现在您知道如何以各种方式列出活动的防火墙规则,让我们看看如何重置数据包和字节计数器。

重置数据包计数和聚合大小

如果要清除或归零规则的数据包和字节计数器,请使用 -Z 选项。 如果发生重新启动,它们也会重置。 如果您想查看您的服务器是否正在接收与您现有规则匹配的新流量,这将非常有用。

要清除所有链和规则的计数器,请单独使用 -Z 选项:

sudo iptables -Z

要清除特定链中所有规则的计数器,请使用 -Z 选项并指定链。 例如,要清除 INPUT 链计数器,请运行以下命令:

sudo iptables -Z INPUT

如果要清除特定规则的计数器,请指定链名称和规则编号。 例如,要将 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 规则的另一种方法是通过其 chain行号。 要确定规则的行号,请以表格格式列出规则并添加 --line-numbers 选项:

sudo iptables -L --line-numbers
OutputChain 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
...

这会将行号添加到每个规则行,由 num 标题指示。

知道要删除的规则后,记下规则的链号和行号。 然后运行 iptables -D 命令,后跟链和规则编号。

例如,如果我们要删除丢弃无效数据包的输入规则,我们可以看到它是 INPUT 链的规则 3。 所以我们应该运行这个命令:

sudo iptables -D INPUT 3

既然您知道如何删除单个防火墙规则,让我们来看看如何 刷新 规则链。

冲洗链

iptables 提供了一种删除链中所有规则的方法,或者 flush 一个链。 本节将介绍执行此操作的各种方法。

警告: 注意不要通过使用 dropdeny 的默认策略刷新链来通过 SSH 将自己锁定在服务器之外。 如果这样做,您可能需要通过控制台连接到它以修复您的访问权限。


冲洗单链

要刷新特定链,这将删除链中的所有规则,您可以使用 -F 或等效的 --flush 选项和要刷新的链的名称。

例如,要删除 INPUT 链中的所有规则,请运行以下命令:

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

然后刷新 natmangle 表,刷新所有链(-F),并删除所有非默认链(-X):

sudo iptables -t nat -F
sudo iptables -t mangle -F
sudo iptables -F
sudo iptables -X

您的防火墙现在将允许所有网络流量。 如果您现在列出您的规则,您将看到没有规则,并且只保留三个默认链(INPUTFORWARDOUTPUT)。

结论

完成本教程后,您已经了解了如何列出和删除您的 iptables 防火墙规则。

请记住,通过 iptables 命令对 iptables 所做的任何更改都是短暂的,需要保存以在服务器重新启动后持续存在。 这在通用防火墙规则和命令教程的 保存规则部分 中有介绍。