如何使用iptables和ipset屏蔽恶意IP的访问

目录
文章目录隐藏
  1. IPTABLES
  2. IPSET
  3. 自动 IP 地址禁用
  4. 总结

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

使用 iptables 和 ipset 屏蔽恶意 IP 的访问

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

IPTABLES

简介

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

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

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

基本操作

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

iptables -V

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

iptables --help

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

iptables -L -n

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

iptables -I INPUT -s ***.***.***.*** -j DROP

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

使用 iptables -L -n 指令查看配置情况

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

iptables -D INPUT -s ***.***.***.*** -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 集之后,你可以用下面的命令来检查:

如何使用 ipset 命令

这显示了一个可用的 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 规则。可以通过下面的命令:

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

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

ipset save banlist -f banlist.txt
ipset destroy banlist
ipset restore -f banlist.txt

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

自动 IP 地址禁用

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

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

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

使用的下面命令安装 iblocklist2ipset:

pip install iblocklist2ipset

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

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

python-pip install iblocklist2ipset

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

抓取任何一个 P2P 列表的 URL

粘帖 URL 到下面的命令中。

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

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

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

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 释放出来,再犯规再给送进去。

「点点赞赏,手留余香」

3

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
码云笔记 » 如何使用iptables和ipset屏蔽恶意IP的访问

发表回复