Opis nagłówka HTTP w Wikipedii X-Forwarded-For
to:
X-Forwarded-For: klient1, proxy1, proxy2, ...
Dokumentacja nginx dla tej dyrektywy real_ip_header
brzmi częściowo:
Niniejsza dyrektywa określa nazwę nagłówka używanego do przesyłania zastępczego adresu IP.
W przypadku X-Forwarded-For, ten moduł używa ostatniego adresu IP w nagłówku X-Forwarded-For do wymiany. [Moje podkreślenie]
Te dwa opisy wydają się ze sobą sprzeczne. W naszym scenariuszu X-Forwarded-For
nagłówek jest dokładnie taki, jak opisano - „rzeczywisty” adres IP klienta jest pozycją najbardziej po lewej stronie. Podobnie zachowanie nginx polega na użyciu najwyższej wartości z prawej strony - która oczywiście jest tylko jednym z naszych serwerów proxy.
Rozumiem X-Real-IP
, że powinien on służyć do określania rzeczywistego adresu IP klienta - nie proxy. Czy coś pomijam, czy jest to błąd w Nginx?
A poza tym, czy ktoś ma jakieś sugestie, jak ustawić X-Real-IP
wyświetlanie nagłówka na skrajnej lewej wartości, jak wskazuje definicja X-Forwarded-For
?
źródło
Analiza
X-Forwarded-For
nagłówka jest rzeczywiście wadliwa w module nginx real_ip.Zaczyna się po prawej stronie łańcucha nagłówka i gdy tylko zobaczy spację lub przecinek, przestaje szukać i umieszcza część po prawej stronie spacji lub przecinka w zmiennej IP. Tak więc traktuje najnowszy adres proxy jako oryginalny adres klienta .
Zgodnie ze specyfikacją nie gra się dobrze; istnieje niebezpieczeństwo, że nie zostanie to określone w bolesny sposób w RFC.
Poza tym: trudno jest znaleźć dobre podstawowe źródło formatu, który pierwotnie zdefiniował Squid - przegląd ich dokumentacji potwierdza zamówienie; leftmost jest oryginalnym klientem, najbardziej na prawo jest najnowszym dodatkiem. Kusi mnie, aby dodać [potrzebne źródło] do tej strony wikipedii. Jedna anonimowa edycja wydaje się być autorytetem Internetu w tej dziedzinie.
Jeśli to możliwe, czy Twoje pośredniczące serwery proxy mogą przestać dodawać się na końcu nagłówka, pozostawiając tylko prawdziwy adres klienta?
źródło
X-Forwarded-For
już istnieje. (jest to poprawny adres IP klienta) sam nginx następnie dołącza adres IP naszego modułu równoważenia obciążenia (poprzedniego przeskoku) doX-Forwarded-For
nagłówka. (przypuszczalnie dołączając to, co postrzega jako „zdalny adres”) Gdyby tego po prostu nie zrobił, byłbym w stanie po prostu użyćX-Forwarded-For
nagłówka jak poprzednio. (niedawno przeprowadziliśmy migrację do nginx)proxy_pass
- i nawet wtedy, gdy jestproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
na miejscu.X-Forwarded-For
nagłówek z prawdopodobnie pierwotnym adresem klienta po lewej stronie i ewentualnie wszelkie wcześniejsze serwery proxy do niego dołączone. Tak więc obecnie serwujący serwer proxy dodałby poprzedni serwer proxy (= inicjator) na końcu tej listy i służyłby w ten sposób powiększonyX-Forwarded-For
nagłówek do następnego przeskoku w górę. To prawda, że mogli wybrać bardziej oczywiste sformułowanie.X-Real-IP to adres IP rzeczywistego klienta, z którym rozmawia serwer („prawdziwy” klient serwera), który w przypadku połączenia proxy jest serwerem proxy. Właśnie dlatego X-Real-IP będzie zawierać ostatni adres IP w nagłówku X-Forwarded-For.
źródło
X-Real-IP
zwracanie adresu IP mojego własnego serwera proxy byłoby kiedykolwiek przydatne?