如何更新基于 ipset 名称的条目

如何更新基于 ipset 名称的条目

我需要在防火墙上处理(火神,然后将其转换为 iptables)一些动态条目。在理想情况下,我会使用一个始终指向正确 IP 的名称(而不是 IP 地址),但这并不适用(出于好的理由)。

为了保持稳定的配置,我正在考虑使用ipset。(编辑:为了下面的例子,我们假设www.google.com只有一个IP 地址,但可能会改变)

root@srv ~# ipset create google hash:ip
root@srv ~# ipset add google www.google.com
root@srv ~# ipset list google
Name: google
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 136
References: 0
Number of entries: 1
Members:
216.58.206.228

我可以添加/删除该集合的 IP。这并不能解决更新 IP 的问题

举上面的例子,我希望能够重新添加www.google.com(如果其 IP 发生变化),并删除216.58.206.228并替换为其新 IP。

不是这种情况:

root@srv ~# ipset add google www.google.com
root@srv ~# ipset list google
Name: google
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 184
References: 0
Number of entries: 2
Members:
216.58.206.228
216.58.204.132

是否存在一种机制可以更新一组 IP 以匹配名称的当前解析?

编辑:澄清以下一些答案:我不想解决具有多个地址的名称的问题并覆盖所有地址(例如,确保我拥有所有解析度www.google.com)。我有一个具有单个 IP 的站点,但该 IP 可能会更改。

答案1

这似乎不是阻止拥有多个 IP 地址的网站的最佳方法。

尽管如此,即使 ipset 列表中有多个 IP 地址,此方法仍可行:

不要重写相同的 ipset 列表,而是创建一个新列表,然后重写ipset swap它们。

ipset create temp hash:ip

for address in $(dig a www.google.com +short); do
    ipset add temp $address
done

ipset swap temp google
ipset destroy temp

答案2

你的问题有两个方面:

  • 防火墙的工作方式是阻止/允许与特定 IP 地址、IP 地址范围和端口的连接。如果您使用主机名而不是 IP 地址配置防火墙,则在配置加载时,它仍将在其运行配置中使用 IP 地址,并使用主机名解析到的 IP 地址。

  • 许多目的地不再使用单个固定的 IP 地址(范围),而是使用 CDN、循环和 GEO DNS、任播等,并且随后到同一目的地 DNS 名称的连接将以(几乎)不可预测的模式转到不同的 IP 地址。

大多数组织通过完全阻止直接互联网访问并强制使用代理服务器来解决该问题。在代理服务器上,您可以轻松实施基于 URL 的访问控制,并允许访问 www.google.co.uk 并阻止访问 www.google.de,尽管这些网站(有时)可能解析为相同的 IP 地址,尽管这些网站的 IP 地址可能会随机更改。

或者,组织会阻止 DNS,仅允许使用他们提供的 DNS 服务器,并在 DNS 级别运行主机名白名单/黑名单。对于大多数用户来说,这是一种有效的访问控制,尽管熟练的操作员很容易绕过。

答案3

我遇到过类似的情况,偶然发现了这篇旧帖子。我无法找到一个可以立即使用的解决方案。

我同意代理服务器通常足以最多需求,使用代理始终是更好的选择......当这实际上是可能的时候......

然而,仍有许多软件应用程序和硬件设备(尤其是物联网设备)忽略或仅部分实施代理设置。即使在 2023 年,这个问题仍然普遍存在,影响了一些广泛使用的在线服务。不幸的是,更改或放弃这些应用程序并不总是可行的选择。此外,通常有很多云托管 IP,并且不能保证 IP 始终由给定主机拥有。

为了解决这个问题,我设计了一个 bind 插件,可以动态更新 ipset。配置文件如下:

    plugin query "update-ipset.so" {
            ipset safe {
                sites  {
                    *.google.com.;
                    *.microsoft.com.;
                    *.serverfault.com.;
                };
                ttl 86400;
            };
            ipset safev6 { 
                sites {
                    *.google.com.;
                    *.microsoft.com.;
                };
                ipv6 yes;
            };
            ipset entertainment {
                sites {
                    *.playstation.com.;                   
                };
                ttl 3600;
                ipv6 no;
            };
    };

现在,我将把它安装在服务器上,看看是否允许服务使用防火墙 ipset 规则通过。

我真的很想了解一下人们对这个插件的兴趣,它可能会在 GPL2 许可下发布,并作为独立模块或 bind9 fork 在 GitHub.com 上提供。

我鼓励任何感兴趣的人分享他们的想法和反馈。

相关内容