IPTables是在Linux系统上创建防火墙的非常强大的工具。但是,所有规则均基于IP地址。例如,您可以打开一个到特定源IP地址的端口。
如果您的客户端需要连接到没有静态IP地址的服务怎么办?客户端需要监视其IP地址的更改,向您发送新IP,然后您必须手动更新iptables规则以允许他们访问。一定有更好的方法。
这是我想到的,当时我有一个客户需要从家里通过SSH访问其服务器。他的有线互联网连接每月至少一次(有时每周一次)更改其公共IP地址。我可以向所有人打开SSH并允许他连接,但这不是很安全。我们制定的解决方案是使用动态DNS将其IP地址绑定到主机名,然后使用IP集和简单的Bash脚本自动更新iptables。
注意:配置Dyamic DNS的客户端不在本教程的范围内。有几种方法可以完成此操作。如果您需要帮助,请在评论中告诉我们。
使用iptables配置IP集
IP集是一个框架,可让您创建IP地址,MAC地址,网络,端口号等的“集合”。然后可以在iptables规则中使用这些集。这似乎很复杂,但是非常简单。仅需几个命令,您就可以配置IP Set。然后,我们将创建一个简单的bash脚本来更新该集合。
对于此示例,假设客户端具有以下动态DNS名称设置:
client1.example.com
创建您的IP集
第一步是创建IP集以保存客户端的IP地址。
$ sudo ipset create ssh-allowed hash:ip
在这里,我们告诉ipset实用程序创建一个类型为“ hash:ip”的名为“ ssh-allowed”的集合。这将用于存储允许通过SSH进入我们服务器的系统的IP地址。
现在,我们可以查看此IP集,看到它没有成员。这是预期的,因为我们尚未添加任何IP地址。在接下来的步骤中,我们将配置iptables以使用此IP集。然后创建一个Bash脚本,以根据客户端的动态DNS名称添加其IP地址。
$ sudo ipset list ssh-allowed
您可以手动将IP地址添加到该集中进行测试。
$ sudo ipset add ssh-allowed 192.168.100.197
现在,如果我们列出了“ssh-allowed”的IP集,我们将看到我们只有一个成员。
$ sudo ipset list ssh-allowed
使用IP集创建iptables规则
现在我们已经创建了IP集,让我们在iptables中创建一个规则,告诉它允许来自该IP集内地址的SSH流量。
sudo iptables -I INPUT -p tcp --dport 22 -m set --match-set ssh-allowed src -j ACCEPT
现在,将iptables配置为检查“ssh-allowed” IP设置的传入SSH连接的源IP地址。
$ sudo iptables -L -vn
现在允许属于“ ssh-allowed” IP集成员的任何IP地址连接到目标端口22上的SSH。
创建一个Bash脚本以按主机名自动更新IP表
我们的客户已将动态DNS配置为client1.example.com自动使用其IP地址更新主机名。剩下的就是设置脚本以使用该主机名的IP地址更新“ ssh-allow” IP集。
注意:您必须安装dig实用程序。
下面的脚本将使用dig实用程序来查找的IP地址client1.example.com并ip为其设置变量。然后它将刷新IP集以删除所有旧IP地址,然后插入新IP地址以允许其通过SSH访问服务器。
#!/bin/bash
# Find IP address and store it in $ip
ip=`dig +short client1.example.com`
# Flush old IP addresses from ssh-allowed IP Set
ipset flush ssh-allowed
# Add new IP address to ssh-allowed IP Set
ipset add ssh-allowed $ip
我们可以将此脚本放置在/etc/cron.daily中以每天运行,或者创建一个基本的cron作业以根据需要运行它。当客户端自动更新动态DNS时,此脚本将确保它们仍然可以访问服务器。
结论
使用IP集可以使您创建易于管理的IP地址列表,iptables可以在其规则中使用该IP地址。正如我们所展示的,当与简单的Bash脚本配对时,它还可以帮助从主机名或域名创建规则。