{{description>Передаем реальный IP-адрес клиента, если у нас обратный прокси-сервер nginx, а за ним web-сервер Apache и/или web-сервер nginx}}
====== Передача реального IP-адреса клиента ======
===== Теория =====
Я уже описывал, что у меня есть [[sw:lin:nginx_certbot|машина с nginx]] (здесь и далее ''FRONTEND''), а за ней [[sw:lin:synapse-matrix|машина с Matrix-Synapse]] (здесь и далее ''BACKEND_1''), использующая web-сервер ''Apache2'' и другая [[sw:lin:mail|машина с 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.
{{:etc:proxy_real_ip:01_mtx_realip_fakeip.jpg|IP-адрес прокси-сервера}}
Для того, чтобы передать реальный IP-адрес клиента нам нужны правки как на проксирующем web-сервере (''FRONTEND''), так и на машинах с конкретной ролью (''BACKEND'').
Рассмотрим два варианта:
- ''nginx'' → ''apache''
- ''nginx'' → ''nginx''
Приступаем!
==== Правим фронт (nginx) ====
В **обоих вариантах** прежде всего нужно внести некоторые изменения в конфигурацию на ''FRONTEND'е''.
Рассмотрим вариант ''BACKEND_1''. Напомню, что на [[sw:lin:synapse-matrix|машине с Matrix-Synapse]] мной была настроена админка по адресу https://mtx-adm.nikkutuzov.ru. Настроим передачу реального IP-адреса клиента для нее.
Открываем конфигурационный файл ''mtx-adm.nikkutuzov.ru.conf'' на [[sw:lin:nginx_certbot|машине с 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-адрес клиента.
{{:etc:proxy_real_ip:03_mtx_realip_nginx_text.jpg|Текст отредактированного mtx.nikkutuzov.ru.conf}}
Проверяем файл конфигурации на отсутствие ошибок.
sudo nginx -t
И перезапускаем службу ''nginx''
sudo systemctl restart nginx
На этом настройка ''FRONTEND'а'' окончена. Приступаем к настройке ''BACKEND_1''.
==== Правим бэк (Apache) ====
Вариант ''nginx'' → ''apache'' рассмотрим на примере [[sw:lin:synapse-matrix|машины с Matrix-Synapse]].
В Apache 2.4 входит модуль ''mod_remoteip'', который может перезаписывать удаленный IP-адрес. Настроим его, чтобы он принимал проброс IP-адреса с прокси-сервера ''nginx''.
Создаем конфигурационный файл ''remoteip.conf''.
sudo nano /etc/apache2/conf-available/remoteip.conf
И записываем в него следующее:
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 127.0.0.1 192.168.11.12
{{:etc:proxy_real_ip:05_mtx_realip_remoteipconf_text.jpg|Текст отредактированного remoteip.conf}}
:!: ''192.168.11.12'' - адрес моего проксирующего web–сервера. В вашем случае IP может отличаться.
Включаем модуль ''remoteip''
sudo a2enmod remoteip
sudo a2enconf remoteip
После подправим формат логов в файле /etc/apache2/apache2.conf, заменив ''%h'' на ''%a''.
Было:
{{:etc:proxy_real_ip:07_mtx_realip_remoteip_apache2conf_before.jpg|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
Стало:
{{:etc:proxy_real_ip:08_mtx_realip_remoteip_apache2conf_after.jpg|Apache2.conf после исправления}}
Перезапускаем и проверяем состояние службы ''Apache2''
sudo systemctl restart apache2.service
sudo systemctl status apache2.service
{{:etc:proxy_real_ip:09_mtx_realip_remoteip_apache2_reload_status.jpg|Перезапускаем и проверяем работоспособность Apache}}
Теперь видно реальный IP-адрес клиента:
{{:etc:proxy_real_ip:10_mtx_realip_remoteip_done.jpg|Реальный IP-адрес клиента}}
С этим справились. Рассмотрим второй вариант.
==== Правим бэк (nginx) ====
Вариант ''nginx'' → ''nginx'' рассмотрим на примере [[sw:lin:mail|машины с почтовым сервером]].
Сам модуль ''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;
{{:etc:proxy_real_ip:12_mail_realip_nginx_edit.jpg|Правим 00-default-ssl.conf}}
:!: ''192.168.11.12'' - адрес моего проксирующего web–сервера. В вашем случае IP может отличаться.
Проверяем, что мы написали все правильно:
sudo nginx -t
Перезапускаем службу ''nginx'' на ''BACKEND_2''.
sudo systemctl restart nginx
Смотрим логи и видим реальные IP-адреса клиентов.
{{:etc:proxy_real_ip:13_mail_realip_remoteip_done.jpg|Реальные IP-адреса}}
Теперь справились и со вторым вариантом.
--- //[[nikkutuzov@nikkutuzov.ru|Николай Кутузов]] 2026/10/17 19:58//