webh.pl

Prawdziwe IP za Cloudflare na VPS

Jak przywrócić prawdziwy adres IP odwiedzających na VPS za Cloudflare: moduł realip w Nginx i mod_remoteip w Apache oraz zabezpieczenie origin.

  • czytania
  • Zaktualizowano:
Sieć i IP Rozwiązywanie problemów
Serwery VPS

Gdy serwer VPS stoi za Cloudflare, w logach i aplikacjach zamiast adresów odwiedzających widzisz adresy IP Cloudflare, co utrudnia analitykę, blokowanie nadużyć i działanie wtyczek bezpieczeństwa. Cloudflare przekazuje oryginalny adres w nagłówku CF-Connecting-IP, a serwer wystarczy nauczyć, żeby z niego korzystał. Ten poradnik pokazuje, jak to ustawić w Nginx i Apache.

Skąd bierze się problem

Cloudflare działa jak pośrednik: Odwiedzający łączy się najpierw z Cloudflare, a dopiero Cloudflare z Twoim serwerem. Z perspektywy serwera połączenie przychodzi więc z adresów Cloudflare, a nie od użytkownika. W efekcie:

  • W logach dostępu widnieją adresy Cloudflare zamiast odwiedzających,
  • Wtyczki bezpieczeństwa i statystyki źle przypisują ruch,
  • Reguły blokujące po adresie IP i ograniczanie liczby żądań nie działają poprawnie,
  • Geolokalizacja pokazuje lokalizację Cloudflare, nie użytkownika.

Cloudflare dołącza prawdziwy adres do każdego żądania w nagłówku CF-Connecting-IP. Konfiguracja polega na tym, by serwer ufał temu nagłówkowi, ale wyłącznie wtedy, gdy połączenie faktycznie przychodzi z Cloudflare.

Informacja

Adresy IP Cloudflare zmieniają się z czasem. Aktualną listę zakresów IPv4 i IPv6 pobierzesz z oficjalnej strony cloudflare.com/ips. W konfiguracji poniżej wpisz pełną, aktualną listę, a nie tylko przykładowe zakresy.

Nginx: Moduł realip

Nginx ma wbudowany moduł ngx_http_realip_module, który podmienia adres połączenia na ten z zaufanego nagłówka. Dodaj konfigurację (np. w pliku dołączanym do http lub do bloku server):

# Zakresy Cloudflare (wpisz pełną, aktualną listę z 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 2400:cb00::/32;
# ... pozostałe zakresy IPv4 i IPv6 ...

real_ip_header CF-Connecting-IP;

set_real_ip_from wskazuje, którym adresom wolno przekazywać prawdziwe IP, a real_ip_header CF-Connecting-IP mówi, z którego nagłówka je odczytać. Po zapisaniu przeładuj Nginx (nginx -t i systemctl reload nginx). Od tej pory w logach i w $_SERVER['REMOTE_ADDR'] w PHP pojawia się adres odwiedzającego.

Apache (LAMP): Mod_remoteip

W Apache odpowiada za to moduł mod_remoteip. Najpierw go włącz:

Na Debianie i Ubuntu włączysz go jednym poleceniem:

sudo a2enmod remoteip

Na AlmaLinux i Rocky Linux moduł jest częścią pakietu httpd i zwykle jest już załadowany. Sprawdzisz to poleceniem:

grep mod_remoteip.so /etc/httpd/conf.modules.d/00-base.conf

Jeśli linia LoadModule remoteip_module modules/mod_remoteip.so jest obecna i nie jest zakomentowana znakiem #, moduł działa. Gdyby była zakomentowana, usuń # na jej początku.

Następnie dodaj ustawienia modułu w konfiguracji Apache. Na AlmaLinux i Rocky umieść je w nowym pliku w /etc/httpd/conf.d/ (np. remoteip.conf), a na Debianie i Ubuntu w pliku w /etc/apache2/conf-available/ włączonym poleceniem a2enconf. Możesz też wpisać je wprost w bloku wirtualnego hosta:

RemoteIPHeader CF-Connecting-IP

# Zakresy Cloudflare (wpisz pełną, aktualną listę z cloudflare.com/ips)
RemoteIPTrustedProxy 173.245.48.0/20
RemoteIPTrustedProxy 103.21.244.0/22
RemoteIPTrustedProxy 2400:cb00::/32
# ... pozostałe zakresy IPv4 i IPv6 ...

Żeby prawdziwy adres trafiał też do logów, zaktualizuj definicję formatu logu, używając %a zamiast %h. Znajdziesz ją w głównym pliku konfiguracji Apache: Na Debianie i Ubuntu w /etc/apache2/apache2.conf, a na AlmaLinux i Rocky w /etc/httpd/conf/httpd.conf (szukaj wierszy zaczynających się od LogFormat). Podmień format combined na:

LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

Logi poszczególnych stron korzystają z tego formatu przez wpis CustomLog ... combined w ich wirtualnych hostach, więc po tej zmianie prawdziwe IP pojawi się w logach wszystkich witryn używających combined.

Na koniec sprawdź konfigurację i przeładuj Apache (apachectl configtest oraz systemctl reload apache2 lub httpd). Aplikacje PHP zobaczą prawdziwy adres w REMOTE_ADDR bez dodatkowych zmian w kodzie.

Wskazówka

Jeśli używasz panelu hostingowego na VPS, sprawdź najpierw jego ustawienia. Część paneli ma gotową opcję integracji z Cloudflare, która konfiguruje prawdziwe IP za Ciebie. Panele opisujemy w artykule o panelach na VPS.

Dlaczego nagłówka nie da się podrobić

Konfiguracja z listą zaufanych proxy jest odporna na podrobienie IP. Serwer odczytuje CF-Connecting-IP tylko z połączeń przychodzących z zakresów Cloudflare. Jeśli ktoś połączy się bezpośrednio z innego adresu i podstawi własny nagłówek, serwer go zignoruje, bo to połączenie nie jest na liście zaufanych proxy, i użyje prawdziwego adresu, z którego przyszło połączenie. Sama poprawna lista set_real_ip_from (Nginx) lub RemoteIPTrustedProxy (Apache) wystarcza więc, by nikt nie podszył się pod cudze IP.

Warto wymusić ruch przez Cloudflare

To osobna sprawa od odczytu IP. Nawet przy poprawnej konfiguracji ktoś może połączyć się wprost z adresem Twojego serwera i ominąć Cloudflare, czyli jego ochronę przed atakami, filtrowanie ruchu i cache. Dlatego warto ograniczyć w firewallu ruch WWW (porty 80 i 443) tylko do zakresów Cloudflare, zgodnie z artykułem o firewallu na VPS.

Informacja

To dwie różne warstwy. Lista zaufanych proxy odpowiada za to, że prawdziwe IP nie da się podrobić. Firewall ograniczający origin do Cloudflare to dodatkowe zabezpieczenie: Nie dotyczy podrabiania nagłówka, tylko uniemożliwia obejście Cloudflare przez połączenie bezpośrednio z serwerem.

Sprawdź, czy działa

Wejdź na stronę i zajrzyj do logu dostępu serwera. Zamiast adresów Cloudflare powinny pojawić się prawdziwe adresy IP odwiedzających. Możesz też wyświetlić REMOTE_ADDR w prostym skrypcie PHP i porównać z własnym adresem IP.

Najczęstsze pytania

Dlaczego w statystykach widzę kilka powtarzających się adresów IP?

To adresy Cloudflare, przez które przechodzi cały ruch. Po skonfigurowaniu modułu realip (Nginx) lub mod_remoteip (Apache) w logach pojawią się prawdziwe adresy IP odwiedzających.

Czy muszę aktualizować listę zakresów Cloudflare?

Tak. Cloudflare z czasem zmienia swoje zakresy IP, więc co jakiś czas porównaj konfigurację z aktualną listą na cloudflare.com/ips. Pominięcie nowego zakresu sprawi, że dla części ruchu prawdziwe IP nie zostanie odczytane.

Czy to konfiguruje się też na hostingu współdzielonym?

Nie. Na hostingu serwerem zarządzamy my, a integrację Cloudflare z usługą opisujemy w artykule o Cloudflare z hostingiem webh. Ten poradnik dotyczy VPS, gdzie konfigurujesz serwer WWW samodzielnie.

Prawdziwe IP nadal się nie pojawia, co sprawdzić?

Upewnij się, że moduł jest włączony, lista zakresów Cloudflare jest pełna i aktualna, a serwer został przeładowany po zmianach. Sprawdź też, czy ruch faktycznie idzie przez Cloudflare (rekord DNS w trybie proxy, czyli z pomarańczową chmurką).