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