如何从iptables中删除特定规则?

我分别在端口8006和8007上托管特殊的HTTP和HTTPS服务。我使用iptables来“激活”服务器;即路由传入的HTTP和HTTPS端口:

iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 8006 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 8007 -j ACCEPT
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8006
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8007
iptables -A OUTPUT -t nat -d 127.0.0.1 -p tcp --dport 80 -j REDIRECT --to-ports 8006
iptables -A OUTPUT -t nat -d 127.0.0.1 -p tcp --dport 443 -j REDIRECT --to-ports 8007

这就像一个咒语。然而,我想创建另一个脚本,再次禁用我的服务器;例如,将iptables恢复到运行上述代码行之前的状态。然而,我很难弄清楚删除这些规则的语法。唯一有效的方法是同花:

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

但这也会删除其他不需要的iptables规则。

527405 次浏览

执行相同的命令,但将“-A”替换为“-D”。例如:

iptables -A ...

就变成了

iptables -D ...

你也可以使用规则的编号(——行号):

iptables -L INPUT --line-numbers

示例输出:

Chain INPUT (policy ACCEPT)
num  target prot opt source destination
1    ACCEPT     udp  --  anywhere  anywhere             udp dpt:domain
2    ACCEPT     tcp  --  anywhere  anywhere             tcp dpt:domain
3    ACCEPT     udp  --  anywhere  anywhere             udp dpt:bootps
4    ACCEPT     tcp  --  anywhere  anywhere             tcp dpt:bootps

所以如果你想删除第二条规则:

iptables -D INPUT 2

更新

如果你使用(d)一个特定的表(例如nat),你必须把它添加到删除命令(谢谢@ThorSummoner的评论)

sudo iptables -t nat -D PREROUTING 1
对我来说没有任何问题的最佳解决方案是这样的 1. 添加临时规则和一些注释:

comment=$(cat /proc/sys/kernel/random/uuid | sed 's/\-//g')
iptables -A ..... -m comment --comment "${comment}" -j REQUIRED_ACTION

2. 当添加了规则并且你希望删除它(或带有此注释的所有内容)时,执行以下操作:

iptables-save | grep -v "${comment}" | iptables-restore

因此,您将100%删除与$注释匹配的所有规则,并保持其他行不变。这个解决方案在过去的2个月里工作,每天大约改变100个规则-没有问题。希望,有帮助

首先用下面的命令列出所有iptables规则:

iptables -S

列表如下:

-A XYZ -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

然后复制想要的行,用-D替换-A来删除它:

iptables -D XYZ -p ...

使用-D命令,这是man页面如何解释它:

-D, --delete chain rule-specification
-D, --delete chain rulenum
Delete  one  or more rules from the selected chain.
There are two versions of this command:
the rule can be specified as a number in the chain (starting at 1 for the first rule) or a rule to match.

做实现这个命令,像所有其他命令(-A-I)一样,在特定的表上工作。如果你不是在默认表(filter表)上工作,使用-t TABLENAME来指定目标表。

删除要匹配的规则

iptables -D INPUT -i eth0 -p tcp --dport 443 -j ACCEPT

注意:这只删除匹配的第一个规则。如果你匹配了很多规则(这可能发生在iptables中),运行几次。

删除指定为数字的规则

iptables -D INPUT 2

除了计算数字之外,您还可以使用--line-number参数列出行号,例如:

iptables -t nat -nL --line-number

假设要删除NAT规则,

使用下面的命令列出附加的IPtables,

# sudo iptables -L -t nat -v


Chain PREROUTING (policy ACCEPT 18 packets, 1382 bytes)
pkts bytes target     prot opt in     out     source               destination
7   420 DNAT       tcp  --  any    any     anywhere             saltmaster           tcp dpt:http to:172.31.5.207:80
0     0 DNAT       tcp  --  eth0   any     anywhere             anywhere             tcp dpt:http to:172.31.5.207:8080

如果您想从IPtables中删除nat规则,只需执行以下命令,

# sudo iptables -F -t nat -v


Flushing chain `PREROUTING'
Flushing chain `INPUT'
Flushing chain `OUTPUT'
Flushing chain `POSTROUTING'

然后,你可以验证,

# sudo iptables -L -t nat -v

您还可以使用以下语法

 iptables -D <chain name> <rule number>

例如

Chain HTTPS
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  10.0.0.0/8           anywhere
ACCEPT     all  --  182.162.0.0/16       anywhere

删除规则

ACCEPT all—10.0.0.0/8任意位置

iptables -D HTTPS 2

下面是一行代码,它删除匹配搜索的iptables规则。本示例搜索与IP地址192.168.1.27匹配的所有规则,并删除所有规则。您可以在自己的搜索条件中编辑该IP地址。

eval `iptables --list-rules | grep '192.168.1.27' | sed 's/^-A /iptables -D /g;s/$/;/g'`

工作原理:

它使用这个问题的公认答案,并使用-D而不是-A运行规则。

  • iptables --list-rules列出了所有现有的规则。即使你用-I-R添加它们,这个列表也会用-A显示它们
  • | grep '192.168.1.27'将列表过滤为您想要删除的规则(在这种情况下,某些特定IP地址的规则)。
  • | sed 执行搜索和替换
    • s/^-A /iptables -D /g将每条规则开头的-A替换为iptables -D,这样它就变成了删除规则的可执行命令。
    • s/$/;/g将每个规则的末尾替换为分号,以在运行多个命令时分隔它们
  • eval ...接受所有输出并将其作为脚本运行。