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

ПРОБЛЕМА

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

ТЕОРИЯ

Если я удалю все файлы cookie сайта, отключу перенаправление и открою версию 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 будет направлять внутренний трафик с 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


person dicksteel    schedule 15.02.2020    source источник
comment
Это из журнала HAProxy с включенным перенаправлением HTTPS: Подключитесь с 127.0.0.1:35314 к 127.0.0.1:443 (80_443_frontend / HTTP)   -  person dicksteel    schedule 15.02.2020
comment
Это из журнала HAProxy с отключенным перенаправлением HTTP: Подключитесь с 176.93.182.162:49651 к 10.4.21.53:80 (80_443_frontend / HTTP)   -  person dicksteel    schedule 15.02.2020


Ответы (1)


Ну, трахни меня боком!

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

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

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
person dicksteel    schedule 15.02.2020