Skip to Content

Discourse 论坛

官方为 Discourse 打造的 ProxyTracer 集成插件。此插件为您的社区引入企业级 IP 威胁情报,自动识别已知的 VPN、代理、数据中心机房及 Tor 节点,支持在注册、登录或全站访问层面精准拦截恶意流量。

该插件通过此 Github repository 进行分发与开源。

功能特性

  • 精细化防护策略:支持在全站访问、新用户注册、老用户登录或仅后台管理面板等不同层级启用 VPN / 代理检测。
  • 内置 Redis 缓存系统,自动复用对同一 IP 的近期检测结果,大幅削减外部 API 请求量并实现零延迟放行。
  • 在发生 API 超时或网络异常时,插件优先放行合规用户以防止大规模误封。该行为可通过选项进行调整。
  • 内置支持精确 IP 及 CIDR 子网白名单。

安装指南

  1. 通过 SSH 连接至服务器并进入 Discourse 目录:
    cd /var/discourse
  2. 打开容器配置文件进行编辑:
    nano containers/app.yml
  3. 找到 hooks 区域,并在 docker_manager 安装配置下方直接追加仓库克隆命令:
    hooks: after_code: - exec: cd: $home/plugins cmd: - git clone https://github.com/discourse/docker_manager.git - git clone https://github.com/proxytracer/discourse-proxytracer.git
  4. 保存配置文件并重新构建 Discourse 容器以编译插件:
    ./launcher rebuild app

配置说明:

  1. ProxyTracer Dashboard 获取标准 API 密钥凭据。
  2. 进入 Discourse 管理后台:Admin → Plugins → ProxyTracer 找到 ProxyTracer 的设置项。
  3. 将您的 API 密钥填入 ProxyTracer API Key 字段。
  4. 通过勾选 Enabled during SignupEnabled during Login 和/或 Enabled for All Visitors 启用防护参数。
  5. 将受信任的 IP 或 CIDR 网段添加至 Whitelisted IPs 列表。
  6. (可选)根据服务器的具体流量需求,调整 API 超时时间与 Redis 缓存时长限制。
  7. (可选)自定义向被拦截用户展示的拦截提示消息。例如,您可以添加联系站点管理员的操作指引,以便用户在认为拦截有误且未通过代理/VPN 访问时发起申诉。

Settings Screenshot

网络配置:Cloudflare 与反向代理

为了让 ProxyTracer 有效运行,Discourse 应用必须接收到真实的客户端 IP 地址。 如果您的基础设施使用了 Cloudflare 或其他反向代理,Discourse 可能会默认记录代理节点的 IP 地址,从而使 ProxyTracer 的检测失效。

请遵循下方与您的服务器架构相匹配的配置指南,以确保正确的 IP 转发。

直连 Cloudflare 架构(标准安装)

这适用于您的 Discourse 服务器直连互联网,且仅使用 Cloudflare 进行 DNS 解析和边缘代理的标准场景。在此配置下,您必须配置 Discourse 信任 Cloudflare 的 IP 范围,并从传入的请求头中提取真实客户端 IP。

  1. 通过 SSH 连接到您的服务器并编辑容器配置:nano /var/discourse/containers/app.yml
  2. 找到 templates: 配置块,追加官方 Cloudflare 模板 templates/cloudflare.template.yml
    templates: - "templates/postgres.template.yml" - "templates/redis.template.yml" - "templates/web.template.yml" - "templates/web.ratelimited.template.yml" - "templates/cloudflare.template.yml"
  3. 保存文件并重新构建 Discourse 容器以生效:./launcher rebuild app

多层代理架构(Cloudflare + 本地反向代理)

适用于 Discourse 部署在本地反向代理(如 CloudPanel、Nginx Proxy Manager、Traefik、Plesk)之后且最外层接入了 Cloudflare 的多层代理场景。在这种“双重反向代理”架构下,官方的 cloudflare.template.yml 会失效,因为请求是由宿主机本地网卡转发给容器而非 Cloudflare 直连。在此场景下切勿使用该模板。

相反,您必须配置本地反向代理从 CF-Connecting-IP 请求头解析真实客户端 IP,且必须仅对来自受信任 Cloudflare 官方 IP 网段的流量生效。若不校验来源盲目信任该请求头,将导致恶意用户能够通过伪造 IP 绕过速率限制和封禁。

Nginx 示例: 首先在 server 块之外(或 location 块之外),将 Cloudflare 的 IP 范围定义为受信任代理:
# Cloudflare IPv4 地址段,参见 https://www.cloudflare.com/ips/ set_real_ip_from 173.245.48.0/20; set_real_ip_from 103.21.244.0/22; set_real_ip_from 103.22.200.0/22; set_real_ip_from 103.31.4.0/22; set_real_ip_from 141.101.64.0/18; set_real_ip_from 108.162.192.0/18; set_real_ip_from 190.93.240.0/20; set_real_ip_from 188.114.96.0/20; set_real_ip_from 197.234.240.0/22; set_real_ip_from 198.41.128.0/17; set_real_ip_from 162.158.0.0/15; set_real_ip_from 104.16.0.0/13; set_real_ip_from 104.24.0.0/14; set_real_ip_from 172.64.0.0/13; set_real_ip_from 131.0.72.0/22; # Cloudflare IPv6 地址段 set_real_ip_from 2405:b500::/32; set_real_ip_from 2405:8100::/32; set_real_ip_from 2803:f800::/32; set_real_ip_from 2c0f:f248::/32; set_real_ip_from 2a06:98c0::/29; real_ip_header CF-Connecting-IP;

接下来找到您的 location /@reverse_proxy 指令。得益于上述配置,现在 Nginx 只有在请求实际通过 Cloudflare 时,才会安全地将 $remote_addr 解析为真实的客户端 IP。修改您的 IP 转发请求头如下:

location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ... }

保存配置文件并重新加载宿主机的 Nginx 服务。此步骤无需重新构建 Discourse 容器。

配置验证与测试

要验证网络配置是否已成功向 ProxyTracer 传递真实访客 IP:

  1. 进入 Discourse 管理后台:Admin → Users
  2. 查看近期活动用户的 Registration IPLast IP 列。
    • 配置异常: 如果您查看到的是 Cloudflare IP(参见此处获取完整列表)或本地局域网 IP(如 127.0.0.1172.x.x.x),说明 IP 透传未生效。在此状态下 ProxyTracer 将无法有效保护您的站点。
    • 配置正确: 如果您查看到的是标准、唯一的真实住宅 IP 地址,则说明网络架构配置正确,ProxyTracer 正在积极监控您的流量。

紧急访问恢复

💡
意外被拦截? 若在配置 ProxyTracer 时因自身连接了 VPN 导致管理员账号被阻断,可通过 SSH 登录服务器并禁用插件以恢复访问:
cd /var/discourse ./launcher enter app rails c SiteSetting.proxytracer_enabled = false exit exit

开源协议

本项目基于 GNU Affero General Public License v3.0 (AGPLv3) 开源协议发布。

最后更新于