前言
有的时候,网站会受到大量恶意攻击,有的恶意IP还隔三差五来搞你一波,占用服务器资源,影响网站响应速度。
想要屏蔽这些恶意IP,就可以使用iptables、ipset等工具。
IPTABLES
简介
iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的"安全框架"中,这个"安全框架"才是真正的防火墙,这个框架的名字叫netfilter。
netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。
iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。而我们就可以通过iptables屏蔽一些IP。
基本操作
服务器默认安装iptables,可以使用如下指令查看iptables版本。
1 | iptables -V |
如果想查阅iptables的帮助文档,可以使用如下指令。
1 | iptables --help |
如果屏蔽了IP,或者做了其他更改,可以通过如下指令查看当前防火墙配置规则。
1 | iptables -L -n |
在Linux中,可以很简单地用iptables框架禁止IP地址:
1 | iptables -I INPUT -s ***.***.***.*** -j DROP |
***.***.***.***为恶意IP地址,如果没有报错,说明添加成功。使用iptables -L -n指令查看配置情况:
如上图所示,我的个人网站目前一共屏蔽了7个恶意IP。如果屏蔽错了,或者想将屏蔽的IP放出来,怎么操作?
1 | iptables -D INPUT -s ***.***.***.*** -j DROP |
使用上述指令,即可将屏蔽的IP释放出来。
后面的DROP是处理动作,表示直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
除此之外还有:
- ACCEPT:允许数据包通过。
- REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
- SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
- MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
- DNAT:目标地址转换。
- REDIRECT:在本机做端口映射。
- LOG::在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。
屏蔽IP,只需要用到DROP和REJECT就行。
如果你愿意,你可以保存iptables的配置到一个文件中:
1 | iptables-save > ip.rule |
可以使用如下指令恢复规则:
1 | iptables-restore < ip.rule |
防火墙操作:
1 2 3 | 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上安装:
1 | sudo apt-get install ipset |
Fedora或者CentOS/RHEL 7上安装:
1 | sudo yum install ipset |
基本操作
让我通过简单的示例告诉你该如何使用ipset命令。
首先,让我们创建一条新的IP集,名为banlist(名字任意):
1 | ipset create banlist hash:net |
第二个参数(hash:net)是必须的,代表的是集合的类型。IP集有多个类型。hash:net类型的IP集使用哈希来存储多个CIDR块。如果你想要在一个集合中存储单独的IP地址,你可以使用hash:ip类型。
一旦创建了一个IP集之后,你可以用下面的命令来检查:
这显示了一个可用的IP集合列表,并有包含了集合成员的详细信息。默认上,每个IP集合可以包含65536个元素(这里是CIDR块)。你可以通过追加"maxelem N"选项来增加限制。
1 | ipset create banthis hash:net maxelem 1000000 |
现在让我们来增加IP到这个集合中:
1 | ipset add banlist 203.171.228.159 |
你会看到集合成员已经改变了。
如果想要从集合中删除这个IP:
1 | ipset del banlist 203.171.228.159 |
现在是时候去创建一个使用IP集的iptables规则了。这里的关键是使用"-m set --match-set "选项。
现在让我们创建一条让之前那些IP块不能通过80端口访问web服务的iptable规则。可以通过下面的命令:
1 | iptables -I INPUT -m set --match-set banlist src -p tcp --destination-port 80 -j DROP |
如果你愿意,你可以保存特定的IP集到一个文件中,以后可以从文件中还原:
1 2 3 | 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:
1 | pip install iblocklist2ipset |
pip是python管理包的工具,一般服务器自带,无需安装。
在一些发行版如Fedora,你可能需要运行:
1 | python-pip install iblocklist2ipset |
现在到iblocklist.com,抓取任何一个P2P列表的URL(比如"level1"列表)。
粘帖URL到下面的命令中。
1 | iblocklist2ipset generate --ipset banthis "http://list.iblocklist.com/?list=ydxerpxkpcfqjaybcssw&fileformat=p2p&archiveformat=gz" banlist.txt |
上面的命令运行之后,你会得到一个名为banlist.txt的文件。如果查看它的内容,你会看到像这些:
1 2 3 4 5 6 7 8 | create banlist hash:net family inet hashsize 131072 maxelem 237302 add banlist 1.2.4.0/24 add banlist 1.2.8.0/24 add banlist 1.9.75.8/32 add banlist 1.9.96.105/32 add banlist 1.9.102.251/32 add banlist 1.9.189.65/32 add banlist 1.16.0.0/14 |
你可以用下面的ipset命令来加载这个文件:
1 | ipset restore -f banlist.txt |
现在可以查看自动创建的IP集:
1 | ipset list banlist |
在写这篇文章时候,“level1”类表包含了237,000个屏蔽的IP列表。你可以看到很多IP地址已经加入到IP集中了。
最后,创建一条iptables命令来屏蔽这些坏蛋!
1 | iptables -I INPUT -m set --match-set banlist src -p tcp --destination-port 80 -j DROP |
总结
屏蔽IP难免带来误伤,所以可以周期性释放,比如定期把已经加入关黑名单一周的IP释放出来,再犯规再给送进去。
我的网站,攻击者IP大部分都是河南郑州的,一看服务器都是景安网络的服务器,也是醉醉的。
2018年12月3日 下午9:40 沙发
哈哈哈哈哈 加油!要一直和这些坏人斗智斗勇!!!
2018年12月3日 下午9:45 1层
@Ariel 很好用,哈哈。
2019年6月20日 下午4:47 板凳
崔老大好,最近学习wordpress技术找到了您的网站,看您的网站排版设计非常完美,同时在这里学了很多wp技术,感谢感谢!
另外,我在本地搭建的网站,很多布局和框架借鉴了您的这个网站,也是用的知更鸟主题,但是里面的内容准备是自己写的关于技术方面的学习(这个绝对和您的不同),您看没什么大的问题吧,先谢谢您了。
2019年6月20日 下午5:02 1层
@captain777 这个没有问题的,感谢支持啦~
2020年2月16日 上午8:28 地板
一般备份整个网站通过什么方式呢?备份磁盘文件和导出数据库脚本,还是停机备份镜像呢?
2020年2月16日 上午9:20 1层
@小熊 备份镜像最方便了吧,我是阿里云有自动定时备份功能的。