Я уже описывал, что у меня есть машина с 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-адрес клиента нам нужны правки как на проксирующем web-сервере (FRONTEND), так и на машинах с конкретной ролью (BACKEND).
Рассмотрим два варианта:
nginx → apachenginx → 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-адрес клиента.Проверяем файл конфигурации на отсутствие ошибок.
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>
192.168.11.12 - адрес моего проксирующего web–сервера. В вашем случае IP может отличаться.
Включаем модуль remoteip
sudo a2enmod remoteip
sudo a2enconf remoteip
После подправим формат логов в файле /etc/apache2/apache2.conf, заменив %h на %a.
Было:
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
sudo systemctl restart apache2.service
sudo systemctl status apache2.service
Теперь видно реальный 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;
192.168.11.12 - адрес моего проксирующего web–сервера. В вашем случае IP может отличаться.
Проверяем, что мы написали все правильно:
sudo nginx -t
Перезапускаем службу nginx на BACKEND_2.
sudo systemctl restart nginx
Смотрим логи и видим реальные IP-адреса клиентов.
Теперь справились и со вторым вариантом.
— Николай Кутузов 2026/10/17 19:58