自学内容网 自学内容网

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

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

介绍

Iptables 是大多数 Linux 系统中网络安全中起着至关重要作用的防火墙。虽然许多 iptables 教程会教你如何创建防火墙规则来保护你的服务器,但这篇教程将专注于防火墙管理的另一个方面:列出和删除规则。

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

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

先决条件

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

如果您需要帮助进行初始设置,请参考我们的 Ubuntu 20.04 初始服务器设置指南。该指南也适用于 Debian 和 CentOS。

按规范列出规则

首先让我们看看如何列出规则。查看活动的 iptables 规则有两种不同的方式:以表格形式或以规则规范列表的形式。这两种方法以不同的格式提供大致相同的信息。

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

sudo iptables -S
-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 等),您可以在 -S 选项之后直接指定链名称。例如,要显示 TCP 链中的所有规则规范,您将运行以下命令:

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

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

以表格形式列出规则

以表格形式列出 iptables 规则可以用于比较不同规则之间的差异。要以表格形式输出所有活动的 iptables 规则,请使用 -L 选项运行 iptables 命令:

sudo iptables -L

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

如果您想将输出限制为特定链(INPUTOUTPUTTCP 等),您可以在 -L 选项之后直接指定链名称。

让我们看一个 INPUT 链的示例:

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

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

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

显示数据包计数和累积大小

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

例如,让我们再次使用 -v 选项查看 INPUT 链:

sudo iptables -L INPUT -v

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

请注意,现在的列表中有两列额外的内容,即 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 规则的另一种方法是按其行号。要确定规则的行号,列出表格格式的规则并添加 --line-numbers 选项:

sudo iptables -L --line-numbers

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
...

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

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

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

sudo iptables -D INPUT 3

现在您知道了如何删除单个防火墙规则,让我们看看如何刷新规则链。

清空链

Iptables 提供了一种删除链中所有规则的方法,即清空链。本节将介绍多种清空链的方法。

清空单个链

要清空特定的链,即删除链中的所有规则,可以使用-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 更改都是临时的,需要保存才能在服务器重新启动时持久化。这在常见防火墙规则和命令教程的保存规则部分有所涉及。


原文地址:https://blog.csdn.net/rubys007/article/details/142691179

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!