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

  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

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

Другие вопросы по тегам