RumenDamyanov/nginx-waf
GitHub: RumenDamyanov/nginx-waf
一个原生 nginx 动态模块,提供基于命名列表和标签的 IP/CIDR 黑白名单访问控制。
Stars: 4 | Forks: 0
# nginx-waf
一个动态的 nginx 模块,用于基于 IP/CIDR 的访问控制,支持命名列表和基于标签的组织。
## ⚠️ 实验性项目
```
╔══════════════════════════════════════════════════════════════════╗
║ 🧪 THIS PROJECT IS EXPERIMENTAL - NOT PRODUCTION READY ║
║ ║
║ • Early development stage ║
║ • API and features may change ║
║ • Use at your own risk ║
║ • Contributions and ideas welcome! ║
╚══════════════════════════════════════════════════════════════════╝
```
📅 **开始时间:** 2025 年 12 月
🎯 **目标:** v1.0.0 稳定版发布
📊 **当前状态:** v0.2.1 - 核心功能完成,测试阶段
## 什么是 nginx-waf?
**nginx-waf** 是一个简单且专注的 nginx 模块,提供基于 IP 的访问控制。你可以把它看作一个灵活的 IP 黑名单/白名单管理器。
### 核心功能
| 功能 | 描述 |
|---------|-------------|
| 🏷️ **命名列表** | 使用有意义的名称定义列表(`tor`、`botnets`、`trusted`) |
| 🔖 **标签组织** | 使用标签对列表进行分组以进行批量管理(`tag:anonymizers`) |
| ⚫ **黑名单模式** | 阻止匹配任何已启用列表的 IP |
| ⚪ **白名单模式** | 仅允许匹配已启用列表的 IP |
| 🎯 **灵活的作用域** | 可在 http、server 或 location 级别进行配置 |
| 🌐 **IPv4 和 IPv6** | 完全支持 CIDR 范围 |
### nginx-waf 不是什么
- ❌ **不是完整的 WAF** - 没有请求体检查、SQL 注入检测等。
- ❌ **不是速率限制器** - 请使用 nginx 的 `limit_req` 模块
- ❌ **不是机器人检测器** - 仅提供 IP 列表,没有行为分析
- ❌ **不是 CDN** - 仅用于访问控制
### 为什么还要开发另一个模块?
- **比 ModSecurity 更简单** - 仅专注于基于 IP 的控制
- **适用于原生 nginx** - 不需要 OpenResty
- **带标签的命名列表** - 轻松组织数十个列表
- **按 location 配置** - 提供细粒度的控制
## 快速示例
```
http {
# Define IP lists with tags
waf_list tor "/etc/nginx/waf/tor-exits.txt" "anonymizers,privacy";
waf_list botnets "/etc/nginx/waf/botnets.txt" "security";
waf_list trusted "/etc/nginx/waf/trusted.txt" "internal";
server {
server_name api.example.com;
# Block all anonymizers by default
waf on;
waf_mode blacklist;
waf_enable_lists tag:anonymizers;
location /admin {
# Strict whitelist for admin
waf on;
waf_mode whitelist;
waf_enable_lists trusted;
}
location /public {
# No restrictions on public endpoints
waf off;
}
}
}
```
## 配置参考
| 指令 | 上下文 | 参数 | 描述 |
|-----------|---------|-----------|-------------|
| `waf` | http, server, location | `on\|off` | 启用/禁用 WAF |
| `waf_mode` | http, server, location | `blacklist\|whitelist` | 操作模式 |
| `waf_list` | http | `name path [tags]` | 定义 IP 列表 |
| `waf_enable_lists` | http, server, location | `name,...\|tag:name\|all` | 激活列表 |
| `waf_disable_lists` | http, server, location | `name,...\|tag:name` | 停用列表 |
| `waf_log_prefix` | http, server, location | `string` | 自定义日志前缀 |
## IP 列表格式
列表是纯文本文件,每行一个条目:
```
# 注释以 # 开头
# IPv4 addresses
192.168.1.100
10.0.0.50
# IPv4 CIDR ranges
192.168.0.0/24
10.0.0.0/8
# IPv6 addresses
2001:db8::1
::ffff:192.168.1.1
# IPv6 CIDR ranges
2001:db8::/32
```
## 安装
🚧 **即将通过 openSUSE Build Service (OBS) 提供安装包**
计划支持的发行版:
| 发行版 | 版本 |
|--------------|----------|
| Debian | 11, 12, 13 |
| Ubuntu | 22.04, 24.04, 25.04 |
| Fedora | 41, 42 |
| openSUSE | Tumbleweed, Leap 15.6, 16.0 |
| RHEL/Rocky/Alma | 8, 9 |
## 从源码构建
要求:
- nginx 源代码(与你的 nginx 版本相匹配)
- GCC 和 make
- PCRE 和 zlib 开发库
```
# 下载 nginx 源码
wget https://nginx.org/download/nginx-1.27.4.tar.gz
tar xzf nginx-1.27.4.tar.gz
cd nginx-1.27.4
# 使用 module 进行配置
./configure --add-dynamic-module=/path/to/nginx-waf/src
# 构建 module
make modules
# 安装(以 root 身份)
cp objs/ngx_http_waf_module.so /usr/lib64/nginx/modules/
```
## 完美配合
nginx-waf 旨在补充现有的 nginx 模块:
| 模块 | 用例 |
|--------|----------|
| `ngx_http_realip_module` | 在代理/CDN 后获取真实客户端 IP |
| `ngx_http_limit_req_module` | 速率限制 |
| `ngx_http_geo_module` | 地理位置限制 |
| `ngx_http_access_module` | 简单的允许/拒绝规则 |
使用真实 IP 的示例:
```
http {
# Trust Cloudflare IPs
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
real_ip_header CF-Connecting-IP;
# WAF checks real client IP
waf_list threats "/etc/nginx/waf/threats.txt";
waf on;
waf_mode blacklist;
waf_enable_lists threats;
}
```
## 路线图
### v0.2.1 - 核心模块 ✅ (当前版本)
- [x] 项目设置和文档
- [x] 具有 `waf on|off` 的基础模块
- [x] 单个 IP 列表支持
- [x] 带有标签的多个命名列表
- [x] 黑名单和白名单模式
- [x] 支持 CIDR 的 IPv4 和 IPv6
- [x] `waf_enable_lists` 和 `waf_disable_lists` 指令
- [x] 基于标签的列表选择(`tag:name`)
- [x] 上下文继承(http → server → location)
- [x] GitHub Actions CI/CD(x86_64 + ARM64)
- [ ] OBS 软件包(进行中)
### v1.0.0 - 稳定版发布(目标:2026 年第二季度)
- [ ] 社区测试和反馈
- [ ] 性能基准测试
- [ ] 适用于主要发行版的 OBS 软件包
- [ ] 安全审查
### v2.0.0 - 扩展(未来)
有关未来配套项目的详细信息,请参阅下方的**计划中的扩展**部分。
## 生态系统
通过管理、自动化和集成功能扩展 nginx-waf 的配套项目:
| 项目 | 语言 | 描述 |
|---------|----------|-------------|
| **[nginx-waf-api](https://github.com/RumenDamyanov/nginx-waf-api)** | Go | 用于在没有 nginx 重载的情况下进行动态 IP 列表管理的 REST API 守护进程 |
| **[nginx-waf-ui](https://github.com/RumenDamyanov/nginx-waf-ui)** | Go | 基于 Web 的仪表板,用于管理列表、查看统计信息和配置 |
| **[nginx-waf-feeds](https://github.com/RumenDamyanov/nginx-waf-feeds)** | Go | 自动威胁订阅源更新器(Cloudflare、Tor 出口节点、Spamhaus 等) |
| **[nginx-waf-lua](https://github.com/RumenDamyanov/nginx-waf-lua)** | Lua | OpenResty/Lua 集成,用于编写 WAF 逻辑和自定义响应 |
### 架构概览
```
┌─────────────────┐
│ nginx-waf-ui │
│ (Web Dashboard)│
└────────┬────────┘
│
┌─────────────────┐ ┌─────────▼────────┐ ┌─────────────────┐
│ nginx-waf-feeds │───────────▶│ nginx-waf-api │◀───────────│ CLI / Scripts │
│ (Feed Updater) │ │ (REST API) │ │ │
└─────────────────┘ └─────────┬────────┘ └─────────────────┘
│
┌─────────▼────────┐
│ IP List Files │
│ /etc/nginx/waf/ │
└─────────┬────────┘
│
┌─────────▼────────┐
│ nginx-waf │◀──── nginx-waf-lua
│ (C Module) │ (Lua bindings)
└──────────────────┘
```
### 状态
| 项目 | 状态 |
|---------|--------|
| nginx-waf | 🟡 开发中 (v0.2.1) |
| nginx-waf-api | 🟢 已发布 v0.1.0 |
| nginx-waf-ui | 🟢 已发布 v0.1.0 |
| nginx-waf-feeds | 🟢 已发布 v0.1.0 |
| nginx-waf-lua | 🟢 已发布 v0.1.0 |
## 相关项目
我们维护的其他 nginx 动态模块:
| 模块 | 描述 |
|--------|-------------|
| **[nginx-torblocker](https://github.com/RumenDamyanov/nginx-torblocker)** | 控制来自 Tor 出口节点的访问 — 阻止、允许或仅限 Tor 模式 |
| **[nginx-cf-realip](https://github.com/RumenDamyanov/nginx-cf-realip)** | 自动获取 Cloudflare 边缘 IP 列表,用于还原真实客户端 IP |
| **[nginx-gone](https://github.com/RumenDamyanov/nginx-gone)** | 对永久移除的 URI 返回 HTTP 410 Gone |
### Apache HTTP Server 版本
所有模块也适用于 Apache httpd:
| 模块 | 描述 |
|--------|-------------|
| **[apache-waf](https://github.com/RumenDamyanov/apache-waf)** | 使用命名列表进行基于 IP/CIDR 的访问控制 |
| **[apache-waf-api](https://github.com/RumenDamyanov/apache-waf-api)** | 用于动态 WAF IP 列表管理的 REST API |
| **[apache-waf-feeds](https://github.com/RumenDamyanov/apache-waf-feeds)** | 用于 apache-waf 的自动威胁订阅源更新器 |
| **[apache-waf-ui](https://github.com/RumenDamyanov/apache-waf-ui)** | apache-waf 的 Web 管理界面 |
| **[apache-torblocker](https://github.com/RumenDamyanov/apache-torblocker)** | 控制来自 Tor 出口节点的访问 |
| **[apache-cf-realip](https://github.com/RumenDamyanov/apache-cf-realip)** | 通过 `mod_remoteip` 还原 Cloudflare 真实 IP |
| **[apache-gone](https://github.com/RumenDamyanov/apache-gone)** | 对永久移除的 URI 返回 HTTP 410 Gone |
## 许可证
[BSD 3-Clause 许可证](LICENSE.md)
## 安全性
发现安全问题?请参阅我们的[安全政策](SECURITY.md)进行负责任的披露。
⚠️ 实验性项目 - 使用需自担风险
欢迎贡献和提出想法!
标签:IP黑白名单, Nginx, rizin, Streamlit, WAF, 客户端加密, 日志审计, 网络安全, 访问控制, 配置错误, 隐私保护