Skip to Content

Discourse

Oficjalna integracja ProxyTracer dla platformy Discourse. Ta wtyczka wprowadza zaawansowaną analizę adresów IP do Twojej społeczności, automatycznie wykrywając znane sieci VPN, proxy, centra danych i węzły Tor oraz umożliwiając blokowanie rejestracji, logowania lub całego dostępu do forum Discourse.

Wtyczka jest dystrybuowana za pośrednictwem tego repozytorium GitHub.

Funkcje

  • Szczegółowa kontrola pozwalająca administratorom wymusić walidację IP podczas rejestracji nowych użytkowników, logowania istniejących kont lub globalnie dla wszystkich odwiedzających.
  • Wbudowane buforowanie w Redis przechowuje ostatnie wyniki oceny adresów IP, drastycznie zmniejszając liczbę zapytań do zewnętrznego API i zapewniając zerowe opóźnienia.
  • W przypadku przekroczenia limitu czasu API lub awarii sieci wtyczka stawia na dostępność dla użytkowników (fail-open), aby zapobiec masowym blokadom. Zachowanie to można zmienić w opcjach.
  • Wbudowana obsługa białej listy (whitelist) dla konkretnych adresów IP oraz podsieci CIDR.

Instalacja

  1. Połącz się z serwerem przez SSH i przejdź do katalogu instalacji Discourse:
    cd /var/discourse
  2. Otwórz plik konfiguracyjny kontenera do edycji:
    nano containers/app.yml
  3. Znajdź sekcję hooks i dodaj polecenie klonowania repozytorium bezpośrednio pod instalacją 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. Zapisz plik konfiguracyjny i przebuduj kontener Discourse, aby skompilować wtyczkę:
    ./launcher rebuild app

Konfiguracja:

  1. Pobierz standardowy klucz API z Panelu ProxyTracer.
  2. Przejdź do panelu administracyjnego Discourse: Admin → Wtyczki → ProxyTracer, aby otworzyć ustawienia ProxyTracer.
  3. Wprowadź swój klucz API w polu Klucz API ProxyTracer.
  4. Włącz parametry ochrony, zaznaczając Włączone podczas rejestracji, Włączone podczas logowania i/lub Włączone dla wszystkich odwiedzających.
  5. Dodaj zaufane adresy IP lub zakresy CIDR do listy Biała lista adresów IP.
  6. (Opcjonalnie) Dostosuj limit czasu API (timeout) i czas trwania pamięci podręcznej Redis do specyfiki ruchu na Twoim serwerze.
  7. (Opcjonalnie) Dostosuj treść komunikatu o blokadzie wyświetlanego zablokowanym użytkownikom. Możesz na przykład dodać instrukcje kontaktu z administracją serwisu w przypadku uznania blokady za bezpodstawną.

Settings Screenshot

Konfiguracja sieciowa: Cloudflare i Reverse Proxy

Aby ProxyTracer działał prawidłowo, aplikacja Discourse musi otrzymywać prawdziwy adres IP klienta. Jeśli Twoja infrastruktura korzysta z Cloudflare lub innego reverse proxy, Discourse może domyślnie rejestrować adres IP węzła proxy (np. serwerów brzegowych Cloudflare), co uniemożliwi poprawne działanie ProxyTracer.

Postępuj zgodnie z poniższymi wytycznymi konfiguracyjnymi dopasowanymi do architektury Twojego serwera, aby zapewnić prawidłowe przekazywanie adresów IP.

Bezpośrednia integracja z Cloudflare (Instalacja standardowa)

Dotyczy to sytuacji, gdy Twój serwer Discourse łączy się bezpośrednio z internetem i korzysta z Cloudflare wyłącznie do obsługi DNS i proxy brzegowego. W tej standardowej konfiguracji musisz skonfigurować Discourse tak, aby ufał zakresom IP Cloudflare i wyodrębniał prawdziwe IP klienta z nagłówków przychodzących.

  1. Połącz się z serwerem przez SSH i edytuj konfigurację kontenera: nano /var/discourse/containers/app.yml
  2. Znajdź blok templates: i dodaj oficjalny szablon 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. Zapisz plik i przebuduj kontener Discourse, aby zastosować zmiany: ./launcher rebuild app

Architektura wielowarstwowego proxy (Cloudflare + lokalny reverse proxy)

Dotyczy sytuacji, gdy instancja Discourse działa za lokalnym panelem zarządzania serwerem lub reverse proxy (np. CloudPanel, Nginx Proxy Manager, Traefik, Plesk), który z kolei znajduje się za Cloudflare. W architekturze wielowarstwowego proxy standardowy szablon cloudflare.template.yml nie zadziała, ponieważ ruch jest przekazywany do Discourse przez lokalny interfejs sieciowy, a nie bezpośrednio przez Cloudflare. Nie używaj szablonu Cloudflare w tym scenariuszu.

Zamiast tego musisz skonfigurować lokalne reverse proxy tak, aby wyodrębniało prawdziwy adres IP klienta z nagłówka CF-Connecting-IP, ale wyłącznie dla ruchu pochodzącego z zaufanych adresów IP Cloudflare. Bezwarunkowe przekazywanie tego nagłówka bez weryfikacji źródła pozwala złośliwym użytkownikom omijać limity zapytań i bany poprzez podszywanie się pod cudze IP.

Przykład Nginx: Najpierw zdefiniuj zakresy adresów IP Cloudflare jako zaufane proxy w konfiguracji bloku serwera (poza blokiem location):
# Adresy IPv4 Cloudflare, zobacz 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; # Adresy IPv6 Cloudflare 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;

Następnie znajdź dyrektywę location / lub @reverse_proxy. Dzięki powyższej konfiguracji Nginx bezpiecznie przypisze zmiennej $remote_addr prawdziwy adres IP klienta tylko wtedy, gdy żądanie rzeczywiście przeszło przez Cloudflare. Zmodyfikuj nagłówki przekazywania IP w następujący sposób:

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

Zapisz konfigurację i przeładuj usługę Nginx na hoście. Ponowne przebudowanie kontenera Discourse nie jest w tym kroku wymagane.

Walidacja i testowanie

Aby upewnić się, że konfiguracja sieciowa poprawnie przekazuje dane do ProxyTracer:

  1. Przejdź do panelu administracyjnego Discourse: Admin → Użytkownicy.
  2. Sprawdź kolumny IP rejestracji lub Ostatni adres IP dla ostatnich aktywności.
    • Niepoprawna konfiguracja: Jeśli widzisz adresy IP Cloudflare (zobacz tutaj pełną listę) lub lokalne adresy sieciowe (np. 127.0.0.1, 172.x.x.x), przekazywanie IP nie działa poprawnie. ProxyTracer nie może chronić Twojej witryny w tym stanie.
    • Poprawna konfiguracja: Jeśli widzisz standardowe, unikalne adresy IP użytkowników, architektura sieciowa jest skonfigurowana prawidłowo i ProxyTracer aktywnie monitoruje ruch.

Dostęp awaryjny

💡
Zostałeś zablokowany? Jeśli przypadkowo zablokujesz swój własny adres IP podczas konfigurowania ProxyTracer (np. jesteś obecnie połączony z VPN), możesz odzyskać dostęp, wyłączając wtyczkę przez SSH:
cd /var/discourse ./launcher enter app rails c SiteSetting.proxytracer_enabled = false exit exit

Licencja

Ta wtyczka jest objęta licencją GNU Affero General Public License v3.0 (AGPLv3).

Ostatnia aktualizacja: