如何在 GNU/Linux 的防火墙规则中使用 FQDN?

如何在 GNU/Linux 的防火墙规则中使用 FQDN?

我正在尝试为 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规则(正如我所说,最低脑细胞数量)。

相关内容