Я хочу перенаправить IP-адрес реального клиента с haproxy на мои внутренние серверы в режиме tcp. Конфигурация Haproxy следующая:
frontend main
bind *:80
mode http
option forwardfor
option http-server-close
default_backend app-main
frontend https_main
bind *:443
mode tcp
option tcplog
option tcpka
default_backend app-ssl
backend app-main
balance roundrobin
server web1 192.168.1.22:8080 check fall 3 rise 2
server web2 192.168.1.33:8080 check fall 3 rise 2
backend app-ssl
balance roundrobin
mode tcp
option ssl-hello-chk
server web3 192.168.1.44:443
Бэкэнд-серверы для HTTP-запросов - это apache, и я заменил следующую строку в httpd.conf строками журнала, поэтому теперь я могу правильно получать IP-адреса клиента:
LogFormat "%h %l %u %t \"%r\" %>s %b %{X-Forwarded-For}i" common
Мой внутренний сервер для https использует Nginx в качестве reverse_proxy для завершения ssl и отправляет запросы на серверные части apache. Моя проблема в том, что я не знаю, как я могу получить реальный IP-адрес клиента в журналах nginx? Я много гуглил и нашел какое-то решение по serverfault и stackoverflow, но ни одно из них не решило мою проблему при пересылке IP-адреса клиента в режиме tcp в haproxy. Любая помощь приветствуется.
Вы должны использовать listen 443 ssl proxy_protocol;
на стороне nginx и send_proxy
директива на стороне Haproxy.
Моя рабочая конфигурация HA сторона:
# USED FOR some_service
frontend some_service_https
mode tcp
bind *:443
option tcplog
option forwardfor
default_backend some_service_https
backend some_service_https
balance roundrobin
stick-table type ip size 1m expire 1h
stick on src
server some_service 192.168.1.2:443 send-proxy check
И сторона NGINX:
set_real_ip_from 192.168.1.1; # HAproxy local IP
set_real_ip_from 183.55.111.30; # HAproxy external IP
real_ip_header proxy_protocol; # proxy_protocol needed
real_ip_recursive on;
upstream some_service {
server unix:/tmp/unicorn.some_service.sock fail_timeout=0;
}
server {
server_name some_service.myserver.com some_service_1.myserver.com;
listen 443 proxy_protocol; # proxy_protocol needed
root /opt/apps/some_service/current/public;
add_header X-Whom some_service_1.myserver.com;
Не забудьте добавить «send-proxy» на бэкэнд HA и real_ip_header proxy_protocol, а также прослушивать proxy_protocol для NGINX. Работает, даже если вы используете порт 80 или 443 или оба.