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