假设我有一条引入了 的链iptables -N SERVICES-VPN
。
但我希望这条链子能放下一切……所以iptables -A SERVICES-VPN -j DROP
。
这里的问题是我可能需要稍后添加规则才能被接受。每次我需要添加它们时,我都必须手动删除删除规则(按行号烦人,对吧?),然后引入新规则来接受该服务,然后再次重新引入删除规则iptables -A SERVICES-VPN -j DROP
。
这甚至可以被视为一个安全漏洞,僵尸网络可能会等待我通过删除 DROP 规则来打开所有端口来执行某些操作,而最后一道防线,即防火墙,是保护相关机器的。
对于策略来说,这个问题不存在,类似的策略iptables -P INPUT DROP
仍然允许我添加新规则,如果不存在规则,它会断开连接。使用链条实现这一目标的最佳方法是什么?
将链分成两部分,其中包含允许规则列表和另一个查找允许规则并随后删除的链。
看起来像这样的东西:
希望您在启动时没有一个肮脏的脚本来执行此操作,而是一个格式整齐的兼容
iptables-restore
文件,该文件使此原子化,这将消除您提到的竞争条件。希望您也迁移到
nftables
(nft
在 CLI 上),因为它没有被弃用并且更灵活(这可以通过 VPN/非 VPN 的两个单独的链来实现)。编辑:
iptables
弃用可以争论,但从我的理解来看,虽然有一些工具可以轻松地从包含内核端兼容性模块过渡iptables
到nftables
包含内核端兼容性模块,但我不希望它们永远持续下去,所以我将把它保留在这里,但请随意阅读下面@AB 的评论以获得不同的观点。关于这个问题的要点是它提供了更大的灵活性,这可能使解决方案更容易实施/维护。或者,不使用 A pend,而是使用
-A
A dd A fter ,这会在链中的现有规则后面添加任何新规则,您可以使用该选项-I
在(现有)链的开头插入新规则,而不首先删除需要位于您要添加的规则后面的任何现有规则。