我有一个ubuntu服务器,它只允许通过iptables选择一组端口上的流量.其中一个默认设置为REJECT的端口为53.
我需要定期打开端口53来运行acme-dns实例来验证来自LetsEncrypt的DNS-01挑战,然后在完成后关闭它.
有一种简单的方法可以自动化吗?我知道如何通过iptables -I轻松自动添加规则以在列表顶部插入udp流量的ACCEPT 53,但我知道如何禁用特定规则的唯一方法是列出所有活动规则的行号和按行号禁用特定规则.这需要我手动互动.
我需要删除该规则,而不是通过在它之前插入REJECT来撤消它,因为这将由cron作业运行,我不希望污染规则与一堆ACCEPT / REJECT切换相互撤消.
我能想到的唯一方法是编写一个脚本,按行号打印规则,分析它们,然后删除匹配规则.有没有办法用我不知道的iptables命令来做到这一点?
使用用户定义的链可以更轻松地管理规则.
创建一个链:
iptables -N acme-dns
在端口53的REJECT规则之前,使用此命令在iptables脚本中的正确位置运行此链:
iptables -A INPUT -j acme-dns
通常这条链是空的,没有任何影响.当需要访问acme-dns时,可以运行此命令(可能更精确,但这不是重点):
iptables -A acme-dns -p udp --dport 53 -j ACCEPT
当不再需要访问时,可以刷新链的内容.即使由于某种原因,多次添加了上一个命令,无论如何都将刷新所有条目:
iptables -F acme-dns
对于这个简单的案例,这就是所有需要的.对于涉及对值(端口,ips …)进行大量动态更改而非规则的复杂情况,设置匹配模块和ipset可以帮助实现性能和管理.