我怎样才能从iptables的删除特定的规则?(How can I remove specific

2019-06-23 17:34发布

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

Answer 1:

执行相同的命令,但更换“-A”与“-D”。 例如:

iptables -A ...

iptables -D ...


Answer 2:

您也可以使用该规则的数量(--line号码 ):

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


Answer 3:

没有任何问题,我工作的最好解决方案看起来是这样的:
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每天规则的变化 - 没有issues.Hope,它可以帮助



Answer 4:

首先列出与此命令所有的iptables规则:

iptables -S

它列出,如:

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

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

iptables -D XYZ -p ...


Answer 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.

一定要明白这个命令,像所有其他命令( -A-I )的作品对某些表。 如果you'are不是默认表(工作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


Answer 6:

假设,如果你想删除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


文章来源: How can I remove specific rules from iptables?