Передача реального IP-адреса клиента

Я уже описывал, что у меня есть машина с nginx (здесь и далее FRONTEND), а за ней машина с Matrix-Synapse (здесь и далее BACKEND_1), использующая web-сервер Apache2 и другая машина с Mail сервером (здесь и далее BACKEND_2), где используется web-сервер nginx. Так вот дело в том, что вторым машинам (здесь имеются в виду как BACKEND_1, так и BACKEND_2) передается не реальный IP-адрес клиента, а IP-адрес первой машины с nginx (FRONTEND). Как же передать на BACKEND правильный адрес? Давайте разбираться.

Что мы имеем на данный момент? Если посмотреть в логах, например, на BACKEND_1, введя команду

sudo tail -F /var/log/apache2/access.log

то можно увидеть, что все запросы для BACKEND_1 идут с ip-адреса моего проксирующего nginx.

IP-адрес прокси-сервера

Для того, чтобы передать реальный IP-адрес клиента нам нужны правки как на проксирующем web-сервере (FRONTEND), так и на машинах с конкретной ролью (BACKEND).

Рассмотрим два варианта:

  1. nginx → apache
  2. nginx → nginx

Приступаем!

В обоих вариантах прежде всего нужно внести некоторые изменения в конфигурацию на FRONTEND'е.

Рассмотрим вариант BACKEND_1. Напомню, что на машине с Matrix-Synapse мной была настроена админка по адресу https://mtx-adm.nikkutuzov.ru. Настроим передачу реального IP-адреса клиента для нее.

Открываем конфигурационный файл mtx-adm.nikkutuzov.ru.conf на машине с nginx (FRONTEND).

sudo nano /etc/nginx/sites-available/mtx-adm.nikkutuzov.ru.conf

и добавим несколько строк в секцию location /

proxy_set_header Host $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;

Описание используемых директив:

  • proxy_set_header Host $host; — Передает оригинальный заголовок Host, чтобы проксируемый сервер знал, какой хост был запрошен клиентом;
  • proxy_set_header X-Real-IP $remote_addr; — Передает реальный IP-адрес клиента, чтобы конечный сервер знал, откуда пришел запрос;
  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; — Передает цепочку IP-адресов всех прокси, через которые прошел запрос, включая реальный IP-адрес клиента.

Текст отредактированного mtx.nikkutuzov.ru.conf

Проверяем файл конфигурации на отсутствие ошибок.

sudo nginx -t

И перезапускаем службу nginx

sudo systemctl restart nginx

На этом настройка FRONTEND'а окончена. Приступаем к настройке BACKEND_1.

Вариант nginx → apache рассмотрим на примере машины с Matrix-Synapse.

В Apache 2.4 входит модуль mod_remoteip, который может перезаписывать удаленный IP-адрес. Настроим его, чтобы он принимал проброс IP-адреса с прокси-сервера nginx.

Создаем конфигурационный файл remoteip.conf.

sudo nano /etc/apache2/conf-available/remoteip.conf

И записываем в него следующее:

<IfModule remoteip_module>
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 127.0.0.1 192.168.11.12
</IfModule>

Текст отредактированного remoteip.conf

:!: 192.168.11.12 - адрес моего проксирующего web–сервера. В вашем случае IP может отличаться.

Включаем модуль remoteip

sudo a2enmod remoteip
sudo a2enconf remoteip

После подправим формат логов в файле /etc/apache2/apache2.conf, заменив %h на %a.

Было:

Apache2.conf до исправления

sudo nano /etc/apache2/apache2.conf
LogFormat "%v:%p %a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%a %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

Стало:

Apache2.conf после исправления

Перезапускаем и проверяем состояние службы Apache2

sudo systemctl restart apache2.service
sudo systemctl status apache2.service

Перезапускаем и проверяем работоспособность Apache

Теперь видно реальный IP-адрес клиента:

Реальный IP-адрес клиента

С этим справились. Рассмотрим второй вариант.

Вариант nginx → nginx рассмотрим на примере машины с почтовым сервером.

Сам модуль realIP в большинстве современных дистрибутивов Linux (Ubuntu, Debian, RHEL) уже включен в пакет nginx по умолчанию. Поэтому поставляемый из официальных репозиториев nginx пересобирать из исходного кода с добавлением этого модуля (–with-http_realip_module) обычно не требуется.

Нужно поправить конфигурационный файл nginx.

Для HTTP-соединения:

sudo nano /etc/nginx/sites-available/00-default.conf

Для HTTPS-соединения:

sudo nano /etc/nginx/sites-available/00-default-ssl.conf

Вносим следующие строки в секцию server

# IP-адрес вашего внутреннего или внешнего реверса-прокси (балансировщика)
set_real_ip_from 192.168.11.12;
# Заголовок, из которого Nginx будет брать реальный IP клиента
real_ip_header X-Forwarded-For;
# Или используйте X-Real-IP, в зависимости от настроек вашего прокси:
# real_ip_header X-Real-IP;
# Включаем рекурсивный поиск для цепочки прокси (опционально, но рекомендуется)
  real_ip_recursive on;

Правим 00-default-ssl.conf

:!: 192.168.11.12 - адрес моего проксирующего web–сервера. В вашем случае IP может отличаться.

Проверяем, что мы написали все правильно:

sudo nginx -t

Перезапускаем службу nginx на BACKEND_2.

sudo systemctl restart nginx

Смотрим логи и видим реальные IP-адреса клиентов.

Реальные IP-адреса

Теперь справились и со вторым вариантом.

— Николай Кутузов 2026/10/17 19:58

Этот сайт использует куки. Находясь здесь, вы соглашаетесь с их хранением на вашем компьютере. Также вы подтверждаете, что прочитали и поняли нашу Политику конфиденциальности. Если вы не согласны - покиньте сайт.Больше информации о куки
  • etc/proxy_real_ip
  • Последнее изменение: 2026/10/17 19:58