0
点赞
收藏
分享

微信扫一扫

深入理解 ipset:高效管理大规模 IP 列表的神器

深入理解 ipset:高效管理大规模 IP 列表的神器

在日常运维中,服务器需要管理大量的 IP 地址访问权限。直接使用 iptables 添加大量规则,不仅影响性能,还难以动态管理。针对这种情况,ipset 提供了一种高效解决方案。今天我们就详细介绍 ipset 的原理、功能,以及如何结合实际场景配置和使用。

什么是 ipset?

ipset 是 Linux 内核提供的一种高效的数据存储和查询工具,它专为管理大规模 IP 地址设计。它和 iptables 配合使用,可以将大量的 IP 地址或网段组织成集合,并快速匹配,避免逐条检查规则的性能开销。

核心概念:

  • 集合(set): 存储 IP 地址、网络、端口或 MAC 地址等元素的容器。
  • 高性能: 查询和管理集合时速度极快,尤其在大规模规则下性能优越。

ipset 的主要优势

  1. 高效:
  • ipset 在内核中通过哈希表或位图实现,查询和操作的时间复杂度接近 O(1),显著优于逐条遍历的 iptables
  1. 动态性:
  • 无需重新加载 iptables 规则即可动态修改集合内容。
  1. 灵活性:
  • 支持单个 IP 地址、子网、IP 与端口组合等多种数据格式。
  1. 减少规则复杂度:
  • 一个 iptables 规则可以引用整个集合,简化配置。

ipset 的集合类型

集合类型

描述

示例

hash:ip

存储单个 IP 地址

192.168.1.1

hash:net

存储子网

192.168.1.0/24

hash:ip,port

存储 IP 和端口组合

192.168.1.1,tcp:80

hash:mac

存储 MAC 地址

00:1A:2B:3C:4D:5E

list:set

存储其他 ipset 集合的名称(嵌套集合)

子集合的名称

安装和启动 ipset

ipset 是大部分 Linux 发行版的默认软件包,安装非常简单:

CentOS/RHEL

sudo yum install ipset -y

Debian/Ubuntu

sudo apt install ipset -y

安装完成后,启动并设置开机自启:

sudo systemctl start ipset
sudo systemctl enable ipset

ipset 的基本操作

以下是一些常用的 ipset 操作示例:

1. 创建集合

创建一个存储单个 IP 地址的集合:

sudo ipset create my_blacklist hash:ip

2. 添加 IP 地址

将 IP 地址添加到集合中:

sudo ipset add my_blacklist 192.168.1.100

3. 查看集合内容

列出集合中的所有条目:

sudo ipset list my_blacklist

4. 删除 IP 地址

从集合中移除一个 IP 地址:

sudo ipset del my_blacklist 192.168.1.100

5. 销毁集合

删除整个集合:

sudo ipset destroy my_blacklist

结合 iptables 使用 ipset

ipset 需要与 iptables 配合才能生效。以下是一个完整的示例:

场景:屏蔽特定 IP 地址的访问

1. 创建黑名单集合

sudo ipset create my_blacklist hash:ip

2. 添加 IP 到黑名单

sudo ipset add my_blacklist 203.0.113.1
sudo ipset add my_blacklist 203.0.113.2

3. 配置 iptables 规则 引用黑名单集合,并禁止来源于集合中 IP 的所有流量:

sudo iptables -I INPUT -m set --match-set my_blacklist src -j DROP

4. 验证配置 查看 ipsetiptables 的规则:

sudo ipset list my_blacklist
sudo iptables -L -v

如何检测 ipset 是否正常工作?

  1. 手动测试 IP 通过 pingcurl 测试是否可以访问被封禁的 IP 地址。
  2. 动态添加条目测试 在运行中动态向集合添加新的 IP,确认是否立即生效。
  3. 网络分析工具 使用 tcpdumpnetstat 检查流量是否被正确过滤。

适用场景

1. 黑名单管理
  • 快速屏蔽恶意 IP 地址,例如恶意访问的来源 IP 或垃圾流量。
2. 白名单管理
  • 允许一组 IP 地址访问敏感服务,比如 API 接口。
3. 动态防护
  • 配合工具(如 fail2ban),动态将异常行为的 IP 地址加入黑名单。
4. 大规模规则场景
  • 当需要管理上千条规则时,ipset 是必备工具。

注意事项和优化建议

  1. 内核支持: 确保内核支持 ipset 模块,可以通过以下命令检查:

lsmod | grep ip_set

如果未加载模块,可手动加载:

sudo modprobe ip_set

  1. 集合大小: 大量 IP 地址时,建议使用合适的哈希大小,避免性能下降:

sudo ipset create large_set hash:ip hashsize 1024 maxelem 65536

  1. 持久化配置: 默认情况下,ipset 的规则在系统重启后会丢失。可以通过以下方式保存和恢复: 保存规则:

sudo ipset save > /etc/ipset.conf

恢复规则:

sudo ipset restore < /etc/ipset.conf

总结

ipset 是一个简单高效的工具,专为解决大规模 IP 地址管理而生。它在性能和易用性上的优势,使其成为服务器运维中不可或缺的一部分。通过动态管理黑白名单、优化 iptables 规则,我们可以轻松应对复杂的网络管理需求。

如果你在使用过程中遇到问题,欢迎在评论区留言,一起交流和探讨!

举报

相关推荐

0 条评论