Как отправить на прокси-сервер реальный 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.
Насколько я знаю, вы не можете заставить 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#proxy-conf
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:
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
P.S. Для очень старой версии Apache без модуля «remoteip» используйте «mod_rpaf» - его можно установить через «apxs».