如何使用iptables防火墙ipset存储IP池子来保护你的网站不被恶意IP攻击-OK源码中国网络安全教程

前言

有的时候,网站会受到大量恶意攻击,有的恶意IP还隔三差五来搞你一波,占用服务器资源,影响网站响应速度。

想要屏蔽这些恶意IP,就可以使用iptables、ipset等工具。

IPTABLES

简介

iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个框架的名字叫netfilter。

netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。

iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。而我们就可以通过iptables屏蔽一些IP。

基本操作

服务器默认安装iptables,可以使用如下指令查看iptables版本。

如果想查阅iptables的帮助文档,可以使用如下指令。

如果屏蔽了IP,或者做了其他更改,可以通过如下指令查看当前防火墙配置规则。

在Linux中,可以很简单地用iptables框架禁止IP地址:

iptables -I INPUT -s 192.168.1.1 -j DROP

192.168.1.1为恶意IP地址,如果没有报错,说明添加成功。使用iptables -L -n指令查看配置情况:

如上图所示,我的个人网站目前一共屏蔽了7个恶意IP。如果屏蔽错了,或者想将屏蔽的IP放出来,怎么操作?

使用上述指令,即可将屏蔽的IP释放出来。

后面的DROP是处理动作,表示直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。

除此之外还有:

  • ACCEPT:允许数据包通过。
  • REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
  • SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
  • MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
  • DNAT:目标地址转换。
  • REDIRECT:在本机做端口映射。
  • LOG::在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。

屏蔽IP,只需要用到DROP和REJECT就行。

如果你愿意,你可以保存iptables的配置到一个文件中:

可以使用如下指令恢复规则:

防火墙操作:

systemctl start firewalld
systemctl stop firewalld
systemctl restart firewalld

IPSET

简介

然而,当你有1000个独立IP地址,且不带CIDR(无类别域间路由)前缀,你该怎么做?你要有1000条iptable规则!这显然这并不适于大规模屏蔽。

这时候就是IP集登场了。IP集是一个内核特性,它允许多个(独立)IP地址、MAC地址或者甚至是端口号被编码和有效地存储在位图/哈希内核数据结构中。一旦IP集创建之后,你可以创建一条iptables规则来匹配这个集合。

而管理IP集一个人很好的工具就是ipset。为了创建和管理IP集,你需要使用称为ipset的用户空间工具。

要在Debian、Ubuntu或者Linux Mint上安装:

Fedora或者CentOS/RHEL 7上安装:

sudo yum install ipset

基本操作

让我通过简单的示例告诉你该如何使用ipset命令。

首先,让我们创建一条新的IP集,名为banlist(名字任意):

第二个参数(hash:net)是必须的,代表的是集合的类型。IP集有多个类型。hash:net类型的IP集使用哈希来存储多个CIDR块。如果你想要在一个集合中存储单独的IP地址,你可以使用hash:ip类型。

一旦创建了一个IP集之后,你可以用下面的命令来检查:

这显示了一个可用的IP集合列表,并有包含了集合成员的详细信息。默认上,每个IP集合可以包含65536个元素(这里是CIDR块)。你可以通过追加”maxelem N”选项来增加限制。

现在让我们来增加IP到这个集合中:

你会看到集合成员已经改变了。

如果想要从集合中删除这个IP:

现在是时候去创建一个使用IP集的iptables规则了。这里的关键是使用”-m set –match-set “选项。

现在让我们创建一条让之前那些IP块不能通过80端口访问web服务的iptable规则。可以通过下面的命令:

如果你愿意,你可以保存特定的IP集到一个文件中,以后可以从文件中还原:

上面的命令中,我使用了destory选项来删除一个已有的IP集来看看我是否可以还原它。

自动IP地址禁用

现在你应该看到了IP集合的强大了。维护IP黑名单是一件繁琐和费时的工作。实际上,有很多免费或者收费的服务可以来帮你完成这个。一个额外的好处是,让我们看看如何自动将IP黑名单加到IP集中。

首先让我们从iblocklist.com得到免费的黑名单,这个网站有不同的免费和收费的名单。免费的版本是P2P格式。

接下来我要使用一个名为iblocklist2ipset的开源Python工具来将P2P格式的黑名单转化成IP集。

使用的下面命令安装iblocklist2ipset:

pip是python管理包的工具,一般服务器自带,无需安装。

在一些发行版如Fedora,你可能需要运行:

现在到iblocklist.com,抓取任何一个P2P列表的URL(比如”level1″列表)。

粘帖URL到下面的命令中。

iblocklist2ipset generate --ipset banthis "http://list.iblocklist.com/?list=ydxerpxkpcfqjaybcssw&fileformat=p2p&archiveformat=gz" banlist.txt

上面的命令运行之后,你会得到一个名为banlist.txt的文件。如果查看它的内容,你会看到像这些:

你可以用下面的ipset命令来加载这个文件:

现在可以查看自动创建的IP集:

在写这篇文章时候,“level1”类表包含了237,000个屏蔽的IP列表。你可以看到很多IP地址已经加入到IP集中了。

最后,创建一条iptables命令来屏蔽这些坏蛋!

iptables -I INPUT -m set --match-set banlist src -p tcp --destination-port 80 -j DROP

总结

屏蔽IP难免带来误伤,所以可以周期性释放,比如定期把已经加入关黑名单一周的IP释放出来,再犯规再给送进去。

我的网站,攻击者IP大部分都是河南郑州的,一看服务器都是景安网络的服务器,也是醉醉的。