{"id":2170,"date":"2026-07-21T08:36:00","date_gmt":"2026-07-21T07:36:00","guid":{"rendered":"https:\/\/jalvo.eu\/prawdziwe-ip-klienta-za-reverse-proxy\/"},"modified":"2026-09-25T00:16:55","modified_gmt":"2026-09-24T23:16:55","slug":"prawdziwe-ip-klienta-za-reverse-proxy","status":"publish","type":"post","link":"https:\/\/jalvo.eu\/pl\/prawdziwe-ip-klienta-za-reverse-proxy\/","title":{"rendered":"Prawdziwe IP klienta za reverse proxy: jak zrobi\u0107 to dobrze"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u017beby zobaczy\u0107 prawdziwe IP klienta za reverse proxy, potrzebujesz dw\u00f3ch rzeczy. Proxy musi przekaza\u0107 adres odwiedzaj\u0105cego w nag\u0142\u00f3wku \u017c\u0105dania. A serwer docelowy musi przyjmowa\u0107 ten nag\u0142\u00f3wek tylko od zaufanych adres\u00f3w proxy. Logi dost\u0119pu, analityka i weryfikacja crawler\u00f3w pokazuj\u0105 jeden adres proxy zamiast prawdziwych u\u017cytkownik\u00f3w i bot\u00f3w? W takim razie brakuje jednego z tych dw\u00f3ch element\u00f3w. Poni\u017cej: jak adres si\u0119 gubi, kt\u00f3re nag\u0142\u00f3wki go przenosz\u0105, jak go przywr\u00f3ci\u0107 modu\u0142em nginx real_ip i jak sprawdzi\u0107, \u017ce poprawka naprawd\u0119 dzia\u0142a.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dlaczego serwer zapisuje adres proxy zamiast adresu odwiedzaj\u0105cego?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bo to proxy otwiera po\u0142\u0105czenie TCP z Twoim serwerem. Z definicji wi\u0119c to proxy jest adresem zdalnym. Odwiedzaj\u0105cy \u0142\u0105czy si\u0119 z proxy, a proxy nawi\u0105zuje zupe\u0142nie nowe po\u0142\u0105czenie z serwerem docelowym. W tym drugim po\u0142\u0105czeniu nic nie m\u00f3wi, kto wys\u0142a\u0142 pierwotne \u017c\u0105danie, chyba \u017ce proxy to dopisze.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A skutki uboczne szybko si\u0119 mno\u017c\u0105:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ka\u017cdy wpis w logu dost\u0119pu ma ten sam adres IP,<\/li>\n<li>weryfikacja bot\u00f3w przez reverse DNS nie przechodzi, bo proxy to nie Googlebot,<\/li>\n<li>raporty geolokalizacji pokazuj\u0105 po\u0142o\u017cenie proxy, a nie Twoich odbiorc\u00f3w,<\/li>\n<li>regu\u0142y allow, deny i blokady per IP trafiaj\u0105 w proxy, a razem z nim we wszystkich.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ten ostatni punkt boli najbardziej. Zablokujesz jeden uci\u0105\u017cliwy adres i odetniesz ca\u0142\u0105 publiczno\u015b\u0107.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W pracy nad SEO jest gorzej, ni\u017c si\u0119 wydaje. <a href=\"https:\/\/jalvo.eu\/reading-server-logs-crawl-problems\/\">Analiza log\u00f3w serwera<\/a> pod k\u0105tem problem\u00f3w z crawlowaniem dzia\u0142a tylko wtedy, gdy wiesz, kt\u00f3re \u017c\u0105dania przysz\u0142y od prawdziwych crawler\u00f3w. Je\u015bli ka\u017cda linia ma ten sam adres, co w\u0142a\u015bciwie analizujesz? Poprawka dotyczy dw\u00f3ch miejsc: proxy wysy\u0142a adres, a serwer docelowy decyduje, czy mu ufa\u0107.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">X-Forwarded-For, X-Real-IP i nag\u0142\u00f3wek Forwarded: kt\u00f3ry przenosi IP klienta?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ka\u017cdy z nich mo\u017ce. W\u0142a\u015bciwy to po prostu ten, kt\u00f3ry Twoje proxy faktycznie wysy\u0142a. R\u00f3\u017cni\u0105 si\u0119 formatem i popularno\u015bci\u0105:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Nag\u0142\u00f3wek X-Forwarded-For<\/strong>: lista adres\u00f3w oddzielonych przecinkami, do kt\u00f3rej ka\u017cde proxy dopisuje adres, od kt\u00f3rego dosta\u0142o \u017c\u0105danie. Pierwszy wpis od lewej to deklarowany pierwotny klient (zwr\u00f3\u0107 uwag\u0119 na s\u0142owo &#8222;deklarowany&#8221;).<\/li>\n<li><strong>X-Real-IP<\/strong>: pojedynczy adres, bez \u0142a\u0144cucha, zwykle ustawiany przez proxy NGINX.<\/li>\n<li><strong>Nag\u0142\u00f3wek Forwarded (RFC 7239)<\/strong>: ustandaryzowana forma z parametrami <em>for=<\/em>, <em>proto=<\/em> i <em>by=<\/em>. W praktyce spotykany rzadziej.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Tu jest haczyk. Ka\u017cdy klient mo\u017ce wys\u0142a\u0107 te nag\u0142\u00f3wki sam. Warto\u015b\u0107 jest wi\u0119c tyle warta, ile proxy, kt\u00f3re zapisa\u0142o ostatni wpis. Nie zgaduj te\u017c, jaki nag\u0142\u00f3wek dodaje Twoje proxy. Zapytaj dostawc\u0119, a potem obejrzyj surowe \u017c\u0105danie i sprawd\u017a to sam.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jak przywr\u00f3ci\u0107 prawdziwe IP klienta modu\u0142em nginx real_ip<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Modu\u0142 nginx real_ip podmienia adres klienta na warto\u015b\u0107 z wybranego przez Ciebie nag\u0142\u00f3wka, a je\u015bli nag\u0142\u00f3wek zawiera port, podmienia te\u017c port. Wszystko to opisuje <a href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_realip_module.html\" rel=\"nofollow noopener\" target=\"_blank\">oficjalna dokumentacja modu\u0142u ngx_http_realip_module<\/a>. Konfiguracja to pi\u0119\u0107 krok\u00f3w:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Sprawd\u017a, czy modu\u0142 jest dost\u0119pny w Twojej kompilacji (<code>nginx -V<\/code> wypisuje wkompilowane modu\u0142y).<\/li>\n<li>Wpisz zakresy proxy w <code>set_real_ip_from<\/code>, jako pojedyncze adresy IPv4 lub IPv6 albo bloki CIDR.<\/li>\n<li>Wybierz nag\u0142\u00f3wek w <code>real_ip_header<\/code>.<\/li>\n<li>W\u0142\u0105cz <code>real_ip_recursive<\/code>, gdy \u017c\u0105dania przechodz\u0105 przez wi\u0119cej ni\u017c jedno proxy.<\/li>\n<li>Prze\u0142aduj nginx i przetestuj.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Minimalny blok w kontek\u015bcie <code>http<\/code> lub <code>server<\/code> wygl\u0105da tak. Przyk\u0142adowe zakresy zamie\u0144 na faktyczne adresy swojego proxy:<\/p>\n\n\n\n<pre><code>set_real_ip_from 192.168.1.0\/24;\nset_real_ip_from 2001:0db8::\/32;\nreal_ip_header X-Forwarded-For;\nreal_ip_recursive on;<\/code><\/pre>\n<p class=\"wp-block-paragraph\">Gdy to zadzia\u0142a, <code>$remote_addr<\/code> i log dost\u0119pu pokazuj\u0105 odwiedzaj\u0105cego. Logowanie i regu\u0142y allow\/deny po prostu dzia\u0142aj\u0105, bez \u017cadnych innych zmian.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zaufane adresy proxy: dlaczego ta lista decyduje o wszystkim<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nginx podmienia adres tylko wtedy, gdy po\u0142\u0105czenie przychodzi z jednego z zaufanych adres\u00f3w proxy w <code>set_real_ip_from<\/code>. Ta lista to ca\u0142a Twoja granica bezpiecze\u0144stwa. Naprawd\u0119 ca\u0142a. Przy wy\u0142\u0105czonym trybie rekurencyjnym nginx bierze ostatni\u0105 warto\u015b\u0107 z nag\u0142\u00f3wka. Przy w\u0142\u0105czonym bierze ostatni adres, kt\u00f3rego nie ma na li\u015bcie zaufanych, czyli pomija Tw\u00f3j w\u0142asny \u0142a\u0144cuch proxy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Za szeroka lista (na przyk\u0142ad <code>0.0.0.0\/0<\/code>) i ka\u017cdy mo\u017ce podrobi\u0107 swoje IP sfa\u0142szowanym nag\u0142\u00f3wkiem. Za w\u0105ska i adres proxy zostaje w logach. Aktualizuj j\u0105 wi\u0119c, gdy dostawca dodaje lub zmienia adresy wychodz\u0105ce. Jeszcze jedno, o czym ludzie zapominaj\u0105: zablokuj bezpo\u015bredni dost\u0119p do serwera docelowego spoza zakres\u00f3w proxy. Inaczej atakuj\u0105cy po prostu ominie proxy i wy\u015ble sfa\u0142szowany nag\u0142\u00f3wek prosto na Tw\u00f3j serwer. I po zabawie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">PROXY protocol: wyj\u015bcie, gdy nag\u0142\u00f3wki nie wystarczaj\u0105<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PROXY protocol przekazuje adres klienta na poziomie po\u0142\u0105czenia, a nie w HTTP. Przydaje si\u0119 przy TCP albo TLS passthrough, gdzie proxy w og\u00f3le nie widzi HTTP i nie mo\u017ce doda\u0107 nag\u0142\u00f3wk\u00f3w. W nginx w\u0142\u0105czasz <code>proxy_protocol<\/code> w dyrektywie <code>listen<\/code>, a potem ustawiasz <code>real_ip_header proxy_protocol<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Obie strony musz\u0105 si\u0119 jednak zgadza\u0107. Listener, kt\u00f3ry oczekuje PROXY protocol, odrzuca zwyk\u0142e po\u0142\u0105czenia. Zwyk\u0142y listener nie radzi sobie z dodatkowym nag\u0142\u00f3wkiem. Je\u015bli korzystasz z <a href=\"https:\/\/jalvo.eu\/services\/\">us\u0142ugi NGINX reverse proxy<\/a> Jalvo z adresami w UE i USA, ca\u0142a ta konfiguracja odbywa si\u0119 na Twoim w\u0142asnym serwerze docelowym.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jak sprawdzi\u0107, czy prawdziwe IP klienta jest poprawnie logowane<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Prosty test: Twoja w\u0142asna wizyta pojawia si\u0119 w logu z Twoim prawdziwym adresem, a sfa\u0142szowany nag\u0142\u00f3wek wys\u0142any prosto do serwera docelowego nic nie zmienia. Przejd\u017a przez t\u0119 list\u0119:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>wejd\u017a na stron\u0119 ze znanego IP i znajd\u017a je w <code>access.log<\/code>,<\/li>\n<li>wy\u015blij sfa\u0142szowany <code>X-Forwarded-For<\/code> bezpo\u015brednio do serwera docelowego i sprawd\u017a, \u017ce zosta\u0142 zignorowany,<\/li>\n<li>sprawd\u017a, czy adresy crawler\u00f3w w logu rozwi\u0105zuj\u0105 si\u0119 przez reverse DNS,<\/li>\n<li>por\u00f3wnaj dane geolokalizacji w analityce przed zmian\u0105 i po niej.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Na czas test\u00f3w logowa\u0142bym <code>$http_x_forwarded_for<\/code> obok <code>$remote_addr<\/code>, \u017ceby widzie\u0107 surowy \u0142a\u0144cuch. Najcz\u0119stsze b\u0142\u0119dy? Pomini\u0119te zakresy IPv6. Liter\u00f3wka albo z\u0142a nazwa nag\u0142\u00f3wka. I dwie warstwy, na przyk\u0142ad CDN przed proxy, bez trybu rekurencyjnego. Je\u015bli dopiero wybierasz rozwi\u0105zanie, najpierw por\u00f3wnaj <a href=\"https:\/\/jalvo.eu\/reverse-proxy-vs-vpn-which-is-better-for-seo\/\">reverse proxy i VPN<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowanie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Przywr\u00f3cenie prawdziwego IP klienta za reverse proxy sprowadza si\u0119 do trzech rzeczy: proxy wysy\u0142a adres, serwer docelowy ufa tylko znanym zakresom proxy, a Ty testujesz wynik. W wi\u0119kszo\u015bci konfiguracji wystarczy modu\u0142 nginx real_ip z w\u0105sk\u0105 list\u0105 <code>set_real_ip_from<\/code> i trybem rekurencyjnym. Chcesz wi\u0119cej w tym temacie? Przejrzyj <a href=\"https:\/\/jalvo.eu\/category\/seo\/\">poradniki technicznego SEO o hostingu<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">FAQ<\/h2>\n\n\n<div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list \">\n<div id=\"faq-question-1790291400052-0\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Czy odwiedzaj\u0105cy mog\u0105 podrobi\u0107 swoje IP przez nag\u0142\u00f3wek X-Forwarded-For?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Tak, je\u015bli serwer docelowy ufa temu nag\u0142\u00f3wkowi od ka\u017cdego. Ogranicz <code>set_real_ip_from<\/code> do zakres\u00f3w swojego proxy i zablokuj bezpo\u015bredni dost\u0119p do serwera docelowego, a problem znika.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1790291400052-1\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">U\u017cy\u0107 X-Forwarded-For czy nag\u0142\u00f3wka Forwarded?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Tego, kt\u00f3ry Twoje proxy faktycznie wysy\u0142a. Forwarded, zdefiniowany w RFC 7239, jest standardem. Ale X-Forwarded-For ma znacznie szersze wsparcie w narz\u0119dziach i parserach log\u00f3w.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1790291400052-2\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Dlaczego po w\u0142\u0105czeniu real_ip logi nadal pokazuj\u0105 IP proxy?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Zwykle z jednego z trzech powod\u00f3w: brakuje adresu \u0142\u0105cz\u0105cego si\u0119 serwera w <code>set_real_ip_from<\/code>, nazwa nag\u0142\u00f3wka nie zgadza si\u0119 z tym, co wysy\u0142a proxy, albo nginx nie zosta\u0142 prze\u0142adowany. \u017beby znale\u017a\u0107 przyczyn\u0119, loguj surowy nag\u0142\u00f3wek obok <code>$remote_addr<\/code>.<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>\u017beby zobaczy\u0107 prawdziwe IP klienta za reverse proxy, potrzebujesz dw\u00f3ch rzeczy. Proxy musi przekaza\u0107 adres odwiedzaj\u0105cego w nag\u0142\u00f3wku \u017c\u0105dania. A serwer docelowy musi przyjmowa\u0107 ten nag\u0142\u00f3wek tylko od zaufanych adres\u00f3w proxy. Logi dost\u0119pu, analityka i weryfikacja crawler\u00f3w pokazuj\u0105 jeden adres proxy zamiast prawdziwych u\u017cytkownik\u00f3w i bot\u00f3w? W takim razie brakuje jednego z tych dw\u00f3ch element\u00f3w. [&hellip;]<\/p>\n","protected":false},"author":25,"featured_media":2144,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[182],"tags":[],"class_list":["post-2170","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-seo-pl"],"acf":[],"_links":{"self":[{"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/posts\/2170","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/users\/25"}],"replies":[{"embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/comments?post=2170"}],"version-history":[{"count":1,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/posts\/2170\/revisions"}],"predecessor-version":[{"id":2180,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/posts\/2170\/revisions\/2180"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/media\/2144"}],"wp:attachment":[{"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/media?parent=2170"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/categories?post=2170"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/tags?post=2170"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}