Главная
Главная Руководства WWW › nginx - проксируем запросы с передачей ip клиента



Автор:

Статья опубликована: 2021-02-24 13:41:59
Последние правки: 2021-02-24 14:43:25

Проксируем запросы к сайтам через nginx на другой nginx. Передаем бекенду реальный ip клиента, для записи в лог.

  • Исходные данные

    Фронт:
    на него приходят запросы от клиентов, он передает запросы на бекенд.
    ip-адрес, с которого идет проксирование на бекенд: 192.168.1.3

    Бек:
    обслуживает запросы и отдает их фронту
    ip-адрес: 192.168.4.6

    Если дополнительно не подсуетиться, то в логах бекенда вы увидите не реальный ip клиента, а ip фронта (в нашем случае это 192.168.1.3). Путем несложных манипуляций мы это исправим.


  • Фронт

    для каждого проксируемого сайта, делаем такой конфиг (в примере также есть переадресация с http на https):
    server {
        listen 80;
        server_name www.server.ru;
        rewrite ^/(.*) https://www.server.ru/$1 permanent;
    }
    server {
        listen 443 ssl http2;
        server_name www.server.ru;
        access_log off;
        ssl_certificate            /etc/ssl/private/server.ru/fullchain.cer;
        ssl_certificate_key        /etc/ssl/private/server.ru/server.ru.key;
        location / {
            proxy_pass https://192.168.4.6:443;
            include proxy_params;
        }
    }
    
    В файле proxy_params должны быть как минимум эти строки:
    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;
    


  • Бек

    Если у вас FreeBSD, то nginx должен быть собран с поддержкой модуля http_realip:
    [x] HTTP_REALIP               Enable http_realip module
    
    В конфигурацию каждого сайта (server), который проксируется с фронта, необходимо добавить две строчки (можно и через include):
    set_real_ip_from 192.168.1.3;
    real_ip_header X-Real-IP;
    
    первая строка указывает с какого ip идет проксирование, заголовок с реальным ip будет писаться только для запросов с заданного в этой строке ip. Если записать только вторую строчку, то никакой подмены ip не произойдет.