跳转至

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。阻止威胁、限制滥用者的速率、挑战机器人,并保护您的基础设施。

Version GetPageSpeed

⚠️ 商业软件 这是一个闭源的高级模块,仅通过 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 更改反应更快,但更多的内核调用 - 推荐:对于大多数用例,设置为 30s5m

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,可能的原因包括:

  1. 超时过期:该 IP 是在超时(例如,timeout=86400)下添加的,并且已经过期
  2. 缓存延迟:模块缓存查找结果(默认 60s)。从 ipset 中删除的条目可能仍会显示为“匹配”,直到缓存过期
  3. 手动删除:某人或某物(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:

  1. 超时过期: 该 IP 是在超时下添加的,并且已经过期

    # 检查集合是否支持超时
    ipset list setname | head -5
    # 查找标题中的“timeout”
    

  2. 模块缓存: 模块缓存查找(默认 60s)。最近删除的 IP 可能仍然显示为“匹配”

    # 临时禁用缓存以进行调试(不适合生产!)
    ipset_cache_ttl 0;
    

  3. 条目被删除: fail2ban、脚本或手动命令可能已删除它

  4. 陷阱配置问题: 如果使用蜜罐陷阱和 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

🆘 支持

NGINX IPSet Access Module
GetPageSpeed LLC 提供的高级 NGINX 模块
www.getpagespeed.com