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


334

我分别在端口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规则。


2
我发现最好使用-I而不是-A用于ACCEPT行。这是因为通常,最后一行(INPUT例如,对于链)是a DROP或,REJECT并且您希望规则在此之前。 -A将新规则放在最后一条规则之后,而-I将其放在开始位置。
Mark Lakata 2014年

Answers:


471

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

iptables -A ...

变成

iptables -D ...

7
如果您有几种规则,则不会删除所有规则。
ETech 2014年

4
尝试多次执行此-D命令,它将删除所有这些命令。
李振宇

4
我执行了相同的命令,但使用-D而不是-I。但是我得到了坏规则(是否存在匹配规则)...
2015年

4
如果您使用-I或添加了规则-R,则仍然可以使用将其删除-D
大卫·夏

请注意。我用“ iptables -A ...”创建了一条规则,该规则出现了,但没有生效。使用'iptables -D ...'时,响应为错误规则。即使如此,该规则仍被删除。该规则在“ sudo iptables -nvL”中可见。我使用的链是“输入”。
本·帕兹

446

您也可以使用规则的数字(--line-numbers):

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

4
两种解决方案都不错,但是当行号未知时,该解决方案将无法在脚本设置中使用。因此,另一种解决方案是IMO,因此更通用。
Jeroen

2
好吧,如果您不知道这一行,则可以使用注释(例如,答案之间)或为规则做一个grep:iptables -L INPUT --line-numbers | grep -oP "([0-9]{1,3}).*tcp.*domain" | cut -d" " -f1
domi27 2013年

6
仅当表在任何时间点都不能插入规则时,才可以。否则,行号可能会在观察它们和执行删除规则之间改变。在这种情况下,假设时间窗口太短以至于“不可能发生”是不安全的。
尼克

14
请记住,如果删除一条规则,则其余部分的行号会更改。所以,如果你需要删除规则5,10,和12 ...删除12,10,则5
TomOnTime

2
尝试删除PREROUTING规则时,我必须指定-t nat例如:sudo iptables -t nat --line-numbers -L,并且也删除它们-t nat,例如:(sudo iptables -t nat -D PREROUTING 1可能值得添加答案?)
ThorSummoner 2015年

31

对我来说没有任何问题的最佳解决方案是这样的:
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%删除所有与$ comment匹配的规则,并保持其他行不变。此解决方案可在过去2个月内正常工作,每天可更改约100条规则-没问题。希望它能提供帮助


2
如果您没有iptables保存/恢复:iptables -S | grep "${comment}" | sed 's/^-A //' | while read rule; do iptables -D $rule; done
Mansour

实际使用情况:CRON 1)删除旧的spamhausiptables禁令,2)抢夺spamhaus.org/drop,3)grep for CIDR IP,以及iptables -A INPUT -s $ip_cidr -j -m comment --comment "spamhaus"
Xeoncross 2015年

2
@Mansour或者iptables -S | sed "/$comment/s/-A/iptables -D/e")像这样
hek2mgl

@ hek2mgl sed不放弃,不是吗?=]谢谢,我会牢记这一功能(我会在一天内忘记语法)。
曼苏尔2015年

sed仅用于从uuid中删除“-”。无论如何,一旦您获得了sed语法-它就永远不会被忘记。))
ETech

11

首先使用此命令列出所有iptables规则:

iptables -S

它列出如下:

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

然后复制所需的行,只需更换-A-D删除:

iptables -D XYZ -p ...

2
意识到!这是不完整的答案。从有关“ -S”的手册中:“就像其他所有iptables命令一样,它适用于指定的表(默认为filter)。”。因此,在使用此开关的情况下-应该对所有表重复:nat,mangle等
pmod

1
就我而言,我iptables: Bad rule (does a matching rule exist in that chain?).现在得到什么?
阿卜杜勒

啊,知道了-我的delete命令缺少表规范。因此,如果您使用列出表中的所有规则natsudo iptables -S -t nat并且要删除返回的规则之一,则复制是不够的。您必须添加-t nat,例如sudo iptables -D ... -t nat
阿卜杜勒

容易明白!
sknight,

5

使用-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.

一定要实现此命令,就像所有其他command(-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

我发现这是--line-number最好的选择
Davuz

是! 高超!不想全iptables -F
开发阿南德Sadasivam

2

假设,如果要删除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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.