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

Jin*_*hJK 9 firewall ubuntu iptables

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

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

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

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

iptables -A INPUT -p tcp --src domain.com --dport 3128 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

ibr*_*him 13

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

ipset create allowed hash:ip family inet     # IPv4-only
ipset create allowed6 hash:ip family inet6   # IPv6-only
Run Code Online (Sandbox Code Playgroud)

请注意,默认情况下,重新启动后所有 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
Run Code Online (Sandbox Code Playgroud)

(作为脚注,对于 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
Run Code Online (Sandbox Code Playgroud)

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

*/5 * * * * root /path/to/myscript.sh
Run Code Online (Sandbox Code Playgroud)