介绍
iptables 是一种防火墙,在大多数 Linux 系统的网络安全中起着至关重要的作用。虽然许多 iptables 教程将教您如何创建防火墙规则来保护您的服务器,但本教程将侧重于防火墙管理的不同方面:列出和删除规则。
在本教程中,我们将介绍如何执行以下 iptables 任务:
- 列出规则
- 清除数据包和字节计数器
- 删除规则
- 刷新链(删除链中的所有规则)
- 刷新所有链表,删除所有链,接受所有流量
注意:使用防火墙时,请注意不要通过阻止 SSH 流量(默认为端口 22)将自己锁定在自己的服务器之外。如果您由于防火墙设置而无法访问,您可能需要通过带外控制台连接到它来修复您的访问。
先决条件
本教程假设您使用iptables
安装了命令的 Linux 服务器,并且您的用户具有sudo
权限。
如果您需要有关此初始设置的帮助,请参阅我们的Ubuntu 20.04 初始服务器设置指南。它也可用于Debian和CentOS
我们先来看看如何列出规则。有两种不同的方式可以查看您的活动 iptables 规则:在表格中或作为规则规范列表。这两种方法以不同的格式提供大致相同的信息。
按规格上市规则
要按规范列出所有活动的 iptables 规则,请运行iptables
带有以下-S
选项的命令:
- 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-persistent
或iptables save
.
列出特定链
如果要限制输出到一个特定的链(INPUT
,OUTPUT
,TCP
等),可以在以后直接指定链名-S
选项。例如,要显示TCP
链中的所有规则规范,您可以运行以下命令:
- sudo iptables -S TCP
Output-N TCP
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT
现在让我们来看看查看活动 iptables 规则的另一种方式,作为规则表。
以表格形式列出规则
在表格视图中列出 iptables 规则对于比较不同的规则很有用,
要输出表中所有活动的 iptables 规则,请运行iptables
带有以下-L
选项的命令:
- sudo iptables -L
这将输出按链排序的所有当前规则。
如果要限制输出到一个特定的链(INPUT
,OUTPUT
,TCP
等),可以在以后直接指定链名-L
选项。
让我们看一个示例 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
:协议,如tcp
,udp
,icmp
,或all
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
请注意,该列表现在有两个额外的列,pkts
以及bytes
。
现在您知道如何以各种方式列出活动的防火墙规则,让我们看看如何重置数据包和字节计数器。
重置数据包计数和聚合大小
如果要清除或清零规则的数据包和字节计数器,请使用该-Z
选项。如果发生重新启动,它们也会重置。如果您想查看您的服务器是否正在接收与您现有规则匹配的新流量,这将非常有用。
要清除所有链和规则的计数器,请单独使用该-Z
选项:
- sudo iptables -Z
要清除特定链中所有规则的计数器,请使用该-Z
选项并指定链。例如,要清除 INPUT 链计数器,请运行以下命令:
- sudo iptables -Z INPUT
如果要清除特定规则的计数器,请指定链名称和规则编号。例如,要将 INPUT 链中第一条规则的计数器归零,请运行以下命令:
- sudo iptables -Z INPUT 1
现在你知道如何重置iptables包和字节计数器,让我们看看可以用来删除它们的两种方法。
按规范删除规则
删除 iptables 规则的方法之一是通过规则规范。为此,您可以iptables
使用-D
后跟规则规范的选项运行命令。如果您想使用此方法删除规则,您可以使用规则列表的输出 ,以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
[secondary_output Output]
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
后跟链和规则编号的命令。
例如,如果我们要删除丢弃无效数据包的输入规则,我们可以看到它3
是INPUT
链的规则。所以我们应该运行这个命令:
- sudo iptables -D INPUT 3
现在您知道如何删除单个防火墙规则,让我们来看看如何刷新规则链。
冲洗链
iptables 提供了一种删除链中所有规则或刷新链的方法。本节将介绍执行此操作的各种方法。
注意:小心不要通过 SSH 将自己锁定在服务器之外,方法是使用默认策略drop
或刷新链deny
。如果这样做,您可能需要通过控制台连接到它来修复您的访问。
冲洗单链
要刷新特定链,这将删除链中的所有规则,您可以使用-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 更改都是短暂的,需要保存以在服务器重新启动后持续存在。通用防火墙规则和命令教程的保存规则部分对此进行了介绍。