![如何在 GNU/Linux 的防火墙规则中使用 FQDN?](https://linux22.com/image/1224125/%E5%A6%82%E4%BD%95%E5%9C%A8%20GNU%2FLinux%20%E7%9A%84%E9%98%B2%E7%81%AB%E5%A2%99%E8%A7%84%E5%88%99%E4%B8%AD%E4%BD%BF%E7%94%A8%20FQDN%EF%BC%9F.png)
我正在尝试为 GNU/Linux 系统之一设置防火墙。据我所知,iptables
及其同类不能在其配置中使用 FQDN,因为它们预计会正常运行前网络接口已设置好,并且可访问 DNS。
但是,根据我使用 CentOS 的经验,我至少知道一个解决方案:apf
。但是,我无法让它在 Arch Linux 下正常工作。(iptables -nvL
产生一个全新的结果;与我在我们的开发服务器上执行相同命令时得到的结果完全不同。)
我想知道这里是否有人设法apf
在 Arch Linux 上工作,或者知道另一个防火墙前端或另一个防火墙可以在其规则中使用 FQDN。
请注意,目标 FQDN 来自动态 DNS 服务,例如动态域名系统我想知道是否有办法让防火墙进行 DNS 查找,就像(我认为)那样apf
。
反向 DNS 查找(据我所知,当 FQDN 放在 中/etc/hosts.allow
而无法找到时会发生这种情况/etc/hosts
)不是在这种情况下起作用,因为例如我的 IP 无法解析为我的 DynDNS FQDN。
(另外,请告诉我是否最好在 ServerFault 上询问这个问题。)
答案1
在您的 /etc/nsswitch.conf 中确定主机解析的顺序。
如果你的主机行是
主机:文件 DNS
然后它将在 DNS 之前首先检查您的 /etc/hosts 文件。
将 FQDN 放在 /etc/hosts 文件中。
另一个选项是从防火墙阻止更改为使用可以通过 DNS 查找进行匹配的 tcp_wrappers。防火墙中的 DNS 查找可能会出现问题,并且与安全概念背道而驰。另一个选项是运行一个守护进程来查询 DynDNS 名称,确定它是否已更改,然后将更改应用到您的 iptable。
答案2
根据 Darren 的建议,我编写了一个 shell 脚本,用于查找 IP,然后根据需要调整防火墙规则(并且,所谓必要时,我的意思是删除之前的所有内容并替换为正确的 IP)。以下是脚本:
#!/bin/bash
target_hosts="dynhost.does-not-exist.com another-host.does-not-exist.com"
if [ -f "/root/dynblock-curr" ]; then
mv /root/dynblock-curr /root/dynblock-prev
fi
touch /root/dynblock-curr
if [ -f "/root/dynblock-prev" ]; then
# Remove previously set firewall allows
for prev_ip in `cat /root/dynblock-prev`; do
ufw delete allow from $prev_ip to any app OpenSSH > /dev/null
done
fi
for target_host in $target_hosts; do
# Look up IP per host
# echo "Looking up IP for host:" $target_host
target_ip=`host $target_host | cut -d ' ' -f 4`
if [ $? -eq 0 ]; then
echo $target_ip >> /root/dynblock-curr
ufw allow from $target_ip to any app OpenSSH > /dev/null
fi
done
显然,我并不打算在这上面花费过多的脑细胞。这已经过测试,并保证对我有用。cron
每 15 分钟执行一次。
另一个(同样明显的)注意事项:我最终用它ufw
来管理iptables
规则(正如我所说,最低脑细胞数量)。