在 ubuntu iptables 防火墙上切换端口规则?

Jon*_*sco 3 iptables

我有一个 ubuntu 服务器,它只允许通过 iptables 选择一组端口上的流量。REJECT默认设置的端口之一是53

我需要定期打开端口 53 以运行一个实例acme-dns来验证DNS-01来自LetsEncrypt 的挑战,然后在完成后关闭它。

有没有一种简单的方法可以自动化?我知道如何通过在列表顶部插入一个for traffic来轻松自动添加规则,但我知道如何禁用特定规则的唯一方法是列出所有带有行号的活动规则并逐行禁用特定规则数字。这需要我手动交互。iptables -IACCEPTudp53

我需要删除该规则,而不是通过REJECT在它之前插入 a 来撤消它,因为这将由 cron 作业运行,而且我不想用一堆相互撤消的 ACCEPT/REJECT 切换来污染规则。

我能想到的唯一方法是编写一个脚本,按行号打印规则,分析它们,然后删除匹配规则。有没有办法简单地使用我不知道的 iptables 命令来做到这一点?

A.B*_*A.B 5

通过使用用户定义的链,可以更轻松地管理规则。

创建链:

iptables -N acme-dns
Run Code Online (Sandbox Code Playgroud)

在 iptables 脚本中的正确位置运行此命令调用此链,在端口 53 的 REJECT 规则之前:

iptables -A INPUT -j acme-dns
Run Code Online (Sandbox Code Playgroud)

通常这个链是空的,没有效果。当需要访问 acme-dns 时,可以运行这个命令(它可能更精确,但这不是这里的重点):

iptables -A acme-dns -p udp --dport 53 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

当不再需要访问时,可以刷新链的内容。即使由于某种原因,先前的命令被多次添加,这无论如何都会刷新所有条目:

iptables -F acme-dns
Run Code Online (Sandbox Code Playgroud)

对于这个简单的案例,这就是真正需要的。对于涉及值(端口、ips...)而不是规则的大量动态更改的复杂情况,set match 模块和ipset可以帮助提高性能和管理。