{{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//