REMOTE_ADDR IP-адрес обратного прокси-сервера Nginx вместо клиента

Моя проблема прямо противоположна этому вопросу: REMOTE_ADDR IP от пользователя вместо обратного прокси-сервера Nginx

Позволь мне объяснить. У меня есть веб-сервер (apache) за обратным прокси-сервером nginx. Когда я подключаюсь к веб-серверу через прокси, он добавляет некоторые заголовки (как и должно быть), но заголовок REMOTE_ADDR содержит IP-адрес клиента вместо прокси-сервера, хотя я не переопределяю его в своей конфигурации nginx.

Вот эта часть конфига nginx:

location / {
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
    add_header Referrer-Policy "same-origin";

    proxy_cookie_path / "/; secure; HttpOnly";

    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    # Even uncommenting the next line has NO EFFECT!
    #proxy_set_header REMOTE_ADDR "172.17.0.1";

    client_max_body_size 2g;

    proxy_pass http://172.17.0.2:80/;
}

И это вывод var_dump($_SERVER); Вместо

["REMOTE_ADDR"]=> string(14) "1.2.3.4"

я бы ожидал

["REMOTE_ADDR"]=> string(14) "172.17.0.1"

Полный вывод:

Apache/2.4.25 (Debian) Server at my.dedyn.io Port 80
" ["SERVER_SOFTWARE"]=> string(22) "Apache/2.4.25 (Debian)"
["SERVER_NAME"]=> string(16) "my.dedyn.io"
["SERVER_ADDR"]=> string(10) "172.17.0.2"
["SERVER_PORT"]=> string(2) "80"
["REMOTE_ADDR"]=> string(14) "1.2.3.4" ### CLIENT IP ###
["DOCUMENT_ROOT"]=> string(13) "/var/www/html"
["REQUEST_SCHEME"]=> string(4) "http"
["CONTEXT_PREFIX"]=> string(0) ""
["CONTEXT_DOCUMENT_ROOT"]=> string(13) "/var/www/html"
["SERVER_ADMIN"]=> string(19) "webmaster@localhost"
["SCRIPT_FILENAME"]=> string(23) "/var/www/html/index.php"
["REMOTE_PORT"]=> string(5) "49894"
["REDIRECT_URL"]=> string(23) "/settings/admin/logging"
["GATEWAY_INTERFACE"]=> string(7) "CGI/1.1"
["SERVER_PROTOCOL"]=> string(8) "HTTP/1.0"
["REQUEST_METHOD"]=> string(3) "GET"
["QUERY_STRING"]=> string(0) ""
["REQUEST_URI"]=> string(23) "/settings/admin/logging"
["SCRIPT_NAME"]=> string(10) "/index.php"
["PHP_SELF"]=> string(10) "/index.php"
["REQUEST_TIME_FLOAT"]=> float(1535537778.731)
["REQUEST_TIME"]=> int(1535537778)
["argv"]=> array(0) { }
["argc"]=> int(0) } array(47) {
["REDIRECT_HTTP_AUTHORIZATION"]=> string(0) ""
["REDIRECT_PATH_INFO"]=> string(0) ""
["REDIRECT_htaccessWorking"]=> string(4) "true" 
["REDIRECT_front_controller_active"]=> string(4) "true" 
["REDIRECT_STATUS"]=> string(3) "200"
["HTTP_AUTHORIZATION"]=> string(0) ""
["PATH_INFO"]=> string(0) ""
["htaccessWorking"]=> string(4) "true"
["front_controller_active"]=> string(4) "true"
["HTTP_HOST"]=> string(16) "my.dedyn.io"
["HTTP_X_FORWARDED_FOR"]=> string(14) "1.2.3.4" ### CLIENT IP ###
["HTTP_X_FORWARDED_PROTO"]=> string(5) "https"
["HTTP_CONNECTION"]=> string(5) "close"
["HTTP_USER_AGENT"]=> string(76) "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"
["HTTP_ACCEPT"]=> string(63) "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
["HTTP_ACCEPT_LANGUAGE"]=> string(14) "en-GB,en;q=0.5"
["HTTP_ACCEPT_ENCODING"]=> string(17) "gzip, deflate, br"
["HTTP_COOKIE"]=> string(334) "__Host-nc_sameSiteCookielax=true; __Host-nc_sameSiteCookiestrict=true; nc_sameSiteCookielax=true; nc_sameSiteCookiestrict=true; '''long string'''"
["HTTP_DNT"]=> string(1) "1"
["HTTP_UPGRADE_INSECURE_REQUESTS"]=> string(1) "1"
["HTTP_CACHE_CONTROL"]=> string(9) "max-age=0"
["PATH"]=> string(60) "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
["SERVER_SIGNATURE"]=> string(77) "

Что мне также кажется любопытным, так это то, что заголовок X-Real-IP не появляется в var_dump, только если я установил его вручную, скажем,

proxy_set_header X-Real-IP "test";

Попытка установить REMOTE_ADDR вручную также не работает. Есть подсказки?

Для полноты: я использую сервер openmediavault nginx, а apache запускается в экземпляре образа докера nextcloud:latest


person Daniel    schedule 29.08.2018    source источник
comment
Весь смысл этого proxy_set_header X-Real-IP $remote_addr; состоит в том, чтобы передать адрес клиента вверх по течению. Что произойдет, если вы измените его на proxy_set_header X-Real-IP $server_addr; или вообще удалите?   -  person miknik    schedule 29.08.2018
comment
@miknik хорошо, теперь это становится странным: когда я удаляю его, появляется новый заголовок: ["HTTP_CACHE_CONTROL"]=> string(9) "max-age=0" и изменяется REMOTE_ADDR: ["REMOTE_ADDR"]=> string(10) "172.17.0.1" это значение, которое я ожидал в первую очередь! Когда я устанавливаю его на $server_addr;, происходит то же самое, кроме того, появляется заголовок ["HTTP_X_REAL_IP"]=> string(12) "192.168.0.49" (который является IP-адресом прокси-сервера в локальной сети). Однако я не понимаю, почему заголовок X-Real-IP влияет на заголовок REMOTE_ADDR?   -  person Daniel    schedule 30.08.2018
comment
Потому что его заголовок используется для передачи IP-адреса клиента через обратный прокси-сервер. REMOTE_ADDR не является заголовком, это одна из переменных в массиве $_SERVER в php   -  person miknik    schedule 30.08.2018