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

我在端口8006和8007上分别托pipe特殊的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 

这就像一个魅力。 不过,我想创build另一个脚本,再次禁用我的服务器; 即将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规则。

    执行相同的命令,但用“-D”replace“-A”。 例如:

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

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

    您也可以使用规则的号码( – 行号 ):

     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),则必须将其添加到删除命令(thx到@ThorSummoner的注释)

     sudo iptables -t nat -D PREROUTING 1 

    对我而言没有任何问题的最佳解决scheme是这样的:
    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的规则,并保持其他行不变。 这个解决scheme在过去2个月内每天约有100个规则的变化 – 没有问题。希望它有帮助

    首先用这个命令列出所有的iptables规则:

     iptables -S -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT 

    然后复制您要删除的特定规则。

    最后用这个命令删除规则:

     iptables -D INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT 

    使用-D命令,这是man page如何解释的:

     -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参数列出行--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' 

    那么,你可以validation一下,

     # sudo iptables -L -t nat -v