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

iptables的是播放网络安全对于大多数Linux系统中起重要作用的防火墙。虽然许多iptables的教程将教你如何创建防火墙规则来保护您的服务器,这其中将重点放在防火墙管理的不同方面:上市和删除规则。

介绍

Iptables是一个防火墙,在大多数Linux系统的网络安全中起着至关重要的作用。 虽然许多iptables的教程将教你如何创建防火墙规则来保护您的服务器 ,这其中将重点放在防火墙管理的不同方面:上市和删除规则。

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

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

注意:当使用防火墙时,注意不要通过阻断交通SSH(端口22,默认情况下)把自己锁了自己的服务器。 如果你输了,由于你的防火墙设置访问权限,您可能需要通过控制台连接到它解决您的访问。 通过控制台连接后,您可以更改防火墙规则以允许SSH访问(或允许所有流量)。 如果您保存的防火墙规则允许SSH访问,另一种方法是重新启动服务器。

先决条件

在开始使用本教程之前,您应该在服务器上设置一个单独的非root超级用户帐户 - 具有sudo权限的用户。 如果您需要设置,请按照相应的指南:

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

按规范列出规则

要列出所有通过规范有效的iptables规则,运行iptables用命令-S选项:

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规则的配置文件,如果你曾经使用iptables-persistentiptables save

列出特定链

如果要限制输出到一个特定的链( INPUTOUTPUTTCP等),可以在以后直接指定链名-S选项。 例如,要显示所有的规则规范的TCP链,你会运行此命令:

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

让我们来看看另一种方式来查看活动iptables规则,作为一个规则表。

将规则列为表

在表视图中列出iptables规则可以用于将不同规则彼此比较,

输出所有的主动iptables规则在一个表中,运行iptables用命令-L选项:

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)。 下一行由表中每个列的标题组成,后面是链的规则。 让我们来看看每个标题指示:

  • 目标 :如果数据包与规则相匹配,目标指定了应该用它来完成。 例如,分组可以被接受,丢弃,记录或发送到另一链,以与更多规则进行比较
  • PROT:协议,如tcpudpicmp ,或all
  • 选择 :很少使用,这列表示IP选项
  • 来源 :通信的源IP地址或子网,或anywhere
  • 目的地 :交通的目的IP地址或子网,或anywhere

最后一栏,这是不标记,表示规则的选项 也就是说,规则的任何部分不是由前面的列指示的。 这可以是从源和目的地端口到分组的连接状态的任何东西。

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

列出iptables规则时,还可以显示与每个特定规则匹配的数据包数量和数据包的总大小(以字节为单位)。 当尝试大致了解哪些规则与数据包匹配时,这通常很有用。 要做到这一点,只需使用-L-v选项在一起。

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

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规则的一种方法是通过规则规范。 要做到这一点,您可以运行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 Example Output: Rules with 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命令,随后通过链和规则编号。

例如,如果我们想删除丢弃非法报文输入规则,我们可以看到,它的规则3中的INPUT链。 所以我们应该运行这个命令:

sudo iptables -D INPUT 3

现在你知道如何删除个人防火墙规则,让我们对你如何刷新规则链。

冲洗链

iptables的提供了一种方法来删除链中的所有规则,或刷新链。 本节将介绍各种方法来做到这一点。

注意:要小心,不要将自己锁定你的服务器,通过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

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

结论

在学习本教程之后,您应该熟悉如何列出和删除iptables防火墙规则。

请记住,通过任何iptables的变化iptables命令是短暂的,并需要通过保存服务器重新启动持续。 这是包括在保存规则部分通用防火墙规则和命令教程。