HAProxy 做 TCP 反代获取客户端真实 IP
大约半年前,因为一些奇怪的原因,需要给博客添加 HAProxy 做基于 TCP 的反代,配置倒也简单,但是遇到一个很麻烦的问题,就是服务端无法获取到客户端的真实 IP 了,所有访问都有一个共同的来源:127.0.0.1,简直可怕。
当初解决这个问题也花了点时间,Google 了好几圈总算给解决了,分享一下解决方案。
全局配置就不贴了,关键配置如下:
frontend ft_ssl_vip
bind <公网 IP>:443
mode tcp
timeout client 5m
tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }
use_backend bk_ssl_nanpuyue_com if { req.ssl_sni -i nanpuyue.com }
use_backend bk_ssl_nanpuyue_com if { req.ssl_sni -m end .nanpuyue.com }
default_backend bk_ssl_nanpuyue_com
# nanpuyue.com
backend bk_ssl_nanpuyue_com
mode tcp
server http 127.0.0.1:2066 send-proxy
frontend ft_ssl_nanpuyue_com
mode http
bind 127.0.0.1:2066 ssl crt /path/nanpuyue_com.pem accept-proxy
option forwardfor
reqadd X-Forwarded-Proto:\ https
default_backend bk_http_nanpuyue_com
backend bk_http_nanpuyue_com
mode http
server http 127.0.0.1:80
server https 127.0.0.1:443 ssl verify none
其中 ft_ssl_vip 这个 frontend 是对外提供服务的,ft_ssl_nanpuyue_com 则不对外提供服务,只是一个内部中转,127.0.0.1 的 80 和 443 端口才是真正的 Web Server (我用的 Apache2)只也只绑定了 127.0.0.1,由于我的 Apache2 也配置了 SSL 并且懒得删除了,所以最后一个 bk_http_nanpuyue_com 有两个 server ,其实是不必要的。
现在我的haproxy 用的是域名匹配 转发 443端口 到后端 后端的网页是java 网页 用的是 pfx 格式的ssl 证书 那应怎么配置呢