![安全的刷新 iptables 方式,不会造成流量泄露](https://linux22.com/image/721499/%E5%AE%89%E5%85%A8%E7%9A%84%E5%88%B7%E6%96%B0%20iptables%20%E6%96%B9%E5%BC%8F%EF%BC%8C%E4%B8%8D%E4%BC%9A%E9%80%A0%E6%88%90%E6%B5%81%E9%87%8F%E6%B3%84%E9%9C%B2.png)
我有一个 iptables 文件,大致如下所示:
iptables -F
iptables -A INPUT -s 192.168.56.0/24 -j ACCEPT
iptables -A OUTPUT -d 192.168.56.0/24 -j ACCEPT
iptables -A INPUT -s 10.0.0.0/8 -j ACCEPT
iptables -A OUTPUT -d 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -s 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -d 127.0.0.1 -j ACCEPT
iptables -A INPUT -s $(dig +short somedomain.com) -j ACCEPT
iptables -A OUTPUT -d $(dig +short somedomain.com) -j ACCEPT
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
我设置了一个 cron 每小时运行一次。让我担心的是 iptables -F 和脚本结束之间可能会有一些数据包泄漏。有没有其他方法可以运行它而不必在开始时运行 iptables -F?
答案1
根据使用 ipset 的建议,这在我看来是最好的解决方案,让我们首先准备好集合:
ipset create netset hash:net
ipset add netset 192.168.56.0/24
ipset add netset 10.0.0.0/8
ipset add netset 127.0.0.1
ipset add netset somedomain.com
您可以使用以下命令验证结果集
ipset save netset
现在表格如下:
iptables -F
iptables -A INPUT -m set --match-set netset src -j ACCEPT
iptables -A OUTPUT -m set --match-set netset dst -j ACCEPT
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
现在更新:
ipset create newnetset hash:net
ipset add newnetset 192.168.56.0/24
ipset add newnetset 10.0.0.0/8
ipset add newnetset 127.0.0.1
ipset add newnetset somedomain.com
ipset swap newnetset netset
ipset destroy newnetset
请注意,在防火墙规则中依赖 DNS 通常被认为不是最安全的做法。我猜你正在尝试允许与使用住宅互联网连接的主机进行通信,并且你正在尝试依赖某种动态 DNS 来使规则与不断变化的 IP 地址保持同步。在发生某种端口敲击事件时使用 VPN 可能是更好的解决方案。
答案2
令我担心的是 iptables -F 和脚本结束之间可能存在一些数据包泄漏的可能性。
现在你通过规则丢弃所有数据包。如果你设置政策删除 INPUT/OUTPUT 链中的策略不会被刷新重置。
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
但是,使用 ipset 或链来制定动态规则而不是刷新整个表可能是更好的解决方案。