前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
介绍
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-persistent
或 iptables save
,这也会看起来类似于 iptables 规则配置文件。
列出特定链
如果您想将输出限制为特定链(INPUT
、OUTPUT
、TCP
等),您可以在 -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
这将按链排序输出所有当前规则。
如果您想将输出限制为特定链(INPUT
、OUTPUT
、TCP
等),您可以在 -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
:协议,如tcp
、udp
、icmp
或all
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 destination284K 42M ACCEPT all -- any any anywhere anywhere ctstate RELATED,ESTABLISHED0 0 ACCEPT all -- lo any anywhere anywhere0 0 DROP all -- any any anywhere anywhere ctstate INVALID396 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 NEW2410 154K ICMP icmp -- any any anywhere anywhere ctstate NEW396 63275 REJECT udp -- any any anywhere anywhere reject-with icmp-port-unreachable2916 179K REJECT all -- any any anywhere anywhere reject-with icmp-proto-unreachable0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh ctstate NEW,ESTABLISHED
请注意,现在的列表中有两列额外的内容,即 pkts
和 bytes
。
现在您知道了如何以各种方式列出活动的防火墙规则,让我们看看如何重置数据包和字节计数。
重置数据包计数和累积大小
如果您想要清除或归零规则的数据包和字节计数,可以使用 -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
然后清空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
命令进行的任何 iptables 更改都是临时的,需要保存才能在服务器重新启动时持久化。这在常见防火墙规则和命令教程的保存规则部分有所涉及。