清除所有iptables规则的最佳方法


83

我目前有以下代码段:

# flush all chains
iptables -F
iptables -t nat -F
iptables -t mangle -F
# delete all chains
iptables -X

运行此规则后,某些不可渗透的规则是否可能仍然存在?

这个想法是要有一个完全干净的iptables配置,可以很容易地用新的规则集代替(不要管路由/ ifconfig的参数)。

Answers:


107

简洁地回答您的问题,否:刷新每个表后将没有任何“剩余”规则。但是,为了更全面,您可能还需要将内置INPUTFORWARD链接的策略设置ACCEPT为:

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -F
iptables -t mangle -F
iptables -F
iptables -X

清除ip6tables规则:

ip6tables -P INPUT ACCEPT
ip6tables -P FORWARD ACCEPT
ip6tables -P OUTPUT ACCEPT
ip6tables -t nat -F
ip6tables -t mangle -F
ip6tables -F
ip6tables -X

...而且应该这样做。iptables -nvL应该产生以下(或非常相似的)输出:

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

9
您忘记了“原始”:iptables -t raw -F iptables -t raw -X
kK-Storm 2015年

there would not be any "leftover" rules after flushing every tableOP不会刷新每个表。你也没有 如果想要全面了解,这是它的外观。并且您可能想要添加iptables -t "$table" -Z。请注意,这样可以对表及其链表进行硬编码。因此,我将认真考虑保存-还原解决方案。或者,您可以仅卸载iptables
x-yuri

23

这将正确地将iptables系统完全重置为非常基本的状态:

iptables-save | awk '/^[*]/ { print $1 } 
                     /^:[A-Z]+ [^-]/ { print $1 " ACCEPT" ; }
                     /COMMIT/ { print $0; }' | iptables-restore

所有策略都将重置为ACCEPT并刷新当前使用的每个表。除内置链以外的所有链将不再存在。


1
整洁的骇客!不过,我不会依赖它,因为对保存/恢复格式进行细微更改很可能会破坏它。最好坚持使用该iptables工具明确提供的API,即IMO。
史蒂文

3
我改变了主意:数据格式已被广泛使用,因此不太可能再改变。+1。
史蒂文

2
+1,有趣的黑客
山姆Halicke

这设法摆脱了剩余的UFW链,这是公认的答案没有做到的事情。
l0b0

这是一个小细节,但你可能要更换一次print $1print $0是一致的:)
X-尤里

2

每当我需要禁用防火墙时,都是这样的:

  • iptables-save > iptables.bak
  • service iptables stop (我在浅顶软呢帽上)

1

您可以iptables从内核中卸载模块:

modprobe -r iptable_raw iptable_mangle iptable_security iptable_nat iptable_filter

UPD不幸的是,太好了,难以置信。只要表中存在规则或用户定义的链,则相应模块的引用计数为1,并且会modprobe -r失败。您可以像这样删除规则和用户定义的链:

echo $'*raw\nCOMMIT\n*mangle\nCOMMIT\n*security\nCOMMIT\n*nat\nCOMMIT\n*filter\nCOMMIT' | iptables-restore

要么:

iptables-save | awk '/^[*]/ { print $1 "\nCOMMIT" }' | iptables-restore

另外,您可能希望以这种方式卸载模块(不对模块名称进行硬编码):

lsmod | egrep ^iptable_ | awk '{print $1}' | xargs -rd\\n modprobe -r

从好的方面来说,这之后iptables-save会产生不错的空输出:)


那可能是这里的锤子。谢谢。
Konrad Gajewski

0

一个人可以用1或2个命令执行此操作:

 $ sudo iptables-save > iptables.bak
 $ sudo iptables -F

结果:

$ sudo iptables -nvL
Chain INPUT (policy ACCEPT 3138 packets, 5567K bytes)
pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 3602 packets, 6547K bytes)
pkts bytes target     prot opt in     out     source               destination         

5
如果默认策略当前设置为DROP,这是一种锁定服务器的快速方法。因此,不是,这不是一个1或2的命令过程。如果尚未设置,则需要首先设置为ACCEPT。
RyanH

0

我最近不得不阻止所有连接,最终我要做的是

iptables-policy INPUT DROP
iptables-policy OUTPUT DROP
iptables-policy FORWARD DROP

至于保存,我建议以下

Ubuntu:

/etc/init.d/iptables save
/sbin/service iptables save

RedHat / CentOS:

/etc/init.d/iptables save
/sbin/iptables-save

除了备份所有当前的ufw规则外,Ive过去也使用过此规则

cp /lib/ufw/{user.rules,user6.rules} /<BACKUP LOCATION> 
cp /lib/ufw/{user.rules,user6.rules} ./

我认为这可能对将来的参考很有用。以为我会分享。


0

将配置备份到iptables_backup.conf并清除所有规则。

iptables-save | tee iptables_backup.conf | grep -v '\-A' | iptables-restore

恢复以前的配置:

iptables-restore < iptables_backup.conf
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.