我分别在端口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规则。
对我来说最好的解决方案是这样的:
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个规则-没有问题。希望,有帮助
你也可以使用规则的编号(——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
下面是删除与搜索匹配的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 lists all the existing rules. Even if you added them with -I or -R, this list shows them all with -A
| grep '192.168.1.27' filters the list to just the rules that you want removed (in this case the rules for some specific IP address.)
| sed does a search and replace
s/^-A /iptables -D /g replaces the -A at the start of each rule with iptables -D so that it becomes an executable command to remove the rule.
s/$/;/g replaces the end of each rule with a semi-colon to separate multiple commands when they are run
eval ... takes all that output and runs it as a script.
对我来说最好的解决方案是这样的:
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个规则-没有问题。希望,有帮助
使用-D命令,手册是这样解释的:
-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)一样,在特定的表上工作。如果你不是在默认表(过滤表)上工作,使用-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