如何在 Linux 下大量屏蔽恶意 IP 地址
很多情况下,你可能需要在 Linux 下屏蔽 IP 地址。比如,作为一个终端用户,你可能想要免受间谍软件或者 IP 追踪的困扰。或者当你在运行 P2P 软件时。你可能想要过滤反 P2P 活动的网络链接。如果你是一名系统管理员,你可能想要禁止垃圾 IP 地址访问你们的公司邮件服务器。或者你因一些原因想要禁止某些国家访问你的 web 服务。在许多情况下,然而,你的 IP 地址屏蔽列表可能会很快地增长到几万的 IP。该如何处理这个?
Netfilter/IPtables 的问题
在 Linux 中,可以很简单地用 netfilter/iptables 框架禁止 IP 地址:
$ sudo iptables -A INPUT -s 1.1.1.1 -p TCP -j DROP
如果你想要完全屏蔽一个 IP 地址段,你可以用下面的命令很简单地做到:
$ sudo iptables -A INPUT -s 1.1.2.0/24 -p TCP -j DROP
然而,当你有 1000 个独立 IP 地址,且不带 CIDR(无类别域间路由)前缀,你该怎么做?你要有 1000 条 iptable 规则!这显然这并不适于大规模屏蔽。
$ sudo iptables -A INPUT -s 1.1.1.1 -p TCP -j DROP $ sudo iptables -A INPUT -s 2.2.2.2 -p TCP -j DROP $ sudo iptables -A INPUT -s 3.3.3.3 -p TCP -j DROP . . . .
什么是 IP 集?
这时候就是 IP 集 登场了。IP 集是一个内核特性,它允许多个(独立)IP 地址、MAC 地址或者甚至是端口号被编码和有效地存储在位图/哈希内核数据结构中。一旦 IP 集创建之后,你可以创建一条 iptables 规则来匹配这个集合。
你马上就会看见 IP 集合的好处了,它可以让你用一条 iptable 规则匹配多个 ip 地址!你可以用多个 IP 地址和端口号的方式来构造 IP 集,并且可以动态地更新规则而没有性能影响。
在 Linux 中安装 IPset 工具
为了创建和管理 IP 集,你需要使用称为 ipset 的用户空间工具。
要在 Debian、Ubuntu 或者 Linux Mint 上安装:
$ sudo apt-get install ipset
Fedora 或者 CentOS/RHEL 7 上安装:
$ sudo yum install ipset
使用 IPset 命令禁止 IP
让我通过简单的示例告诉你该如何使用 ipset 命令。
首先,让我们创建一条新的 IP 集,名为 banthis(名字任意):
$ sudo ipset create banthis hash:net
第二个参数(hash:net) 是必须的,代表的是集合的类型。IP 集有 多个类型 。hash:net 类型的 IP 集使用哈希来存储多个 CIDR 块。如果你想要在一个集合中存储单独的 IP 地址,你可以使用 hash:ip 类型。
一旦创建了一个 IP 集之后,你可以用下面的命令来检查:
$ sudo ipset list
这显示了一个可用的 IP 集合列表,并有包含了集合成员的详细信息。默认上,每个 IP 集合可以包含 65536 个元素(这里是 CIDR 块)。你可以通过追加"maxelem N"选项来增加限制。
$ sudo ipset create banthis hash:net maxelem 1000000
现在让我们来增加 IP 块到这个集合中:
$ sudo ipset add banthis 1.1.1.1/32 $ sudo ipset add banthis 1.1.2.0/24 $ sudo ipset add banthis 1.1.3.0/24 $ sudo ipset add banthis 1.1.4.10/24
你会看到集合成员已经改变了。
$ sudo ipset list
现在是时候去创建一个使用 IP 集的 iptables 规则了。这里的关键是使用"-m set --match-set "选项。
现在让我们创建一条让之前那些 IP 块不能通过 80 端口访问 web 服务的 iptable 规则。可以通过下面的命令:
$ sudo iptables -I INPUT -m set --match-set banthis src -p tcp --destination-port 80 -j DROP
如果你愿意,你可以保存特定的 IP 集到一个文件中,以后可以从文件中还原:
$ sudo ipset save banthis -f banthis.txt $ sudo ipset destroy banthis $ sudo ipset restore -f banthis.txt
上面的命令中,我使用了 destory 选项来删除一个已有的 IP 集来看看我是否可以还原它。
自动 IP 地址禁用
现在你应该看到了 IP 集合的强大了。维护 IP 黑名单是一件繁琐和费时的工作。实际上,有很多免费或者收费的服务可以来帮你完成这个。一个额外的好处是,让我们看看如何自动将 IP 黑名单加到 IP 集中。
首先让我们从 iblocklist.com 得到免费的黑名单,这个网站有不同的免费和收费的名单。免费的版本是 P2P 格式。
接下来我要使用一个名为 iblocklist2ipset 的开源 Python 工具来将 P2P 格式的黑名单转化成 IP 集。
首先,你需要安装了 pip(参考 这个指导 来安装 pip)。
使用的下面命令安装 iblocklist2ipset。
$ sudo pip install iblocklist2ipset
在一些发行版如 Fedora,你可能需要运行:
$ sudo python-pip install iblocklist2ipset
现在到 iblocklist.com ,抓取任何一个 P2P 列表的 URL(比如"level1"列表)。
粘帖 URL 到下面的命令中。
$ iblocklist2ipset generate \ --ipset banthis "http://list.iblocklist.com/?list=ydxerpxkpcfqjaybcssw&fileformat=p2p&archiveformat=gz" \ > banthis.txt
上面的命令运行之后,你会得到一个名为 banthis.txt 的文件。如果查看它的内容,你会看到像这些:
create banthis hash:net family inet hashsize 131072 maxelem 237302 add banthis 1.2.4.0/24 add banthis 1.2.8.0/24 add banthis 1.9.75.8/32 add banthis 1.9.96.105/32 add banthis 1.9.102.251/32 add banthis 1.9.189.65/32 add banthis 1.16.0.0/14
你可以用下面的 ipset 命令来加载这个文件:
$ sudo ipset restore -f banthis.txt
现在可以查看自动创建的 IP 集:
$ sudo ipset list banthis
在写这篇文章时候,“level1”类表包含了 237,000 个屏蔽的 IP 列表。你可以看到很多 IP 地址已经加入到 IP 集中了。
最后,创建一条 iptables 命令来屏蔽这些坏蛋!
总结
这篇文章中,我描述了你该如何用强大的 ipset 来屏蔽不想要的 IP 地址。同时结合了第三方工具 iblocklist2ipset,这样你就可以流畅地维护你的 IP 屏蔽列表了。那些对 ipset 的性能提升好奇的人,下图显示了 iptables 在使用和不使用 ipset 的基准测试结果(注意时间坐标轴)。
告诉我你多么喜欢这个。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论