Перенаправить реальный ip-клиент nginx
Как отправить на прокси-сервер реальный ip клиента? Мои настройки:
server {
listen 80;
server_name foo.example.com;
location / {
proxy_pass http://someip;
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_pass_request_headers on;
}
}
Но ip все еще от прокси nginx.
2 ответа
Насколько я знаю, вы не можете заставить nginx поставить реальный исходный ip в заголовок ip.
Я рекомендую провести рефакторинг приложения, чтобы прочитать заголовок X-Real-IP, который вы установили в своей конфигурации.
Если приложение не может обрабатывать заголовок X-Real-IP, вы можете использовать HAProxy или Keepalived для достижения этой цели.
Для HAProxy вы должны установить источник в конфигурации бэкэнда:
source 0.0.0.0 usesrc clientip
Вы должны включить модуль TPROXY в ядре Linux.
И система HAProxy должна быть шлюзом по умолчанию для вашего сервера приложений, чтобы это работало.
Вы также должны настроить некоторые параметры sysctl:
net.ipv4.conf.all.forwarding => 1
net.ipv4.conf.all.send_redirects => 1
И некоторые правила iptables:
iptables -t mangle -N DIVERT
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 777
iptables -t mangle -A DIVERT -j ACCEPT
И настроить маршрутизацию с метками брандмауэра
ip rule add fwmark 777 lookup 700
ip route add local 0.0.0.0/0 dev lo table 700
Для получения реального IP-адреса от nginx необходимы два шага:
1). Установите этот адрес в заголовок HTTP на nginx (вы уже это сделали): https://www.nginx.com/resources/wiki/start/topics/examples/full/?highlight=proxy_set_header
2). Чтобы настроить софт, который получает этот заголовок, чтобы понять его. Если у вас есть Apache - стандартный модуль "remoteip" будет подходящим решением для этой цели. Если вы используете что-то еще - просто попробуйте перехватить эту строку X-Real-IP из заголовка.
Пример с nginx+Apache
Для Apache:
sudo a2enmod remoteip.load
- добавить эту строку
RemoteIPHeader X-Real-IP
в основной Apache конф. Например apache2.conf или httpd.conf - зависят от ОС. Вы можете найти его в каталогах /etc/apache2 или / etc / httpd. sudo service apache2 restart
Для nginx:
- добавьте строки в nginx.conf:
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
sudo service nginx restart
PS Для очень старой версии Apache без модуля "remoteip" используйте "mod_rpaf" - его можно установить через "apxs".