ipset-access: 使用 Linux 内核 ipsets 实现零延迟 IP 阻止 (v2)
需要 GetPageSpeed NGINX Extras 订阅的专业计划(或更高)。
安装
您可以在任何基于 RHEL 的发行版中安装此模块,包括但不限于:
- RedHat Enterprise Linux 7、8、9 和 10
- CentOS 7、8、9
- AlmaLinux 8、9
- Rocky Linux 8、9
- Amazon Linux 2 和 Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-ipset-access
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-ipset-access
通过在 /etc/nginx/nginx.conf 顶部添加以下内容来启用模块:
load_module modules/ngx_http_ipset_access.so;
本文档描述了 nginx-module-ipset-access v2.0.9,于 2025 年 12 月 20 日发布。
企业级基于 IP 的 NGINX 访问控制,使用 Linux ipset。阻止威胁、限制滥用者的速率、挑战机器人,并保护您的基础设施。
⚠️ 商业软件 这是一个闭源的高级模块,仅通过 GetPageSpeed Repository 提供。
✨ 特性
核心特性
| 特性 | 描述 |
|---|---|
| 白名单/黑名单 | 根据 ipset 成员身份允许或拒绝 |
| 多个 ipsets | 在一个指令中检查多个 ipsets |
| 实时更新 | 修改 ipsets 而无需重新加载 NGINX |
| 自定义状态码 | 阻止时返回任何 HTTP 状态 |
性能特性
| 特性 | 描述 |
|---|---|
| 每线程会话 | 线程本地的 libipset 会话消除锁竞争 |
| LRU 缓存 | 具有可配置 TTL 的共享内存缓存 |
| 缓存命中率 | 通常 95%+ 的命中率减少内核调用 |
安全特性
| 特性 | 描述 |
|---|---|
| 速率限制 | 在可配置窗口内限制每个 IP 的请求 |
| 自动禁用 | 自动将速率限制违规者加入黑名单 |
| JS 挑战 | 工作量证明挑战阻止自动化机器人 |
| 蜜罐陷阱 | 自动黑名单访问陷阱 URL 的 IP |
| 条目超时 | 自动过期黑名单条目 |
操作特性
| 特性 | 描述 |
|---|---|
| 干运行模式 | 测试配置而不阻止 |
| 失败开放/关闭 | 控制 ipset 错误时的行为 |
| Prometheus 指标 | 用于 Grafana 的原生 /metrics 端点 |
| JSON 统计 | 详细统计 API |
| NGINX 变量 | $ipset_result 和 $ipset_matched_set |
🚀 快速开始
1. 创建 ipsets
## 创建黑名单
sudo ipset create bad_guys hash:ip timeout 86400
## 创建速率限制禁用列表
sudo ipset create ratelimited hash:ip timeout 1800
## 创建蜜罐陷阱列表
sudo ipset create honeypot hash:ip timeout 86400
2. 配置 NGINX
load_module modules/ngx_http_ipset_access_module.so;
http {
server {
listen 80;
# 阻止已知的恶意 IP
ipset_blacklist bad_guys;
# 速率限制:每分钟 100 个请求
ipset_ratelimit rate=100 window=60s autoban=ratelimited;
# 您的内容
location / {
root /var/www/html;
}
# 蜜罐陷阱 - 默认返回 404
location /wp-admin.php {
ipset_autoadd honeypot timeout=86400;
}
# 指标端点
location /metrics {
ipset_metrics;
allow 127.0.0.1;
deny all;
}
}
}
3. 测试并重新加载
sudo nginx -t && sudo nginx -s reload
📦 安装
此模块仅通过 GetPageSpeed Premium Repository 提供。
第 1 步:订阅 GetPageSpeed Repository
访问 GetPageSpeed Repository Subscription 以获取访问权限。
第 2 步:安装 Repository
## RHEL/CentOS/Rocky/Alma Linux 8+
sudo dnf install https://extras.getpagespeed.com/release-latest.rpm
第 3 步:安装模块
sudo dnf install nginx-module-ipset-access
第 4 步:启用模块
在任何 http {} 块之前添加到 /etc/nginx/nginx.conf:
load_module modules/ngx_http_ipset_access_module.so;
第 5 步:重新加载 NGINX
sudo nginx -t && sudo systemctl reload nginx
📖 配置参考
访问控制
ipset_blacklist set1 [set2 ...]
上下文: http, server
默认: —
如果客户端 IP 出现在 任何 列出的 ipsets 中,则阻止请求。多个 ipsets 按顺序检查,直到找到匹配项。
## 单个集合
ipset_blacklist bad_guys;
## 多个集合(OR 逻辑 - 如果在任何集合中被阻止)
ipset_blacklist spammers hackers tor_exits;
## 禁用
ipset_blacklist off;
ipset_whitelist set1 [set2 ...]
上下文: http, server
默认: —
仅当客户端 IP 至少出现在列出的一个 ipsets 中时,才允许请求。所有其他 IP 都会被拒绝。
## 仅允许受信任的 IP
ipset_whitelist trusted_partners office_ips;
重要: 白名单 IP 会绕过 所有 模块限制,包括:
- 速率限制 (ipset_ratelimit)
- JavaScript 挑战 (ipset_challenge)
这对于不应受速率限制或挑战的管理员 IP 很有用:
## 管理员 IP 绕过速率限制和挑战
ipset_whitelist admin_ips;
ipset_ratelimit rate=100 window=1m autoban=ratelimited ban_time=1800;
ipset_challenge on;
ipset_status code
上下文: http, server
默认: 403
请求被阻止时返回的 HTTP 状态码。
ipset_status 403; # 禁止(默认)
ipset_status 444; # 关闭连接而不响应(NGINX 特殊)
ipset_status 429; # 请求过多
ipset_status 503; # 服务不可用
缓存与性能
ipset_cache_ttl time
上下文: http, server
默认: 60s
缓存 ipset 查找结果的时间。缓存结果避免对同一 IP 的重复内核调用。
ipset_cache_ttl 30s; # 30 秒
ipset_cache_ttl 5m; # 5 分钟
ipset_cache_ttl 1h; # 1 小时
调试说明: 如果您从 ipset 中删除一个 IP,但模块仍报告其为“匹配”,这是由于缓存。缓存结果将在配置的 TTL 过期后失效。为了在测试期间立即生效,您可以暂时设置 ipset_cache_ttl 0; 来禁用缓存(由于性能影响,不建议在生产中使用)。
性能影响:
- 更高的 TTL = 更好的性能,但反映 ipset 更改的速度较慢
- 更低的 TTL = 对 ipset 更改反应更快,但更多的内核调用
- 推荐:对于大多数用例,设置为 30s 到 5m
ipset_fail_open on|off
上下文: http, server
默认: off
控制 ipset 查找失败时的行为(例如,集合不存在)。
ipset_fail_open off; # 错误时拒绝(安全,默认)
ipset_fail_open on; # 错误时允许(可用但风险较高)
ipset_dryrun on|off
上下文: http, server
默认: off
启用时,记录将被阻止的内容,但实际上不阻止。非常适合在生产中测试新规则。
ipset_dryrun on; # 记录但不阻止
检查日志以获取类似的消息:
ipset: DRYRUN would block 1.2.3.4 (matched: bad_guys)
重要: 在干运行模式下使用 $ipset_result 和 $ipset_matched_set 变量时,这些值反映的是请求处理时的 时间点 状态,而不是 ipset 的当前状态。如果您稍后手动检查 ipset 而未找到该 IP,可能的原因包括:
- 超时过期:该 IP 是在超时(例如,
timeout=86400)下添加的,并且已经过期 - 缓存延迟:模块缓存查找结果(默认 60s)。从 ipset 中删除的条目可能仍会显示为“匹配”,直到缓存过期
- 手动删除:某人或某物(fail2ban、脚本)删除了该条目
这是预期的行为——干运行向您展示了请求时生产环境的确切情况。
速率限制
ipset_ratelimit parameters
上下文: http, server
默认: —
在时间窗口内限制每个 IP 的请求。可以自动将违规者添加到 ipset。
参数:
| 参数 | 必需 | 描述 |
|---|---|---|
rate=N |
是 | 每个窗口的最大请求数 |
window=TIME |
否 | 时间窗口(默认:60s) |
autoban=SET |
否 | 添加违规者的 ipset |
ban_time=N |
否 | 自动过期的秒数(默认:3600) |
示例:
## 基本:每分钟 100 个请求
ipset_ratelimit rate=100;
## 自定义窗口:每小时 1000 个请求
ipset_ratelimit rate=1000 window=1h;
## 自动禁用:将违规者添加到 ipset 30 分钟
ipset_ratelimit rate=60 window=1m autoban=ratelimited ban_time=1800;
## 严格的 API 保护
ipset_ratelimit rate=10 window=1s autoban=api_abusers ban_time=3600;
工作原理:
1. 每个 IP 获得一个请求计数器和窗口开始时间
2. 每次请求时计数器递增
3. 当窗口过期时,计数器重置
4. 如果计数器超过 rate,则返回 429 Too Many Requests
5. 如果设置了 autoban,则将 IP 添加到指定的 ipset
注意: 速率限制状态存储在共享内存中,并在工作进程重启时保持。
JavaScript 挑战
ipset_challenge on|off
上下文: http, server
默认: off
启用 JavaScript 挑战模式。浏览器必须解决工作量证明难题才能访问网站。对自动化机器人和抓取工具有效。
ipset_challenge on;
工作原理:
1. 第一个请求接收挑战页面(HTTP 503)
2. 浏览器执行 JavaScript 解决哈希难题
3. 解决方案存储在 cookie 中(_ipset_verified)
4. 后续请求带有有效 cookie 的通过
5. cookie 在 24 小时后过期
ipset_challenge_difficulty level
上下文: http, server
默认: 2
控制挑战难度(1-8)。更高 = 更长的解决时间。
| 级别 | 近似解决时间 |
|---|---|
| 1 | ~100ms |
| 2 | ~500ms (默认) |
| 3 | ~1 秒 |
| 4 | ~2 秒 |
| 5 | ~5 秒 |
| 6+ | ~10+ 秒 |
ipset_challenge on;
ipset_challenge_difficulty 3; # ~1 秒解决时间
挑战页面特性: - 现代、响应式设计 - 动画加载指示器 - 进度反馈 - 成功后自动重定向 - 无外部依赖
蜜罐自动添加
ipset_autoadd setname [timeout=seconds] [status=code]
上下文: server, location
默认: —
当访问该位置并返回 HTTP 状态码时,自动将客户端 IP 添加到指定的 ipset。非常适合蜜罐陷阱。
参数:
| 参数 | 必需 | 描述 |
|---|---|---|
| setname | 是 | 目标 ipset 名称 |
timeout=N |
否 | 条目超时(秒) |
status=N |
否 | 返回的 HTTP 状态码(默认:404) |
示例:
## 基本:添加到蜜罐集合并返回 404(默认)
location /config.php {
ipset_autoadd honeypot;
}
## 带超时:自动过期 24 小时后
location /wp-admin.php {
ipset_autoadd scanners timeout=86400;
}
## 返回 403 禁止而不是 404
location /admin.php {
ipset_autoadd honeypot timeout=86400 status=403;
}
## 返回 429 请求过多
location /api/hack {
ipset_autoadd abusers timeout=3600 status=429;
}
常见蜜罐路径:
## WordPress 陷阱 - 返回 404 以看起来像缺失文件
location ~ ^/(wp-admin\.php|wp-login\.php|xmlrpc\.php)$ {
ipset_autoadd honeypot timeout=86400;
}
## 配置文件陷阱 - 返回 403 以模拟禁止访问
location ~ ^/(\\.env|config\\.php|phpinfo\\.php)$ {
ipset_autoadd honeypot timeout=86400 status=403;
}
## Shell/漏洞陷阱 - 严重,阻止 1 周
location ~ ^/(shell|cmd|eval|exec)\\.php$ {
ipset_autoadd malicious timeout=604800 status=403;
}
注意: 当 IP 被自动添加时,模块立即返回指定的 HTTP 状态码(默认 404),防止进一步的请求处理。连接的保持活动也被禁用,以防止在同一连接上进行进一步请求。
可观察性
ipset_stats
上下文: location
默认: —
启用 JSON 统计端点。
location = /_stats {
ipset_stats;
allow 127.0.0.1;
allow 10.0.0.0/8;
deny all;
}
请参阅 JSON Stats API 以获取响应格式。
ipset_metrics
上下文: location
默认: —
启用 Prometheus 指标端点。
location = /metrics {
ipset_metrics;
allow 127.0.0.1;
allow 10.0.0.0/8;
deny all;
}
请参阅 Prometheus Metrics 以获取可用指标。
📝 NGINX 变量
该模块公开了两个变量,可用于日志记录、头部或条件。
$ipset_result
为该请求做出的访问决策。
| 值 | 描述 |
|---|---|
allow |
请求被允许 |
deny |
请求被阻止 |
dryrun |
将被阻止(干运行模式) |
ratelimited |
超过速率限制 |
challenged |
提供挑战页面 |
$ipset_matched_set
匹配的 ipset 名称(如果有)。如果没有匹配,则为空。
注意: 此变量反映的是 请求时 的匹配状态,而不是 ipset 的当前状态。如果您手动检查 ipset 而未找到该 IP: - 条目可能已过期(ipsets 支持每条目超时) - 模块的缓存(默认 60s)可能显示最近删除的条目仍然匹配 - 可能在请求处理后删除了该条目
使用示例
自定义访问日志:
log_format security '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'ipset_result="$ipset_result" '
'matched_set="$ipset_matched_set"';
access_log /var/log/nginx/security.log security;
添加调试头:
add_header X-IPSet-Result $ipset_result always;
add_header X-IPSet-Matched $ipset_matched_set always;
条件日志记录:
## 仅记录被阻止的请求
map $ipset_result $loggable {
"deny" 1;
default 0;
}
access_log /var/log/nginx/blocked.log combined if=$loggable;
📊 Prometheus 指标
/metrics 端点以 Prometheus 公布格式返回指标。
可用指标
## HELP nginx_ipset_requests_total 处理的总请求数
## TYPE nginx_ipset_requests_total counter
nginx_ipset_requests_total{result="checked"} 1234567
nginx_ipset_requests_total{result="allowed"} 1234000
nginx_ipset_requests_total{result="blocked"} 500
nginx_ipset_requests_total{result="error"} 67
## HELP nginx_ipset_cache_total 缓存操作
## TYPE nginx_ipset_cache_total counter
nginx_ipset_cache_total{result="hit"} 1200000
nginx_ipset_cache_total{result="miss"} 34567
## HELP nginx_ipset_cache_entries 当前缓存条目
## TYPE nginx_ipset_cache_entries gauge
nginx_ipset_cache_entries 5432
## HELP nginx_ipset_autoadd_total 自动添加操作
## TYPE nginx_ipset_autoadd_total counter
nginx_ipset_autoadd_total{result="success"} 42
nginx_ipset_autoadd_total{result="failed"} 3
## HELP nginx_ipset_ratelimit_total 速率限制事件
## TYPE nginx_ipset_ratelimit_total counter
nginx_ipset_ratelimit_total{action="triggered"} 156
nginx_ipset_ratelimit_total{action="autobanned"} 23
## HELP nginx_ipset_challenge_total 挑战事件
## TYPE nginx_ipset_challenge_total counter
nginx_ipset_challenge_total{result="issued"} 1000
nginx_ipset_challenge_total{result="passed"} 950
nginx_ipset_challenge_total{result="failed"} 50
## HELP nginx_ipset_uptime_seconds 模块运行时间
## TYPE nginx_ipset_uptime_seconds gauge
nginx_ipset_uptime_seconds 86400
Grafana 仪表板查询
按结果的请求速率:
rate(nginx_ipset_requests_total[5m])
阻止率:
rate(nginx_ipset_requests_total{result="blocked"}[5m])
缓存命中率:
rate(nginx_ipset_cache_total{result="hit"}[5m]) /
(rate(nginx_ipset_cache_total{result="hit"}[5m]) + rate(nginx_ipset_cache_total{result="miss"}[5m]))
每分钟的速率限制触发:
rate(nginx_ipset_ratelimit_total{action="triggered"}[1m]) * 60
📈 JSON 统计 API
/_stats 端点以 JSON 格式返回详细统计信息。
响应格式
{
"version": "2.0.7",
"uptime_seconds": 86400,
"requests": {
"checked": 1234567,
"allowed": 1234000,
"blocked": 500,
"errors": 67
},
"cache": {
"hits": 1200000,
"misses": 34567,
"entries": 5432,
"hit_rate": 97.20
},
"autoadd": {
"success": 42,
"failed": 3
},
"ratelimit": {
"triggered": 156,
"autobanned": 23
},
"challenge": {
"issued": 1000,
"passed": 950,
"failed": 50
}
}
字段描述
| 字段 | 描述 |
|---|---|
version |
模块版本 |
uptime_seconds |
自模块加载以来的秒数 |
requests.checked |
处理的总请求数 |
requests.allowed |
通过的请求 |
requests.blocked |
被阻止的请求 |
requests.errors |
ipset 查找错误 |
cache.hits |
缓存命中(避免内核调用) |
cache.misses |
缓存未命中(需要内核调用) |
cache.entries |
当前缓存条目 |
cache.hit_rate |
命中率百分比 |
autoadd.success |
成功的蜜罐添加 |
autoadd.failed |
失败的蜜罐添加 |
ratelimit.triggered |
速率限制违规 |
ratelimit.autobanned |
自动添加到禁用列表的 IP |
challenge.issued |
提供的挑战页面 |
challenge.passed |
成功解决的挑战 |
challenge.failed |
挑战失败 |
🏗️ 架构
┌─────────────────────────────────────────────────────────────────────┐
│ 请求流 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 进入请求 │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ 速率限制 │──── 超过? ────▶ 429 + 自动禁用 │
│ │ 检查 │ │
│ └───────┬───────┘ │
│ │ OK │
│ ▼ │
│ ┌───────────────┐ │
│ │ 挑战 │──── 没有 cookie? ────▶ 提供 JS 难题 │
│ │ 检查 │ │
│ └───────┬───────┘ │
│ │ 通过 │
│ ▼ │
│ ┌───────────────┐ ┌─────────────┐ │
│ │ 缓存检查 │────▶│ 命中 │────▶ 使用缓存结果 │
│ └───────┬───────┘ └─────────────┘ │
│ │ 未命中 │
│ ▼ │
│ ┌───────────────┐ │
│ │ ipset 查询 │──── 线程本地的 libipset 会话 │
│ │ (内核) │ │
│ └───────┬───────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ 存储在缓存中 │ │
│ └───────┬───────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ 决策 │──── 黑名单匹配? ────▶ 阻止 (403/444) │
│ │ │──── 白名单未命中? ────▶ 阻止 (403/444) │
│ └───────┬───────┘ │
│ │ 允许 │
│ ▼ │
│ ┌───────────────┐ │
│ │ 蜜罐 │──── 位置匹配? ────▶ 添加到 ipset │
│ │ 检查 │ │
│ └───────┬───────┘ │
│ │ │
│ ▼ │
│ 继续处理 │
│ 内容处理程序 │
│ │
├─────────────────────────────────────────────────────────────────────┤
│ 共享内存 │
│ ┌────────────────┬─────────────────┬─────────────────────────────┐ │
│ │ 统计 │ LRU 缓存 │ 速率限制桶 │ │
│ │ (计数器) │ (IP → 结果) │ (IP → 请求计数) │ │
│ └────────────────┴─────────────────┴─────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
内存布局
| 组件 | 位置 | 目的 |
|---|---|---|
| libipset 会话 | 线程本地 | 每个工作进程的会话以避免锁 |
| 查找缓存 | 共享内存 | IP→结果映射的 LRU 缓存 |
| 速率限制桶 | 共享内存 | 每个 IP 的请求计数器 |
| 统计信息 | 共享内存 | 指标的原子计数器 |
📚 示例
示例 1:基本黑名单
## 创建 ipset
sudo ipset create blacklist hash:ip
sudo ipset add blacklist 1.2.3.4
server {
listen 80;
ipset_blacklist blacklist;
location / {
root /var/www/html;
}
}
示例 2:带速率限制的 API
server {
listen 80;
# 对 API 进行严格的速率限制
ipset_ratelimit rate=100 window=1m autoban=api_banned ban_time=3600;
# 仅允许已知的合作伙伴
ipset_whitelist api_partners;
ipset_status 401;
location /api/ {
proxy_pass http://backend;
}
}
示例 3:完整安全堆栈
server {
listen 80 default_server;
# 第一层:已知威胁
ipset_blacklist malware_ips tor_exits datacenter_ranges;
ipset_status 444;
ipset_cache_ttl 5m;
# 第二层:速率限制
ipset_ratelimit rate=60 window=1m autoban=ratelimited ban_time=1800;
# 第三层:机器人挑战
ipset_challenge on;
ipset_challenge_difficulty 2;
# 实际内容
location / {
root /var/www/html;
}
# 蜜罐陷阱 - 返回 404(默认)以看起来像缺失文件
location ~ ^/(wp-admin|phpmyadmin|admin)\.php$ {
ipset_autoadd honeypot timeout=86400;
}
# 监控
location = /metrics {
ipset_metrics;
allow 10.0.0.0/8;
deny all;
}
}
示例 4:干运行测试
server {
listen 80;
# 测试新规则而不阻止
ipset_blacklist new_threat_list;
ipset_dryrun on;
location / {
root /var/www/html;
}
}
检查日志:
tail -f /var/log/nginx/error.log | grep "DRYRUN"
🔧 故障排除
模块未加载
nginx: [emerg] dlopen() failed
解决方案: 确保 NGINX 是使用 --with-compat 构建的,并且模块是针对相同的 NGINX 版本构建的。
找不到 ipset
ipset: INVALID_SETNAME
解决方案: 在启动 NGINX 之前创建 ipset:
sudo ipset create myset hash:ip
权限被拒绝
ipset: kernel error
解决方案: NGINX 工作进程需要 CAP_NET_ADMIN 权限:
sudo setcap cap_net_admin+ep /usr/sbin/nginx
SELinux 拒绝(RHEL/CentOS/AlmaLinux)
SELinux is preventing /usr/sbin/nginx from getattr access on the netlink_netfilter_socket
解决方案: 安装附带的 SELinux 策略模块:
cd selinux/
sudo ./install.sh
或者手动:
## 验证
semodule -l | grep nginx_ipset
该策略允许 httpd_t(NGINX 的 SELinux 域)使用 libipset 所需的 netlink_netfilter 套接字。
高内存使用
解决方案: 减少缓存 TTL 或限制共享内存配置中的缓存大小。
速率限制未生效
解决方案: 确保自动禁用的 ipset 存在并支持超时:
sudo ipset create ratelimited hash:ip timeout 3600
日志显示“matched=setname”,但 IP 不在 ipset 中
这是预期的行为。模块报告的是 请求时 的情况。如果您稍后检查 ipset 而未找到该 IP:
-
超时过期: 该 IP 是在超时下添加的,并且已经过期
# 检查集合是否支持超时 ipset list setname | head -5 # 查找标题中的“timeout” -
模块缓存: 模块缓存查找(默认 60s)。最近删除的 IP 可能仍然显示为“匹配”
# 临时禁用缓存以进行调试(不适合生产!) ipset_cache_ttl 0; -
条目被删除: fail2ban、脚本或手动命令可能已删除它
-
陷阱配置问题: 如果使用蜜罐陷阱和
ipset_autoadd,合法的机器人可能触发了陷阱。检查您的陷阱位置是否与合法机器人路径(如站点地图、robots.txt)重叠。使用robots.txt排除爬取陷阱路径。
autoadd 失败并显示“result=4”
这意味着您在 ipset_autoadd 中使用了 timeout=N,但 ipset 是 在没有 超时支持的情况下创建的。
解决方案: 重新创建具有超时支持的 ipset:
## 使用 ipset 直接
sudo ipset destroy honeypot4
sudo ipset create honeypot4 hash:ip family inet timeout 86400
## 使用 firewall-cmd(RHEL/CentOS/Amazon Linux)
sudo firewall-cmd --permanent --delete-ipset=honeypot4
sudo firewall-cmd --permanent --new-ipset=honeypot4 --type=hash:ip \
--option=family=inet --option=timeout=86400
sudo firewall-cmd --reload
📋 需求
- NGINX ≥ 1.22(使用
--with-compat构建) - Linux 内核 具有 ipset 支持(nf_tables 或 xt_set 模块)
- libipset 库和开发头文件
- 权限:
CAP_NET_ADMIN用于 ipset 操作
📜 许可证
这是专有软件。保留所有权利。
仅通过 GetPageSpeed Premium Repository 提供。
👤 作者
Danila Vershinin GetPageSpeed LLC
🆘 支持
- 蜜罐 v2.0 使用 ipset-access 自动禁用机器人
- 支持: 为高级订阅者提供
- 联系: GetPageSpeed Support
NGINX IPSet Access Module
GetPageSpeed LLC 提供的高级 NGINX 模块
www.getpagespeed.com