介绍
虽然许多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-persistent
或iptables 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
请注意,列表现在有两个额外的列,即pkts
和byte
。
现在你知道如何以各种方式列出活跃的防火墙规则,让我们看看如何重置包和字节计数。
重置包数和汇总大小
如果您想要清除或零对规则的包和字节计数,请使用-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 规则的另一种方法是通过其 chain 和 line 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
然后清洗nat
和mangle
表,清洗所有链条(‘-F’),并删除所有非默认链条(‘-X’):
1sudo iptables -t nat -F
2sudo iptables -t mangle -F
3sudo iptables -F
4sudo iptables -X
您的防火墙现在将允许所有网络流量. 如果您现在列出您的规则,您将看到没有规则,只剩下三个默认链条(‘INPUT’、‘FORWARD’和‘OUTPUT’)。
结论
通过本教程后,您已经看到如何列出和删除您的iptables防火墙规则。
请记住,通过iptables
命令进行的任何 iptables 更改都是短暂的,需要保存以持续通过服务器重新启动。