RumenDamyanov/nginx-torblocker

GitHub: RumenDamyanov/nginx-torblocker

一款轻量级 Nginx 动态模块,通过自动获取 Tor 出口节点列表实现对 Tor 流量的灵活封锁或放行。

Stars: 6 | Forks: 0

[![OBS Build Status](https://build.opensuse.org/projects/home:rumenx/packages/nginx-torblocker/badge.svg?type=default)](https://build.opensuse.org/package/show/home:rumenx/nginx-torblocker) [![GitHub Release](https://img.shields.io/github/v/release/RumenDamyanov/nginx-torblocker?label=Release)](https://github.com/RumenDamyanov/nginx-torblocker/releases) [![License](https://img.shields.io/github/license/RumenDamyanov/nginx-torblocker?label=License)](LICENSE.md) [![Platform Support](https://img.shields.io/badge/Platform-Debian%20%7C%20Ubuntu%20%7C%20Fedora%20%7C%20openSUSE%20%7C%20RHEL-blue)](https://build.opensuse.org/package/show/home:rumenx/nginx-torblocker) # Nginx TorBlocker 一个灵活的 Nginx 模块,用于控制来自 Tor exit node 的访问 —— 封锁它们、仅允许它们,或者混合使用不同的策略。 ## 功能 - **三种操作模式:** - `torblock on` - 封锁 Tor exit node 流量 - `torblock off` - 允许所有流量(默认) - `torblock only` - **仅**允许 Tor 流量(封锁 clearnet) - **自动获取**来自 URL 的 Tor exit node 列表(无需 cron jobs!) - 支持 **HTTPS** 安全获取列表(需要 nginx 支持 SSL) - 可配置的更新间隔,用于自动刷新列表 - 易于配置并与 Nginx 集成 - 支持基于 location 和 server 的配置 - 可在不同的 vhost 和路径中混合使用策略 ## 文档与支持 📖 **[完整文档](https://github.com/RumenDamyanov/nginx-torblocker/wiki)** - 包含全面的指南、教程和参考资料 ### Wiki 文章快速链接 - 🏠 **[主页](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Home)** - 概述与入门指南 - 📦 **[安装指南](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Installation-Guide)** - 详细的安装步骤说明 - 🔨 **[从源码编译](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Building-from-Source)** - 自行编译该模块 - 📋 **[配置参考](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Configuration-Reference)** - 完整的指令文档 - ⚙️ **[基础配置](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Basic-Configuration)** - 简单的设置示例 - 🚀 **[高级配置](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Advanced-Configuration)** - 复杂的策略与模式 - 🔗 **[上下文层级](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Context-Hierarchy)** - 了解配置继承机制 - 🎯 **[特定站点拦截](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Site-Specific-Blocking)** - 针对特定站点的配置 - 🛣️ **[基于路径的拦截](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Path-Based-Blocking)** - 针对特定 URL 的规则 - 🌐 **[全服务器拦截](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Server-Wide-Blocking)** - 全局配置 - 🔀 **[混合策略](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Mixed-Policies)** - 结合不同的方法 - 📥 **[模块加载](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Module-Loading)** - 加载并初始化模块 - 🧪 **[测试流程](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Testing-Procedures)** - 验证功能与性能 - 🔧 **[故障排除指南](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Troubleshooting-Guide)** - 解决常见问题 - ⚡ **[性能调优](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Performance-Tuning)** - 针对您的环境进行优化 - 📊 **[监控与日志](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Monitoring-Logging)** - 可观测性与指标 - 🛠️ **[开发环境设置](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Development-Setup)** - 贡献与开发环境 ## 仓库结构 - `src/` — Nginx 模块源代码 - `debian/` — 打包文件(用于构建 .deb 包) - `conf/` — 示例配置 ## 安装说明 ### 包安装(推荐) 可以通过 [openSUSE Build Service](https://build.opensuse.org/package/show/home:rumenx/nginx-torblocker) 获取适用于多种 Linux 发行版的预编译包。 #### Debian / Ubuntu ``` # 添加 repository echo "deb http://download.opensuse.org/repositories/home:/rumenx/xUbuntu_24.04/ /" | sudo tee /etc/apt/sources.list.d/nginx-torblocker.list # 添加 repository key curl -fsSL https://download.opensuse.org/repositories/home:/rumenx/xUbuntu_24.04/Release.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/nginx-torblocker.gpg > /dev/null # 更新并安装 sudo apt update sudo apt install nginx-torblocker ``` **支持的版本:** - Ubuntu 24.04 (Noble) - 使用 `xUbuntu_24.04` - Ubuntu 22.04 (Jammy) - 使用 `xUbuntu_22.04` - Debian 12 (Bookworm) - 使用 `Debian_12` - Debian 13 (Trixie) - 使用 `Debian_13` 将上述命令中的 `xUbuntu_24.04` 替换为您的发行版版本。 #### Fedora ``` # 添加 repository sudo dnf config-manager --add-repo https://download.opensuse.org/repositories/home:/rumenx/Fedora_41/home:rumenx.repo # 安装 package sudo dnf install nginx-torblocker ``` **支持的版本:** - Fedora 42 - 使用 `Fedora_42` - Fedora 41 - 使用 `Fedora_41` - Fedora 40 - 使用 `Fedora_40` #### openSUSE ``` # 添加 repository sudo zypper addrepo https://download.opensuse.org/repositories/home:/rumenx/openSUSE_Tumbleweed/home:rumenx.repo # 刷新 repositories sudo zypper refresh # 安装 package sudo zypper install nginx-torblocker ``` **支持的版本:** - openSUSE Tumbleweed - 使用 `openSUSE_Tumbleweed` - openSUSE Leap 15.6 - 使用 `openSUSE_Leap_15.6` - openSUSE Leap 16.0 - 使用 `openSUSE_Leap_16.0` #### RHEL / CentOS / Rocky Linux / AlmaLinux ``` # 添加 repository(以 RHEL 9 为例) sudo dnf config-manager --add-repo https://download.opensuse.org/repositories/home:/rumenx/RHEL_9/home:rumenx.repo # 安装 package sudo dnf install nginx-torblocker ``` **支持的版本:** - RHEL/CentOS 9 - 使用 `RHEL_9` - RHEL/CentOS 8 - 使用 `RHEL_8` - RHEL/CentOS 7 - 使用 `RHEL_7` ### 安装后操作 安装该包后,模块将被安装到以下位置: - **Debian/Ubuntu**:`/usr/lib/nginx/modules/ngx_http_torblocker_module.so` - **Fedora/RHEL/openSUSE**:`/usr/lib64/nginx/modules/ngx_http_torblocker_module.so` 通过在 `/etc/nginx/nginx.conf` 的顶部添加以下内容来加载模块: ``` load_module modules/ngx_http_torblocker_module.so; ``` 然后重启 nginx: ``` sudo systemctl restart nginx ``` ## 快速构建说明 📖 **有关详细的构建说明和安装指南,请参阅 [从源码编译](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Building-from-Source) 和 [安装指南](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Installation-Guide) wiki 页面。** 💾 **[Releases 页面](https://github.com/RumenDamyanov/nginx-torblocker/releases) 提供了适用于 Ubuntu 22.04/24.04/25.04 及各种 Nginx 版本的预编译包。** ### 前置条件 - 系统**已安装 Nginx** - 与已安装版本匹配的 **Nginx 源代码** - **构建工具**:gcc, make, wget - **开发库**:libpcre3-dev, zlib1g-dev 您可以在 Ubuntu/Debian 上安装前置条件: ``` sudo apt-get update sudo apt-get install build-essential gcc libpcre3-dev zlib1g-dev wget ``` 在 CentOS/RHEL 上: ``` sudo yum groupinstall "Development Tools" sudo yum install pcre-devel zlib-devel wget ``` ### 构建模块 1. 克隆此代码库: git clone https://github.com/RumenDamyanov/nginx-torblocker.git cd nginx-torblocker 2. 下载并解压与您版本匹配的 Nginx 源码: # 首先检查您的 Nginx 版本 nginx -v # 下载匹配的源码(以 1.26.0 为例) wget https://nginx.org/download/nginx-1.26.0.tar.gz tar xzf nginx-1.26.0.tar.gz cd nginx-1.26.0 3. 配置并构建模块: # 配置带有该模块的 Nginx ./configure --add-dynamic-module=../src # 仅构建模块(而不是完整的 Nginx) make modules 4. 安装模块: # 复制到您的 Nginx 模块目录 sudo cp objs/ngx_http_torblocker_module.so /usr/lib/nginx/modules/ # 或者复制到自定义位置 sudo cp objs/ngx_http_torblocker_module.so /etc/nginx/modules/ ### 在 Nginx 中加载模块 在您的 `nginx.conf` 顶部添加: ``` load_module modules/ngx_http_torblocker_module.so; ``` ## 配置示例 查看 `conf/test.conf` 获取完整示例。基本用法: ``` http { # Required: DNS resolver for fetching the Tor exit list resolver 1.1.1.1 9.9.9.9; # Enable Tor blocking (uses default URL and update interval) torblock on; } ``` 该模块会从 Tor Project **自动获取** Tor exit node 列表 —— 无需 cron jobs 或外部脚本! ## 配置参考 📋 **有关完整的配置详情,请参阅 [配置参考](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Configuration-Reference) wiki 页面。** ### 指令 | 指令 | 上下文 | 默认值 | 描述 | |-----------|---------|---------|-------------| | `torblock` | http, server, location | `off` | 设置模式:`off`、`on` 或 `only` | | `torblock_list_url` | http | `https://check.torproject.org/torbulkexitlist` | Tor exit node 列表的 URL | | `torblock_update_interval` | http | `3600000` | 自动更新间隔,以毫秒为单位(1 小时) | ### 模式值 | 模式 | 行为 | |------|----------| | `off` | 允许所有流量(默认) | | `on` | 封锁 Tor exit node 流量 | | `only` | **仅**允许 Tor 流量,封锁 clearnet | **注意事项:** - 该模块需要在 http 块中配置 `resolver` 指令以进行 DNS 解析。为了更好的隐私,您也可以使用本地解析器,如 `127.0.0.53` (systemd-resolved) 或 `127.0.0.1` (dnsmasq/unbound)。 - **HTTPS 支持**:默认 URL 使用 HTTPS。如果您的 nginx 构建时没有包含 SSL 支持 (`--with-http_ssl_module`),您可以改用 HTTP URL:`http://check.torproject.org/torbulkexitlist` ### 上下文层级 该模块支持具有继承关系的三个层级的配置: - **HTTP 上下文**:所有服务器的全局默认设置 - **Server 上下文**:针对每个虚拟主机的设置 - **Location 上下文**:针对每个 URL 路径的设置 子上下文继承父上下文的配置,更具体的设置会覆盖通用的设置。 📖 **在 wiki 中了解更多关于 [上下文层级](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Context-Hierarchy) 的信息。** ## 使用示例 🚀 **有关高级配置示例,请参阅 [高级配置](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Advanced-Configuration) wiki 页面。** ### 基础配置 ``` http { resolver 1.1.1.1 9.9.9.9; # Required for DNS resolution # Enable Tor blocking with automatic list updates torblock on; } ``` ### 高级配置 ``` http { resolver 1.1.1.1 9.9.9.9 valid=300s; resolver_timeout 5s; # Optional: custom URL and update interval torblock_list_url "https://check.torproject.org/torbulkexitlist"; torblock_update_interval 600000; # Update every 10 minutes # Per-server configuration server { torblock off; # Disable for this server location /api { torblock on; # Re-enable for specific location } } server { server_name secure.example.com; torblock on; # Enable for this server location /public { torblock off; # Allow Tor for public content } } } ``` ### 基于位置的选择性拦截 ``` http { resolver 1.1.1.1 9.9.9.9; torblock off; # Default: allow Tor server { listen 80; server_name example.com; # Public content - Tor allowed location / { root /var/www/html; } # Admin area - block Tor location /admin { torblock on; } # API - block Tor location /api { torblock on; } } } ``` ### 结合全局、Server 和 Location 设置 您可以在不同层级启用或禁用该模块,以实现灵活的访问控制。例如: ``` http { resolver 1.1.1.1 9.9.9.9; torblock off; # Default: allow Tor everywhere # Enable Tor blocking only for a specific vhost server { server_name sensitive.example.com; torblock on; # Block Tor for this vhost # But allow Tor for a specific location (e.g., public API) location /public-api { torblock off; } } # Another vhost with default (Tor allowed) server { server_name open.example.com; # torblock remains off } } ``` **使用场景:** - 如果您想对站点的敏感部分(例如管理面板或私有内容)封锁 Tor,但允许 Tor 用户访问公共 API 或开放资源,此设置非常有用。您也可以在同一个 Nginx 实例中让某些 vhost 对 Tor 开放,而保护其他 vhost。 ### 仅限 Tor 模式(专属 Tor 访问) 使用 `torblock only` 来**仅**允许 Tor 流量并封锁常规 (clearnet) 连接。这对于注重隐私的服务或 .onion 风格的 endpoint 非常有用。 ``` http { resolver 1.1.1.1 9.9.9.9; # Privacy-focused service - Tor only server { listen 80; server_name private.example.com; torblock only; # Only Tor users can access } # Regular site - allow all server { listen 80; server_name public.example.com; torblock off; # Everyone can access } } ``` ### 混合策略(封锁、允许、仅限 Tor) 结合所有三种模式以实现最大的灵活性: ``` http { resolver 1.1.1.1 9.9.9.9; torblock off; # Default: allow all traffic server { listen 80; server_name example.com; # Public pages - allow everyone location / { torblock off; } # Admin panel - block Tor users location /admin { torblock on; } # Whistleblower submission - Tor users only location /secure-submit { torblock only; } } } ``` **`torblock only` 的使用场景:** - 举报人或匿名提交门户 - 注重隐私的通信 endpoint - 测试 Tor 可访问性 - 只能匿名访问的服务 ## 故障排除 🔧 **有关全面的故障排除指南,请参阅:** - **[故障排除指南](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Troubleshooting-Guide)** - 详细的诊断流程和解决方案 - **[测试流程](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Testing-Procedures)** - 验证您的配置和性能 - **[性能调优](https://github.com/RumenDamyanov/nginx-torblocker/wiki/Performance-Tuning)** - 针对您的环境进行优化 ### 常见问题 #### 模块加载失败 ``` nginx: [emerg] dlopen() "/usr/lib/nginx/modules/ngx_http_torblocker_module.so" failed ``` **解决方案:** - 确保模块是基于您正在运行的相同 Nginx 版本构建的 - 检查文件权限:`chmod 644 /usr/lib/nginx/modules/ngx_http_torblocker_module.so` - 验证您的 `load_module` 指令中的模块路径是否正确 #### 配置测试失败 ``` nginx: [emerg] unknown directive "torblock" ``` **解决方案:** - 确保 `load_module` 指令位于 `nginx.conf` 的顶部(在任何 `http` 块之前) - 验证模块文件存在且可读 - 检查 Nginx 错误日志以获取详细的错误信息 #### 模块版本不匹配 ``` nginx: [emerg] module "/usr/lib/nginx/modules/ngx_http_torblocker_module.so" version 1024000 instead of 1026000 ``` **解决方案:** - 针对您确切的 Nginx 版本重新构建模块 - 使用 `nginx -v` 下载正确的 Nginx 源码版本 ### 性能考量 - **内存使用**:该模块会在内存中维护 Tor exit node 列表 - **更新频率**:默认 1 小时的更新在时效性和性能之间取得了平衡 - **请求开销**:影响极小 —— 每次请求仅进行简单的 IP 查找 - **并发请求**:该模块对于多 worker 配置是线程安全的 ### 调试 在 Nginx 中启用调试日志: ``` error_log /var/log/nginx/debug.log debug; ``` 检查模块特定的消息: ``` grep torblock /var/log/nginx/error.log ``` ## 背景与灵感 该模块的灵感来源于我 20 多年前开发的一个名为 [AntiTor](https://github.com/RumenDamyanov/antitor) 的 PHP 脚本,该脚本成功封锁了 Web 服务器的 Tor 访问。最初的脚本很有效,但适用范围有限。 -torblocker 模块将这一概念带入了现代,并进行了几项关键改进: - **原生性能**:在 Nginx 层级而非 PHP 应用层运行 - **精细化控制**:可以按虚拟主机或 location 启用/禁用拦截 - **选择性访问**:在封锁敏感区域的同时,允许 Tor 访问公共资源 - **多站点支持**:在同一服务器上为多个站点提供不同的策略 - **自动更新**:无需人工干预即可保持 Tor exit node 列表最新 这种改进的方法允许实现原始脚本无法实现的复杂访问控制策略,使其适用于不同站点可能有不同安全要求的复杂托管环境。 ## 二进制包与发行 ### 官方发行版 预编译二进制文件的主要分发渠道是 [GitHub Releases 页面](https://github.com/RumenDamyanov/nginx-torblocker/releases),它提供: - 适用于 Ubuntu 22.04 LTS (jammy)、24.04 LTS (noble) 和 25.04 (plucky) 的**二进制包** - **多种架构**:amd64 和 arm64 - **多个 nginx 版本**:兼容 nginx 1.26.x 和 1.27.x 系列 - **Debian 软件包 (.deb)**:可通过 `dpkg` 进行本地安装 ### PPA 状态 实验性的 Ubuntu PPA **不再受支持**并已停止维护。它从来都不是官方的分发渠道,而且在生产环境中被证明是不可靠的。 ### 未来计划 我们计划建立一个自托管的 apt 仓库,以提供已签名、可重现的构建版本,而不受第三方托管的限制。此仓库将托管我们项目的多个软件包,并将目标定为: - Ubuntu 24.04 LTS (noble) 及更新版本 - Ubuntu 25.04 (plucky) 及更新版本 目前,请使用官方的 GitHub Releases 或从源码进行编译。 ## 相关项目 我们维护的其他 nginx 动态模块: | 模块 | 描述 | GitHub | OBS | |--------|-------------|--------|-----| | **nginx-gone** | 为永久移除的 URI 返回 HTTP 410 Gone | [GitHub](https://github.com/RumenDamyanov/nginx-gone) | [OBS](https://build.opensuse.org/package/show/home:rumenx/nginx-gone) | | **nginx-cf-realip** | 自动获取 Cloudflare edge IP 列表,用于恢复真实客户端 IP | [GitHub](https://github.com/RumenDamyanov/nginx-cf-realip) | [OBS](https://build.opensuse.org/package/show/home:rumenx/nginx-cf-realip) | | **nginx-waf** | 基于 IP/CIDR 的访问控制,支持命名列表和基于标签的组织 | [GitHub](https://github.com/RumenDamyanov/nginx-waf) | [OBS](https://build.opensuse.org/package/show/home:rumenx/nginx-waf) | | **nginx-waf-api** | 用于动态管理 nginx-waf IP 列表的 REST API daemon | [GitHub](https://github.com/RumenDamyanov/nginx-waf-api) | [OBS](https://build.opensuse.org/package/show/home:rumenx/nginx-waf-api) | | **nginx-waf-feeds** | nginx-waf 的自动威胁情报源更新器 | [GitHub](https://github.com/RumenDamyanov/nginx-waf-feeds) | [OBS](https://build.opensuse.org/package/show/home:rumenx/nginx-waf-feeds) | | **nginx-waf-ui** | nginx-waf 的 Web 管理界面 | [GitHub](https://github.com/RumenDamyanov/nginx-waf-ui) | [OBS](https://build.opensuse.org/package/show/home:rumenx/nginx-waf-ui) | | **nginx-waf-lua** | nginx-waf 的 OpenResty/Lua 集成 | [GitHub](https://github.com/RumenDamyanov/nginx-waf-lua) | [OBS](https://build.opensuse.org/package/show/home:rumenx/nginx-waf-lua) | ### Apache HTTP Server 版本 所有模块也适用于 Apache httpd: | 模块 | 描述 | GitHub | OBS | |--------|-------------|--------|-----| | **apache-torblocker** | 控制来自 Tor exit node 的访问 | [GitHub](https://github.com/RumenDamyanov/apache-torblocker) | [OBS](https://build.opensuse.org/package/show/home:rumenx/apache-torblocker) | | **apache-gone** | 为永久移除的 URI 返回 HTTP 410 Gone | [GitHub](https://github.com/RumenDamyanov/apache-gone) | [OBS](https://build.opensuse.org/package/show/home:rumenx/apache-gone) | | **apache-cf-realip** | 通过 `mod_remoteip` 恢复 Cloudflare 真实 IP | [GitHub](https://github.com/RumenDamyanov/apache-cf-realip) | [OBS](https://build.opensuse.org/package/show/home:rumenx/apache-cf-realip) | | **apache-waf** | 带有命名列表的基于 IP/CIDR 的访问控制 | [GitHub](https://github.com/RumenDamyanov/apache-waf) | [OBS](https://build.opensuse.org/package/show/home:rumenx/apache-waf) | | **apache-waf-api** | 用于动态 WAF IP 列表管理的 REST API | [GitHub](https://github.com/RumenDamyanov/apache-waf-api) | [OBS](https://build.opensuse.org/package/show/home:rumenx/apache-waf-api) | | **apache-waf-feeds** | apache-waf 的自动威胁情报源更新器 | [GitHub](https://github.com/RumenDamyanov/apache-waf-feeds) | [OBS](https://build.opensuse.org/package/show/home:rumenx/apache-waf-feeds) | | **apache-waf-ui** | apache-waf 的 Web 管理界面 | [GitHub](https://github.com/RumenDamyanov/apache-waf-ui) | [OBS](https://build.opensuse.org/package/show/home:rumenx/apache-waf-ui) | ## 贡献 我们欢迎您的贡献!请参阅我们的[贡献指南](CONTRIBUTING.md)获取有关以下内容的详细信息: - 设置开发环境 - 编码规范与最佳实践 - 测试流程 - Pull request 流程 参与之前,请务必阅读我们的[行为准则](CODE_OF_CONDUCT.md)。 🗣️ **加入讨论**:使用我们的[社区讨论区](https://github.com/RumenDamyanov/nginx-torblocker/discussions)来: - 提出新功能或改进建议 - 分享您的使用场景和配置 - 获取有关开发设置的帮助 - 与其他贡献者和用户交流 ## 安全 安全对我们至关重要。如果您发现安全漏洞,请参阅我们的[安全政策](SECURITY.md)了解如何负责任地报告它。 ## 资金支持 如果您觉得这个项目有用,请考虑支持它的开发。有关赞助和捐款的信息,请参阅 [FUNDING.md](FUNDING.md)。 ## 许可证 BSD 许可证。请参阅 [LICENSE.md](LICENSE.md)。
标签:Nginx, Streamlit, Tor代理, 动态模块, 客户端加密, 流量过滤, 网络安全, 访问控制, 隐私保护