目录

1. 核心命令速查

2. 集合类型

3. 实战案例:使用 ipset 封禁 IP

案例 1:基础黑名单封禁(手动添加)

案例 2:自动过期和解封

案例 3:封禁 IP 和端口组合

案例 4:白名单模式

案例 5:自动化封禁(SSH 暴力破解)

案例 6:自动化封禁(Web 服务 CC 攻击)

案例 7:屏蔽特定国家/地区的 IP 访问

案例 8:动态域名白名单

4. ipset 规则持久化

方法一:使用ipset-service服务

1. 安装与配置

2. 手动保存规则

3. 自动持久化配置

方法二:systemd自定义服务

1. 保存当前规则

2. 创建服务文件

3. 启用服务

方法三:手动恢复(临时/应急)

1. 导出规则

2. 重启后恢复

保存 iptables 规则

6. 注意事项


ipset是Linux系统中一个强大的命令行工具,用于创建、维护和管理一组IP地址、端口号、MAC地址、网络接口或其他网络元素的集合(set)。它通过与防火墙系统(如iptables或nftables)集成,显著提升规则管理的效率和性能。以下是基于其核心特性、功能及实战案例的介绍:

1. 核心命令速查

先通过一个表格快速了解 ipset 的常用命令:

命令示例作用说明
ipset create blacklist hash:ip创建名为 blacklist,类型为 hash:ip 的集合
ipset add blacklist 192.168.2.100向 blacklist 集合添加一个 IP
ipset add blacklist 203.204.205.0/24向 blacklist 集合添加一个网段
ipset del blacklist 192.168.2.100从 blacklist 集合删除一个 IP
ipset list blacklist查看 blacklist 集合的内容
ipset list查看所有集合
ipset flush blacklist清空 blacklist 集合中的所有条目
ipset destroy blacklist彻底销毁 blacklist 集合
ipset save blacklist导出 blacklist 集合的内容
ipset restore -f ipset.txt从文件恢复集合内容

2. 集合类型

ipset 支持多种集合类型,以适应不同的匹配需求:

集合类型存储内容适用场景
hash:ip单个 IP 地址封禁或允许特定的主机
hash:net网络段(CIDR)封禁或允许整个网段
hash:ip,portIP 地址和端口号(如 192.168.8.1,80封禁或允许特定 IP 对特定端口的访问
hash:net,port网络段和端口号(如 203.8.100.0/24,443封禁或允许特定网段对特定端口的访问
hash:ip,port,ipIP、端口、IP(三层结构)更复杂的匹配条件
hash:ip,markIP 和数据包标记与 iptables 的 MARK 动作结合使用
hash:macMAC 地址基于物理地址进行过滤
bitmap:ipIPv4 地址的位图,范围固定适用于较小的、连续的 IP 范围
bitmap:port端口号的位图适用于端口范围
list:set集合的列表嵌套集合,将多个集合组合成一个更大的集合

3. 实战案例:使用 ipset 封禁 IP

案例 1:基础黑名单封禁(手动添加)

这是最直接的场景:手动将可疑 IP 加入黑名单并封禁。

# 1. 创建一个名为 `blacklist` 的 IP 集合,类型为 hash:ip
sudo ipset create blacklist hash:ip# 2. 添加一条 iptables 规则,拒绝所有来自 `blacklist` 集合中 IP 的输入流量
sudo iptables -I INPUT -m set --match-set blacklist src -j DROP# 3. 现在,你可以向黑名单中添加 IP 了
sudo ipset add blacklist 192.168.8.100    # 添加单个 IP
sudo ipset add blacklist 200.10.100.0/24 # 添加整个网段# 4. (可选)检查 blacklist 集合的内容
sudo ipset list blacklist

效果:所有来自 192.168.8.100 和 200.10.100.0/24 网段的流量将被服务器立即丢弃。

案例 2:自动过期和解封

对于临时封禁(例如 SSH 密码尝试失败多次),可以设置超时(timeout),让 IP 自动从黑名单中移除。

# 1. 创建名为 `ssh-ban` 的集合,并设置默认超时时间为 1 小时 (3600 秒)
sudo ipset create ssh-ban hash:ip timeout 3600# 2. 设置 iptables 规则,对 SSH (22端口) 的访问如果来自 `ssh-ban` 集合则拒绝
sudo iptables -I INPUT -p tcp --dport 22 -m set --match-set ssh-ban src -j DROP# 3. 当检测到恶意尝试时,添加 IP,并可以指定不同的超时时间
sudo ipset add ssh-ban 192.168.8.200       # 默认 1 小时后解封
sudo ipset add ssh-ban 198.168.100.55 timeout 7200 # 此 IP 2 小时 (7200秒) 后解封

注意:如果创建集合时没有指定 timeout 参数,则集合中的条目不会自动过期

案例 3:封禁 IP 和端口组合

有时需要封禁某个 IP 对特定服务(端口)的访问,但允许访问其他服务。

# 1. 创建一个类型为 `hash:ip,port` 的集合,用于存储 IP 和端口对
sudo ipset create service-abusers hash:ip,port# 2. 设置 iptables 规则,拒绝访问 `service-abusers` 集合中定义的 IP 和端口组合
sudo iptables -I INPUT -m set --match-set service-abusers src,dst -j DROP# 3. 添加违规的 IP 和端口
sudo ipset add service-abusers 192.0.2.10,80    # 封禁该 IP 访问 80 端口
sudo ipset add service-abusers 198.51.100.20,443 # 封禁该 IP 访问 443 端口
sudo ipset add service-abusers 203.0.113.30,udp:53 # 封禁该 IP 访问 UDP 53 端口

案例 4:白名单模式

ipset 也可以用于创建白名单,只允许特定集合中的 IP 访问。

# 1. 创建一个名为 `whitelist` 的白名单集合,并添加允许的 IP
sudo ipset create whitelist hash:ip
sudo ipset add whitelist 192.0.2.1
sudo ipset add whitelist 203.0.113.5# 2. 设置 iptables 规则:**非白名单即拒绝**
# 注意这里的 `!` 表示取反
sudo iptables -I INPUT -m set ! --match-set whitelist src -j DROP

应用场景:严格限制访问源,例如数据库端口、管理后台等。

案例 5:自动化封禁(SSH 暴力破解)

结合日志分析和 cron 定时任务,实现自动封禁 SSH 暴力破解的 IP。

#!/bin/bash
# 文件名: /root/ban_ssh_abuse.sh
# 监控 /var/log/secure(CentOS/RHEL)或 /var/log/auth.log(Debian/Ubuntu),将多次尝试失败的 IP 加入 ipsetLOG_FILE="/var/log/secure"
FAILED_THRESHOLD=5 # 失败次数阈值
BAN_SET="ssh-ban"   # ipset 集合名,需要预先创建好(带 timeout)# 分析过去一小时的日志,找出失败次数超过阈值的 IP
grep "Failed password" "$LOG_FILE" | awk -v threshold="$FAILED_THRESHOLD" '
{# 提取 IP 地址(根据你的日志格式调整 awk 字段)if (match($0, /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/)) {ip = substr($0, RSTART, RLENGTH)count[ip]++}
}
END {for (ip in count) {if (count[ip] > threshold) {print ip}}
}' | while read -r malicious_ip; do# 将恶意 IP 添加到 ipset 集合中ipset add "$BAN_SET" "$malicious_ip" 2>/dev/null && echo "[$(date)] Banned IP: $malicious_ip"
done

然后,使用 crontab -e 添加定时任务,每 5 分钟运行一次此脚本:

*/5 * * * * /root/ban_ssh_abuse.sh

案例 6:自动化封禁(Web 服务 CC 攻击)

类似地,可以监控 Nginx 或 Apache 日志,封禁请求频率过高的 IP。

#!/bin/bash
# 文件名: /root/ban_http_abuse.shLOG_FILE="/var/log/nginx/access.log"
REQ_THRESHOLD=1000 # 一分钟内请求数阈值
BAN_SET="http-ban"  # ipset 集合名# 分析上一分钟的日志,统计每个 IP 的请求数
DATE=$(date -d '1 minute ago' +%d/%b/%Y:%H:%M)
grep "$DATE" "$LOG_FILE" | awk '{print $1}' | sort | uniq -c | sort -nr | \
while read -r count ip; doif [[ "$count" -gt "$REQ_THRESHOLD" ]]; thenipset add "$BAN_SET" "$ip" 2>/dev/null && echo "[$(date)] Banned IP: $ip (Requests: $count)"fi
done

同样地,设置 cron 任务定时执行(例如每分钟)。

案例 7:屏蔽特定国家/地区的 IP 访问

这个需求很常见,可以利用现成的国家 IP 段列表。

  1. 获取国家的 IP 段列表

    # 例如下载中国的 IP 段(假设我们要创建白名单)
    wget -O cn.zone http://www.ipdeny.com/ipblocks/data/countries/cn.zone
  2. 创建 ipset 集合并导入 IP 段

    # 创建一个 hash:net 类型的集合来存储网络段
    sudo ipset create cn-whitelist hash:net# 将下载的 IP 段添加到集合中
    for i in $(cat cn.zone); dosudo ipset add cn-whitelist "$i"
    done
  3. 设置 iptables 规则

    # 示例:只允许来自中国 IP 段的流量访问 80 和 443 端口
    sudo iptables -A INPUT -p tcp --dport 80 -m set --match-set cn-whitelist src -j ACCEPT
    sudo iptables -A INPUT -p tcp --dport 443 -m set --match-set cn-whitelist src -j ACCEPT
    # 然后设置相应的 DROP 规则(务必谨慎,以免锁自己于服务器之外)

案例 8:动态域名白名单

如果你的服务器需要允许访问一些域名,但这些域名的 IP 可能会变,可以用脚本定期解析并更新 ipset。

#!/bin/bash
# 文件名: /root/update_dynamic_whitelist.shDOMAIN_LIST="api.example.com some-cdn.com"
WHITELIST_SET="dynamic-whitelist"# 清空集合(或者先创建一个临时集,然后交换)
sudo ipset flush "$WHITELIST_SET"for domain in $DOMAIN_LIST; do# 解析域名获取 IPdig +short "$domain" | while read -r ip; doif [[ ! -z "$ip" ]]; thensudo ipset add "$WHITELIST_SET" "$ip"fidone
done

设置 cron 任务定期运行(例如每小时),确保 IP 地址是最新的。

4. ipset 规则持久化

重要提示默认情况下,ipset 规则和 iptables 规则一样,重启后会丢失。必须手动保存和恢复。

方法一:使用ipset-service服务

1. 安装与配置

# CentOS为例
yum install -y   ipset-service  
systemctl enable ipset   --now

2. 手动保存规则

ipset save > /etc/ipset.conf  # 导出规则至配置文件  

3. 自动持久化配置

编辑/etc/sysconfig/ipset-config,确保以下参数启用

IPSET_SAVE_ON_STOP="yes"             # 停止服务时自动保存  
IPSET_SAVE_FILE="/etc/ipset.conf"    # 配置文件路径  

方法二:systemd自定义服务

1. 保存当前规则

ipset save > /etc/ipset.conf  

2. 创建服务文件

vim   /etc/systemd/system/ipset-persistent.service  

内容如下:

[Unit]  
Description=ipset persistent configuration  
Before=network.target  [Service]  
Type=oneshot  
ExecStart=/usr/sbin/ipset restore -f /etc/ipset.conf  
ExecStop=/usr/sbin/ipset  save -f /etc/ipset.conf  
RemainAfterExit=yes  [Install]  
WantedBy=multi-user.target  

3. 启用服务

systemctl daemon-reload  
systemctl enable ipset-persistent --now  

方法三:手动恢复(临时/应急)

1. 导出规则

ipset save > /etc/ipset.conf  

2. 重启后恢复

ipset restore < /etc/ipset.conf  
  • 自动加载可将命令加入/etc/rc.local(确保文件有执行权限)。

保存 iptables 规则

同样,别忘了保存和持久化 iptables 规则。

sudo iptables-save > /etc/iptables/rules.v4 # 对于 IPv4
sudo ip6tables-save > /etc/iptables/rules.v6 # 对于 IPv6
# 然后启用 iptables-persistent 服务,或配置相应机制。

6. 注意事项

  1. 谨慎操作:错误的 iptables 或 ipset 规则可能导致你把自己锁在服务器外面。务必在本地控制台或通过一个不会受规则影响的独立连接(例如管理控制台)上进行操作

  2. 备份规则:在对规则进行重大更改之前,先备份当前的 ipset 和 iptables 规则。

  3. 性能考虑:对于非常庞大的集合(数十万条),hashsize 和 maxelem 参数的初始设置会影响性能和内存使用。根据情况调整。

  4. 组合使用:ipset 通常与 iptables 结合使用,单独使用 ipset 不会产生任何效果。

  5. 列表优化:对于大型的 IP 地址段列表,可以使用 iprange 这样的工具来合并相邻的 IP 范围,有助于减少 ipset 中的条目数量并提升性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/95664.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95664.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/95664.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实例和对象的区别

对象&#xff08;Object&#xff09;是一个概念&#xff0c;它表示“某个类的一个成员”&#xff0c;是“逻辑上的个体”。实例&#xff08;Instance&#xff09;是一个现实&#xff0c;指的是在内存中真正分配了空间的对象。实例一定是对象&#xff0c;但对象不一定是实例。例…

Win10 Chrome认不出新Emoji?两个扩展搞定显示与输入

前言 用Win10电脑在Chrome里发消息、刷网页时&#xff0c;你是否遇到过这样的尴尬&#xff1a;别人发的、或者页面显示的 Emoji&#xff0c;在你屏幕上变成了空白方框&#xff0c;像“文字里缺了一块拼图”&#xff1f;其实这不是Chrome的错&#xff0c;也不用换电脑&#xff0…

Golang中逃逸现象, 变量“何时栈?何时堆?”

目录 什么是栈 什么是堆 栈 vs 堆&#xff08;核心区别&#xff09; GO编译器的逃逸分析 什么是逃逸分析&#xff1f; 怎么看逃逸分析结果&#xff1f; 典型“会逃逸”的场景 闭包捕获局部变量 返回或保存带有“底层存储”的容器 经由接口/反射/fmt 等导致装箱或被长…

MySQL入门指南:从安装到工作原理

什么是MySQL MySQL是一个开源的关系型数据库管理系统&#xff0c;由瑞典MySQL AB公司开发&#xff08;目前属于Oracle公司&#xff09;&#xff0c;被广泛地应用在大中小型网站中 MySQL是一个小型的开源的关系型数据库管理系统&#xff0c;与其他大型数据库管理系统例如&…

dask.dataframe.shuffle.set_index中获取 divisions 的步骤分析

dask.dataframe.shuffle.set_index 中获取 divisions 的步骤分析 主要流程概述 在 set_index 函数中&#xff0c;当 divisionsNone 时&#xff0c;系统需要通过分析数据来动态计算分区边界。这个过程分为以下几个关键步骤&#xff1a; 1. 初始检查和准备 if divisions is None:…

ai生成ppt工具有哪些?10款主流AI生成PPT工具盘点

随着人工智能技术的飞速发展&#xff0c;AI生成PPT工具逐渐成为职场人士、学生和创作者提升效率的得力助手。这类工具通过智能算法&#xff0c;能够快速将文本、数据或创意转化为结构化、视觉化的演示文稿&#xff0c;大幅节省设计时间。1、AiPPT星级评分&#xff1a;★★★★★…

Qt多线程编程学习

Qt多线程编程学习 1. 项目概述 本项目展示了Qt中多线程编程的基本用法&#xff0c;通过继承QThread类创建自定义线程&#xff0c;并演示了线程的启动、执行和销毁过程。项目包含一个简单的用户界面&#xff0c;用户可以通过按钮控制线程的启动和结束。 1.1 项目结构 项目包含以…

加密货币武器化:恶意npm包利用以太坊智能合约实现隐蔽通信

ReversingLabs研究人员发现两个恶意npm包利用以太坊&#xff08;Ethereum&#xff09;智能合约隐藏并传播恶意软件。这两个名为colortoolsv2和mimelib2的软件包于2025年7月被识别&#xff0c;展现了开源安全攻防战中的新战术。恶意软件包伪装成实用工具攻击活动始于7月7日发布的…

Spring Boot 全局字段处理最佳实践

在日常开发中&#xff0c;我们总会遇到一些琐碎但又无处不在的字段处理需求&#xff1a;• 请求处理: 用户提交的表单&#xff0c;字符串前后带了多余的空格&#xff0c;需要手动 trim()。• 响应处理: 返回给前端的 BigDecimal 金额&#xff0c;因为精度问题导致JS处理出错&am…

三坐标测量机在汽车制造行业中的应用

在汽车制造业中&#xff0c;零部件精度决定着整车性能。从发动机活塞的微米级公差&#xff0c;到车身焊接的毫米级间隙&#xff0c;汽车制造“差之毫厘&#xff0c;谬以千里” &#xff0c;任何细微偏差都可能引发连锁反应&#xff1a;发动机抖动、异响、油耗飙升&#xff0c;车…

机床夹具设计 +选型

机床夹具设计—第2组&#xff08;钻床夹具&#xff09;仿真组装视频_哔哩哔哩_bilibili 夹具-商品搜索-怡合达一站式采购平台 米思米FA标准品电子目录new 可能要吧这些定位块单独用yolo训练一边才能搞识别分析 3长条一短销定位&#xff0c;黄色的用来夹紧 一个面加一短轴一棱…

表格识别技术:通过计算机视觉和OCR,实现非结构化表格向结构化数据的转换,推动数字化转型。

在日常工作和生活中&#xff0c;我们无处不在与表格打交道。从财务报表、发票收据&#xff0c;到科研论文中的数据表、医疗报告&#xff0c;表格以其清晰、结构化的方式&#xff0c;承载着大量关键信息。然而&#xff0c;当这些表格以纸质或图片等非结构化形式存在时&#xff0…

Go基础(②Viper)

Viper 读取配置创建一个配置文件 config.yamlserver:port: 8080timeout: 30 # 超时时间&#xff08;秒&#xff09; database:host: "localhost"user: "root"password: "123456"name: "mydb"然后用 Viper 读取这个配置&#xff0c;代…

kafka Partition(分区)详解

一、什么是 PartitionPartition&#xff08;分区&#xff09; 是 Kafka Topic&#xff08;主题&#xff09; 的最小并行单位。一个 Topic 可以包含多个 Partition&#xff0c;每个 Partition 底层对应一个有序、不可变的消息队列&#xff0c;消息只会顺序追加。Partition 内部消…

中创中间件适配HGDB

文章目录环境文档用途详细信息环境 系统平台&#xff1a;Microsoft Windows (64-bit) 10 版本&#xff1a;5.6.5 文档用途 本文章主要介绍中创中间件简单适配HGDB。 详细信息 一、数据源配置 1.数据库准备 &#xff08;1&#xff09;安装HGDB并创建一个名为myhgdb的数据…

服务器内存和普通计算机内存在技术方面有什么区别?

服务器内存和普通计算机内存在技术上的区别&#xff0c;主要体现在为满足不同工作场景和要求而采用的设计和特性上。下面这个表格汇总了它们的主要技术差异&#xff0c;方便你快速了解&#xff1a; ​技术特性​​服务器内存​​普通计算机内存​​错误校验 (ECC)​​支持ECC(…

哪款AI生成PPT工具对职场新人最友好?操作门槛最低的是哪个?

一句话生成专业PPT&#xff0c;职场新人也能轻松做出高质量演示文稿现代职场节奏快&#xff0c;PPT制作已成为必备技能。然而&#xff0c;职场新人常面临两大挑战&#xff1a;缺乏设计经验&#xff0c;以及需要在有限时间内完成高质量演示。传统PPT制作耗时费力&#xff0c;需梳…

1.注解的力量:Spring Boot如何用注解重构IoC容器

文章目录1.1 IoC容器&#xff1a;Spring的智能管家1.2 注解驱动&#xff1a;给管家下指令1.2.1 SpringBootApplication&#xff1a;总管家的聘书1.2.2 组件注解&#xff1a;员工的身份标识1.2.3 Autowired&#xff1a;依赖注入的三种方式1.2.4 Bean注解&#xff1a;手动招聘特殊…

【算法】92.翻转链表Ⅱ--通俗讲解

一、题目是啥?一句话说清 给你一个链表和两个整数 left 和 right,反转从第 left 个节点到第 right 个节点的子链表,并返回反转后的链表。其他部分保持不变。 示例: 输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5](反转了从第2到第4个节点) 二、解题…

Nature子刊:新发现!深层脑网络中发现强迫症症状的神经生物标志物

强迫症&#xff08;OCD&#xff09;是一种令人困扰的精神疾病&#xff0c;患者常常被强迫思维和强迫行为所困扰。例如&#xff0c;有些人会反复洗手&#xff0c;无法控制自己的清洁冲动&#xff1b;还有些人会不断检查门窗是否关好&#xff0c;即便他们已经确认过无数次。这些行…