Назад | Перейти на главную страницу

Перенаправить реальный 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.

Насколько я знаю, вы не можете заставить 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:

  1. sudo a2enmod remoteip.load
  2. добавить эту строку RemoteIPHeader X-Real-IP в главную конф. Apache. Например apache2.conf или httpd.conf - зависят от ОС. Вы можете найти его в каталогах / etc / apache2 или / etc / httpd.
  3. sudo service apache2 restart

Для nginx:

  1. добавьте строки в 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;
  2. sudo service nginx restart

P.S. Для очень старой версии Apache без модуля «remoteip» используйте «mod_rpaf» - его можно установить через «apxs».