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

介绍

虽然许多iptables教程将教你 如何创建防火墙规则来保护您的服务器,但这将专注于防火墙管理的另一个方面:列出和删除规则。

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

  • 列表规则
  • 清除包和替代计
  • 删除规则
  • 删除链(删除链中的所有规则)
  • 删除所有链和表,删除所有链,并接受所有流量

<$>[注] **注:**在使用防火墙时,要小心不要通过阻止 SSH 流量(端口 :22,默认)。

前提条件

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

如果您需要此初始设置的帮助,请参阅我们的 初始服务器设置与Ubuntu 20.04指南,它也可用于Debian(https://andsky.com/tech/tutorials/initial-server-setup-with-debian-10)和CentOS(https://andsky.com/tech/tutorials/initial-server-setup-with-centos-8)。

按规格列出规则

让我们先看看如何列出规则:有两种不同的方式来查看活跃的 iptables 规则:在表中或作为规则规格列表。

若要按规格列出所有活跃的 iptables 规则,请使用 -S 选项运行 `iptables' 命令:

1sudo iptables -S
 1[secondary_label Output]
 2-P INPUT DROP
 3-P FORWARD DROP
 4-P OUTPUT ACCEPT
 5-N ICMP
 6-N TCP
 7-N UDP
 8-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
 9-A INPUT -i lo -j ACCEPT
10-A INPUT -m conntrack --ctstate INVALID -j DROP
11-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
12-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
13-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP
14-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
15-A INPUT -p tcp -j REJECT --reject-with tcp-reset
16-A INPUT -j REJECT --reject-with icmp-proto-unreachable
17-A TCP -p tcp -m tcp --dport 22 -j ACCEPT
18...

正如您所看到的,输出看起来就像创建它们的命令一样,没有之前的iptables命令,如果您曾经使用过iptables-persistentiptables save,这也将看起来像iptables规则配置文件。

列出一个特定的链条

如果您想将输出限制在一个特定的链条(‘INPUT’、‘OUTPUT’、‘TCP’等),则可以直接在‘-S’选项后指定链条名称。

1sudo iptables -S TCP
1[secondary_label Output]
2-N TCP
3-A TCP -p tcp -m tcp --dport 22 -j ACCEPT

现在让我们来看看观看活跃 iptables 规则的替代方式:作为规则表。

列出规则作为表

在表视图中列出 iptables 规则可以帮助您对不同规则进行比较. 要在表中输出所有活跃 iptables 规则,请使用 -L 选项运行 `iptables' 命令:

1sudo iptables -L

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

如果您想将输出限制在一个特定的链条(‘INPUT’、‘OUTPUT’、‘TCP’等),则可以在‘-L’ 选项后直接指定链条名称。

让我们来看看一个INPUT链的例子:

1sudo iptables -L INPUT
 1[secondary_label Output]
 2Chain INPUT (policy DROP)
 3target prot opt source destination
 4ACCEPT all  --  anywhere anywhere ctstate RELATED,ESTABLISHED
 5ACCEPT all  --  anywhere anywhere
 6DROP all  --  anywhere anywhere ctstate INVALID
 7UDP udp  --  anywhere anywhere ctstate NEW
 8TCP tcp  --  anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
 9ICMP icmp --  anywhere anywhere ctstate NEW
10REJECT udp  --  anywhere anywhere reject-with icmp-port-unreachable
11REJECT tcp  --  anywhere anywhere reject-with tcp-reset
12REJECT all  --  anywhere anywhere reject-with icmp-proto-unreachable

第一行输出表示链条名称(‘INPUT’在这种情况下),然后是默认策略(‘DROP’)。下一行由表中的每个列的标题组成,然后是链条的规则。

例如,一个包可以被接受、放下、登录或发送到另一个链来对比更多的规则

  • prot: 协议,如 tcp, udp, icmp,或 all
  • opt: 很少使用,此列表示IP选项
  • : 流量的源IP地址或子网,或 任何地方
  • 目的地: 流量的目的地IP地址或子网,或 任何地方

未标记的最后一列表示规则的选项. 这是规则的任何部分,以前的列未标记。

显示包数和汇总大小

在列出iptables规则时,还可以显示每个规则相匹配的包的数量和包的总大小,这通常在试图获得哪个规则与包相匹配的粗略的想法时是有用的。

例如,让我们再来看看INPUT链,再来看看-v选项:

1sudo iptables -L INPUT -v
 1[secondary_label Output]
 2Chain INPUT (policy DROP 0 packets, 0 bytes)
 3 pkts bytes target prot opt in out source destination
 4 284K 42M ACCEPT all  --  any any anywhere anywhere ctstate RELATED,ESTABLISHED
 5    0 0 ACCEPT all  --  lo any anywhere anywhere
 6    0 0 DROP all  --  any any anywhere anywhere ctstate INVALID
 7  396 63275 UDP udp  --  any any anywhere anywhere ctstate NEW
 817067 1005K TCP tcp  --  any any anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
 9 2410 154K ICMP icmp --  any any anywhere anywhere ctstate NEW
10  396 63275 REJECT udp  --  any any anywhere anywhere reject-with icmp-port-unreachable
11 2916 179K REJECT all  --  any any anywhere anywhere reject-with icmp-proto-unreachable
12    0 0 ACCEPT tcp  --  any any anywhere anywhere tcp dpt:ssh ctstate NEW,ESTABLISHED

请注意,列表现在有两个额外的列,即pktsbyte

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

重置包数和汇总大小

如果您想要清除或零对规则的包和字节计数,请使用-Z选项,如果发生重新启动,它们也会重新设置。

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

1sudo iptables -Z

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

1sudo iptables -Z INPUT

如果要清除特定规则的计数器,请指定链名和规则号码,例如,要为INPUT链中的第一个规则零计数器,请执行以下操作:

1sudo iptables -Z INPUT 1

现在你知道如何重置 iptables 包和字节计数器,让我们看看可以使用的两种方法来删除它们。

根据规格删除规则

删除 iptables 规则的一种方法是通过规则规格。 要做到这一点,您可以运行iptables命令以-D选项,然后是规则规格规格。

例如,如果要删除丢失无效的入口包的规则(-A INPUT -m conntrack --ctstate INVALID -j DROP),您可以执行以下命令:

1sudo iptables -D INPUT -m conntrack --ctstate INVALID -j DROP

请注意,在创建时用来表示规则位置的-A选项应该在此排除。

根據連鎖和數字刪除規則

删除 iptables 规则的另一种方法是通过其 chainline number. 若要确定规则的行数,请在表格格式中列出规则并添加 --line-number 选项:

1sudo iptables -L --line-numbers
 1[secondary_label Output]
 2Chain INPUT (policy DROP)
 3num target prot opt source destination
 41 ACCEPT all  --  anywhere anywhere ctstate RELATED,ESTABLISHED
 52 ACCEPT all  --  anywhere anywhere
 63 DROP all  --  anywhere anywhere ctstate INVALID
 74 UDP udp  --  anywhere anywhere ctstate NEW
 85 TCP tcp  --  anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
 96 ICMP icmp --  anywhere anywhere ctstate NEW
107 REJECT udp  --  anywhere anywhere reject-with icmp-port-unreachable
118 REJECT tcp  --  anywhere anywhere reject-with tcp-reset
129 REJECT all  --  anywhere anywhere reject-with icmp-proto-unreachable
1310 ACCEPT tcp  --  anywhere anywhere tcp dpt:ssh ctstate NEW,ESTABLISHED
14...

这会将行数添加到每个规则行中,标记为标题。

一旦您知道要删除哪个规则,请记住规则的链号和行号,然后运行iptables -D命令,然后执行链号和规则号。

例如,如果我们要删除输入规则,该规则会丢失无效的包,我们可以看到它是INPUT链条的规则3

1sudo iptables -D INPUT 3

现在你知道如何删除个别防火墙规则,让我们来谈谈如何 flush 规则链。

流浪链

Iptables 提供了一个方法来删除链中的所有规则,或 flush 链。

<$>[警告] 警告: 请小心不要通过SSH锁定自己,通过默认的放下拒绝策略来清除一个链条。

一个单一的链条

要清洗一个特定的链条,这将删除链条中的所有规则,您可以使用-F或相当于--flush的选项和链条的名称来清洗。

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

1sudo iptables -F INPUT

清除所有链条

要清除所有链条,这将删除所有防火墙规则,您可以使用-F或同等的--flush选项:

1sudo iptables -F

清除所有规则,删除所有链条,并接受所有

本节将向您展示如何清除所有防火墙规则、表和链条,并允许所有网络流量。

<$>[警告] 警告: 这将有效地禁用你的防火墙. 如果你想重新开始配置你的防火墙,你只应该遵循这个部分。

首先,将每个内置链的默认策略设置为接受,以确保您不会通过SSH从服务器中被锁定:

1sudo iptables -P INPUT ACCEPT
2sudo iptables -P FORWARD ACCEPT
3sudo iptables -P OUTPUT ACCEPT

然后清洗natmangle表,清洗所有链条(‘-F’),并删除所有非默认链条(‘-X’):

1sudo iptables -t nat -F
2sudo iptables -t mangle -F
3sudo iptables -F
4sudo iptables -X

您的防火墙现在将允许所有网络流量. 如果您现在列出您的规则,您将看到没有规则,只剩下三个默认链条(‘INPUT’、‘FORWARD’和‘OUTPUT’)。

结论

通过本教程后,您已经看到如何列出和删除您的iptables防火墙规则。

请记住,通过iptables命令进行的任何 iptables 更改都是短暂的,需要保存以持续通过服务器重新启动。

Published At
Categories with 技术
comments powered by Disqus