如何使用IP集基于主机名创建iptables规则

IPTables是一个非常强大的工具,可以在你的Linux服务器系统上创建防火墙。然而,所有的规则都是基于IP地址的。例如,你可以打开一个端口到一个特定的源IP地址。
如果你有一个客户端需要连接到一个没有静态IP地址的服务,怎么办?客户端需要监控他们的IP地址的变化,向你发送新的IP,然后你必须手动更新你的iptables规则来允许他们访问。还有其他更好的方法吗?
当我有一个客户,需要从他的家里SSH访问他的服务器。他的有线网络连接,每月至少更换一次他的公共IP地址。我可以直接向所有人开放SSH并允许他连接,但这不是很安全。我们想出的解决方案是使用动态DNS将他的IP地址绑定到主机名上,然后使用IP Sets和一个简单的Bash脚本自动更新iptables。
注意:配置Dyamic DNS的客户端不在本教程的范围内,有几种方法可以完成这个任务,可以自行研究。
使用iptables配置IP集
IP集是一个框架,它允许你创建IP地址、MAC地址、网络、端口号等的 "集合"。这些集合可以在iptables规则中使用。这可能看起来很复杂,但是,它非常简单。只需几个命令,你就可以配置一个IP集。然后,我们将创建一个简单的bash脚本来更新该集。
在这个例子中,让我们假设客户端有以下动态DNS名称设置。
client1.example.com
创建您的IP集
第一步是创建你的IP集来保存客户端的IP地址。
$ sudo ipset create ssh-allowed hash:ip
这里我们告诉ipset工具创建一个名为 "ssh-allowed"的集,类型为"hash:ip"。这将用于存储允许SSH进入我们服务器的系统的IP地址。
我们现在可以查看这个IP集,发现它没有成员。这是预料之中的,因为我们还没有添加任何IP地址。在接下来的步骤中,我们将配置iptables来使用这个IP集。然后创建一个Bash脚本,根据客户的动态DNS名称添加客户的IP地址。

您可以手动添加IP地址到设置中进行测试。

现在如果我们列出 "ssh-allowed"IP Set,我们会看到我们有一个成员。

使用IP集创建iptables规则
现在我们已经创建了IP集,让我们在iptables中创建一个规则,告诉它允许SSH流量从这个IP集内的地址来。
sudo iptables -I INPUT -p tcp --dport 22 -m set --match-set ssh-allowed src -j ACCEPT
现在,iptables被配置为检查 "ssh-allowed "IP集,用于检查传入SSH连接的源IP地址。

任何属于 "ssh-allowed "IP集成员的IP地址现在都可以在目标端口22上连接到SSH。
创建一个Bash脚本,按主机名自动更新IP表。
我们的客户已经配置了动态DNS,以自动更新主机名client1.example.com的IP地址。剩下的就是设置一个脚本,用这个主机名的IP地址更新我们的 "ssh-allow "IP集。
注意: 你必须安装了 dig 工具。
下面的脚本将使用 dig 工具找到 client1.example.com 的 IP 地址,并设置 ip 变量。然后它将刷新IP集以删除任何旧的IP地址,然后插入新的IP地址允许它通过SSH访问服务器。

我们可以把这个脚本放在/etc/cron.daily中每天运行,或者创建一个基本的cron作业,根据我们的需要经常运行。由于客户端会自动更新动态DNS,这个脚本将确保他们仍然可以访问服务器。
使用IP集可以让你创建一个易于管理的IP地址列表,iptables可以在它的规则中使用。正如我们所展示的,当与一个简单的Bash脚本配对时,它也可以帮助从主机名或域名创建规则。