0x00 前言

使用 iptables 封 IP,是一种比较简单的应对网络攻击的方式,也算是比较常见。有时候可能会封禁成千上万个 IP,如果添加成千上万条规则,在一台注重性能的服务器或者本身性能就很差的设备上,这就是个问题了。ipset 就是为了避免这个问题而生的。

关于 iptables ,要知道下面两点:

  • iptables 包含几个表,每个表由链组成。默认的是 filter 表,最常用的也是 filter 表,另一个比较常用的是 nat 表。一般封 IP 就是在 filter 表的 INPUT 链添加规则。

  • 在进行规则匹配时,是从规则列表中从头到尾一条一条进行匹配。

    这像是在链表中搜索指定节点费力。ipset 提供了把这个 O(n) 的操作变成 O(1) 的方法:就是把要处理的 IP 放进一个集合,对这个集合设置一条 iptables 规则。像 iptable 一样,IP sets 是 Linux 内核中的东西,ipset 这个命令是对它进行操作的一个工具。

0x01 最基础的用法

假设我们的 nginx 服务器正遭受一批恶意 IP 攻击,攻击方式比较明显,我们除了可以在应用层(即 Nginx 上做一些规则来防御)还可以在网络层封禁这些 IP。网络流传的方法都是通过读取 nginx 日志分析恶意 IP 然后添加到 iptables ,分析恶意 IP 的方法暂时不在这篇文章探讨,我们这里仅仅对封禁 IP 的方式进行改良。

创建一个 ipset 集合

ipset create attack hash:ip

上面的命令会创建一个名为 attack ,hash 值为 ip 的集合,这个集合用来存储收到的恶意 IP 。

添加 iptables 规则

iptables -I INPUT -m set --match-set attack src -p tcp --dport 80 -j DROP

上面的命令就是在 INPUT 链插入一条新规则,该规则匹配源地址为 attack 集合,目标端口为 80, 协议为 tcp 的数据包,执行丢弃数据包的动作。

0x02 进一步了解 ipset