将 http 重定向到 https 的 HAProxy SSL-termination 丢失 X-Client-IP 信息 send-proxy 到 NGINX

HAProxy SSL-termination with redirect http to https is losing X-Client-IP information with send-proxy to NGINX

问题

当我在 HAProxy 中使用 SSL-Termination 并强制使用 HTTPS 时,我看不到来自外部的原始 remote-ip。如果我不强制 HTTP 到 HTTPS 重定向,我可以从 nginx-logs 看到 send-proxy 实际上正在使用 HTTP。我也可以从 HAProxy-logs 看到同样的事情。

理论

如果我删除站点的所有 cookie,关闭重定向并打开 HTTP 版本,HAProxy 将正确显示 remote-ip。将重定向切换到 HTTPS 并打开相同的 HTTP-site 后,日志将首先显示从 remote-ip 到后端的连接:

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

然后是来自本地主机 (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 到后端,同时将 header 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

好吧,让我侧身!

需要记住转发给容器的端口是什么!!

缺少的是:

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