383

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

4

8 回答 8

550

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

iptables -A ...

变成

iptables -D ...
于 2012-04-17T19:04:26.060 回答
506

您也可以使用规则的编号(--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
于 2013-01-25T11:37:55.543 回答
37

对我来说没有任何问题的最佳解决方案如下所示:
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 次规则 - 没有问题。希望,它有帮助

于 2013-11-01T20:28:20.367 回答
24

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

iptables -S

它列出如下:

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

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

iptables -D XYZ -p ...
于 2015-08-21T21:30:00.993 回答
13

使用-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
于 2017-04-07T09:32:50.580 回答
5

假设,如果你想删除 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
于 2017-04-28T11:26:34.237 回答
2

您还可以使用以下语法

 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

删除规则

接受所有 -- 10.0.0.0/8 任何地方

iptables -D HTTPS 2
于 2021-02-25T14:02:19.380 回答
0

这是一个删除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列出所有现有规则。即使您使用-Ior添加了它们-R,此列表也会使用-A
  • | grep '192.168.1.27'将列表过滤为您想要删除的规则(在本例中为某些特定 IP 地址的规则。)
  • | sed 进行搜索和替换
    • s/^-A /iptables -D /g-A将每个规则开头的替换为iptables -D,使其成为删除规则的可执行命令。
    • s/$/;/g用分号替换每个规则的结尾,以便在运行时分隔多个命令
  • eval ...获取所有输出并将其作为脚本运行。
于 2021-09-03T18:01:54.890 回答