基于域名而不是IP地址的防火墙规则

基于域名而不是IP地址的防火墙规则

我正在运行鳄梨酱远程桌面网关测试设置来管理对云虚拟机实例的访问。

当我收到一位客户发来的一个奇怪的 POC 请求,要求将 Guacamole RDG 的访问权限限制在一个没有静态 IP 的特定域时,我别无选择。客户端可能会使用动态 DNS 等服务将其域解析回他们获得的任何动态 IP。

所以基本上我必须根据一个域名而不是 IP 地址在我的 Guacamole RDG 服务器中设置入站防火墙规则。除了基本的网络逻辑之外,还有什么办法可以实现这个需求呢?

我尝试使用以下命令根据域名设置 iptables 规则,但在执行后,它实际上解析了域名并将规则应用于具有解析 IP 地址的 iptables。

iptables -A INPUT -p tcp --src domain.com --dport 3128 -j ACCEPT

答案1

iptables它本身仅适用于 IP 地址,但您可以创建基于 ipset 的规则并定期更新 ipset。

ipset create allowed hash:ip family inet     # IPv4-only
ipset create allowed6 hash:ip family inet6   # IPv6-only

请注意,默认情况下,重新启动后所有 ipset 都会被销毁。

规则将如下所示:

iptables -A INPUT -p tcp --dport 3128  -m set --match-set allowed src -j ACCEPT
ip6tables -A INPUT -p tcp --dport 3128  -m set --match-set allowed6 src -j ACCEPT

(作为脚注,对于 FORWARD 和 OUTPUT 链,src需要替换为dst

创建一个脚本来执行域查找并更新 ipset。

#!env /bin/bash

# Domain names to look up
names=("example.com" "example.org")

ipset flush allowed
for name in ${names[@]}; do
    # Look up and add IPv4 addresses (dig may output multiple)
    ip4s=$(dig A +short ${name})
    for ip4 in ${ip4s}; do
        ipset add allowed ${ip4}
    done
    
    # Look up and add IPv6 addresses (dig may output multiple)
    ip6s=$(dig AAAA +short ${name})
    for ip6 in ${ip6s}; do
        ipset add allowed6 ${ip6}
    done
done

添加一个 cronjob 来定期执行脚本。例如,每 5 分钟一次:

*/5 * * * * root /path/to/myscript.sh

答案2

ipset add allowed $ip

不适合我,因为dig响应了 4 个 IP。这样做了:

for n in $ip
do
  ipset add allowed $n
done

答案3

CSF 防火墙嵌入了此功能。因此,您甚至可以将入站锁定为单个来源。并拥有(便宜但希望安全的)动态 DNS 服务,将 IP 更新到给定的子域。 CSF会定期检查并更改允许的入站IP。它的效果非常非常好。维护费用非常低。我用来锁定对 VPS 的访问。看起来这应该是一个很流行的东西,但是很难找到很多关于它的信息。所以很高兴了解 CSF。顺便说一下,可以在 Webmin 中轻松配置。而且它是免费的。并受欢迎。如果各种路径不同,设置起来有点棘手,具体取决于您使用的发行版。https://www.configserver.com/cp/csf.html

相关内容