将 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
问题
当我在 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