网站维护:利用iptables和ipset屏蔽恶意IP的访问
网站维护:利用iptables和ipset屏蔽恶意IP的访问
教程中心 · 01-04 15:49 · 225阅读
前言
有的时候,网站会受到大量恶意攻击,有的恶意IP还隔三差五来搞你一波,占用服务器资源,影响网站响应速度。

网站维护:利用iptables和ipset屏蔽恶意IP的访问

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

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

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

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

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

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

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

Shell
iptables -L -n
1
iptables -L -n
在Linux中,可以很简单地用iptables框架禁止IP地址:

Shell
iptables -I INPUT -s ***.***.***.*** -j DROP
1
iptables -I INPUT -s ***.***.***.*** -j DROP
***.***.***.***为恶意IP地址,如果没有报错,说明添加成功。使用iptables -L -n指令查看配置情况:

网站维护:利用iptables和ipset屏蔽恶意IP的访问

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

Shell
iptables -D INPUT -s ***.***.***.*** -j DROP
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的配置到一个文件中:

Shell
iptables-save > ip.rule
1
iptables-save > ip.rule
可以使用如下指令恢复规则:

Shell
iptables-restore < ip.rule
1
iptables-restore < ip.rule
防火墙操作:

Shell
systemctl start firewalld
systemctl stop firewalld
systemctl restart firewalld
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上安装:

Shell
sudo apt-get install ipset
1
sudo apt-get install ipset
Fedora或者CentOS/RHEL 7上安装:

Shell
sudo yum install ipset
1
sudo yum install ipset
基本操作
让我通过简单的示例告诉你该如何使用ipset命令。

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

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

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

网站维护:利用iptables和ipset屏蔽恶意IP的访问

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

Shell
ipset create banthis hash:net maxelem 1000000
1
ipset create banthis hash:net maxelem 1000000
现在让我们来增加IP到这个集合中:

Shell
ipset add banlist 203.171.228.159
1
ipset add banlist 203.171.228.159
你会看到集合成员已经改变了。

网站维护:利用iptables和ipset屏蔽恶意IP的访问

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

Shell
ipset del banlist 203.171.228.159
1
ipset del banlist 203.171.228.159
现在是时候去创建一个使用IP集的iptables规则了。这里的关键是使用"-m set --match-set "选项。

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

Shell
iptables -I INPUT -m set --match-set banlist src -p tcp --destination-port 80 -j DROP
1
iptables -I INPUT -m set --match-set banlist src -p tcp --destination-port 80 -j DROP
如果你愿意,你可以保存特定的IP集到一个文件中,以后可以从文件中还原:

Shell
ipset save banlist -f banlist.txt
ipset destroy banlist
ipset restore -f banlist.txt
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:

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

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

Shell
python-pip install iblocklist2ipset
1
python-pip install iblocklist2ipset
现在到iblocklist.com,抓取任何一个P2P列表的URL(比如"level1"列表)。

网站维护:利用iptables和ipset屏蔽恶意IP的访问

粘帖URL到下面的命令中。

Shell
iblocklist2ipset generate --ipset banthis "http://list.iblocklist.com/?list=ydxerpxkpcfqjaybcssw&fileformat=p2p&archiveformat=gz" banlist.txt
1
iblocklist2ipset generate --ipset banthis "http://list.iblocklist.com/?list=ydxerpxkpcfqjaybcssw&fileformat=p2p&archiveformat=gz" banlist.txt
上面的命令运行之后,你会得到一个名为banlist.txt的文件。如果查看它的内容,你会看到像这些:

Shell
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
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命令来加载这个文件:

Shell
ipset restore -f banlist.txt
1
ipset restore -f banlist.txt
现在可以查看自动创建的IP集:

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

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

Shell
iptables -I INPUT -m set --match-set banlist src -p tcp --destination-port 80 -j DROP
1
iptables -I INPUT -m set --match-set banlist src -p tcp --destination-port 80 -j DROP
总结
屏蔽IP难免带来误伤,所以可以周期性释放,比如定期把已经加入关黑名单一周的IP释放出来,再犯规再给送进去。

我的网站,攻击者IP大部分都是河南郑州的,一看服务器都是景安网络的服务器,也是醉醉的。
全部回复 0 条
爱你 抱抱 不活了 不要 超人 大哭 嗯嗯 发呆 飞呀 奋斗 尴尬 感动 害羞 嘿咻 画圈圈 惊吓 敬礼 快跑 路过 抢劫 杀气 上吊 调戏 跳舞 万岁 我走了 喜欢 吓死人 嚣张 疑问 做操