如何使用iptables防火墙ipset存储IP池子来保护你的网站不被恶意IP攻击-OK源码中国网络安全教程
前言
有的时候,网站会受到大量恶意攻击,有的恶意IP还隔三差五来搞你一波,占用服务器资源,影响网站响应速度。
想要屏蔽这些恶意IP,就可以使用iptables、ipset等工具。
IPTABLES
简介
iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个框架的名字叫netfilter。
netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。
iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。而我们就可以通过iptables屏蔽一些IP。
基本操作
服务器默认安装iptables,可以使用如下指令查看iptables版本。
iptables -V
如果想查阅iptables的帮助文档,可以使用如下指令。
如果屏蔽了IP,或者做了其他更改,可以通过如下指令查看当前防火墙配置规则。
iptables -L -n
在Linux中,可以很简单地用iptables框架禁止IP地址:
iptables -I INPUT -s 192.168.1.1 -j DROP
192.168.1.1为恶意IP地址,如果没有报错,说明添加成功。使用iptables -L -n指令查看配置情况:
如上图所示,我的个人网站目前一共屏蔽了7个恶意IP。如果屏蔽错了,或者想将屏蔽的IP放出来,怎么操作?
iptables -D INPUT -s 192.168.1.1 -j DROP
使用上述指令,即可将屏蔽的IP释放出来。
后面的DROP是处理动作,表示直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
除此之外还有:
- ACCEPT:允许数据包通过。
- REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
- SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
- MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
- DNAT:目标地址转换。
- REDIRECT:在本机做端口映射。
- LOG::在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。
屏蔽IP,只需要用到DROP和REJECT就行。
如果你愿意,你可以保存iptables的配置到一个文件中:
iptables-save > ip.rule
可以使用如下指令恢复规则:
iptables-restore < ip.rule
防火墙操作:
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上安装:
sudo apt-get install ipset
Fedora或者CentOS/RHEL 7上安装:
sudo yum install ipset
基本操作
让我通过简单的示例告诉你该如何使用ipset命令。
首先,让我们创建一条新的IP集,名为banlist(名字任意):
ipset create banlist hash:net
第二个参数(hash:net)是必须的,代表的是集合的类型。IP集有多个类型。hash:net类型的IP集使用哈希来存储多个CIDR块。如果你想要在一个集合中存储单独的IP地址,你可以使用hash:ip类型。
一旦创建了一个IP集之后,你可以用下面的命令来检查:
这显示了一个可用的IP集合列表,并有包含了集合成员的详细信息。默认上,每个IP集合可以包含65536个元素(这里是CIDR块)。你可以通过追加”maxelem N”选项来增加限制。
ipset create banthis hash:net maxelem 1000000
现在让我们来增加IP到这个集合中:
ipset add banlist 203.171.228.159
你会看到集合成员已经改变了。
如果想要从集合中删除这个IP:
ipset del banlist 203.171.228.159
现在是时候去创建一个使用IP集的iptables规则了。这里的关键是使用”-m set –match-set “选项。
现在让我们创建一条让之前那些IP块不能通过80端口访问web服务的iptable规则。可以通过下面的命令:
如果你愿意,你可以保存特定的IP集到一个文件中,以后可以从文件中还原:
ipset save banlist -f banlist.txt
ipset destroy banlist
ipset restore -f banlist.txt
上面的命令中,我使用了destory选项来删除一个已有的IP集来看看我是否可以还原它。
自动IP地址禁用
现在你应该看到了IP集合的强大了。维护IP黑名单是一件繁琐和费时的工作。实际上,有很多免费或者收费的服务可以来帮你完成这个。一个额外的好处是,让我们看看如何自动将IP黑名单加到IP集中。
首先让我们从iblocklist.com得到免费的黑名单,这个网站有不同的免费和收费的名单。免费的版本是P2P格式。
接下来我要使用一个名为iblocklist2ipset的开源Python工具来将P2P格式的黑名单转化成IP集。
使用的下面命令安装iblocklist2ipset:
pip install iblocklist2ipset
pip是python管理包的工具,一般服务器自带,无需安装。
在一些发行版如Fedora,你可能需要运行:
python-pip install iblocklist2ipset
现在到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命令来加载这个文件:
ipset restore -f banlist.txt
现在可以查看自动创建的IP集:
ipset list banlist
在写这篇文章时候,“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大部分都是河南郑州的,一看服务器都是景安网络的服务器,也是醉醉的。