HAProxy SSL-завершение с перенаправлением http на https теряет информацию X-Client-IP с send-proxy на NGINX - PullRequest
0 голосов
/ 15 февраля 2020

ВЫПУСК

Я не могу видеть исходный remote-ip , исходящий извне, когда я использую SSL-терминацию в HAProxy и принудительно запускаю HTTPS. Если я не принудительно перенаправляю HTTP на HTTPS, из nginx -logs я вижу, что send-proxy фактически работает с HTTP. То же самое я вижу и в журналах HAProxy.

THEORY

Если я удалю все куки-файлы сайта, выключу перенаправление и открою версию HTTP, HAProxy покажет remote-ip правильно. После переключения перенаправления на HTTPS и открытия того же HTTP-сайта в журналах сначала будет показано соединение с remote-ip к внутреннему:

    176.93.182.162:49300 [14/Feb/2020:23:40:30.254] 80_443_frontend 80_443_frontend/(NOSRV) 

, а затем соединение с localhost (127.0. 0.1):

    127.0.0.1:35304 [14/Feb/2020:23:40:30.776] 80_443_frontend~ 80_443_backend/git 0/0/0/1/1 200

ЗАКЛЮЧЕНИЕ

Я думаю, что HAProxy будет направлять внутренние трафики c из 443 обратно в порт 80 по направлению к бэкэнду, и в в то же время переключите IP заголовка на свой собственный IP. Надеюсь, у кого-нибудь возникнет идея.

HAProxy находится внутри своего собственного контейнера lxd, как и NGINX !! Если это что-то меняет?

Это конфигурация в HAProxy:


    frontend 80_443_frontend
        bind *:80
        bind *:443 ssl crt /etc/ssl/git.domain.org/git.domain.org.pem alpn h2,http/1.1
        redirect scheme https code 301 if !{ ssl_fc }
        timeout client 1m
        option forwardfor
        option http-server-close
        acl letsencrypt-acl path_beg /.well-known/acme-challenge/
        use_backend letsencrypt_backend if letsencrypt-acl
        acl git_host hdr(host) -i git.domain.org

        use_backend 80_443_backend if git_host

    backend letsencrypt_backend
        server letsencrypt 127.0.0.1:8888

    backend 80_443_backend
        http-request set-header X-Client-IP %[src]
        server git git.lxd:80 send-proxy

1 Ответ

0 голосов
/ 15 февраля 2020

Ну, черт побери!

Нужно помнить, какие порты перенаправляются в контейнеры !!

Вот чего не хватало:

sudo iptables -t nat -I PREROUTING -i eth0 -p TCP -d PUBLIC_IP/32 --dport 443 -j DNAT --to-destination 10.4.21.53:443
...