![HAProxy 作为 TCP 负载均衡器(SSL 直通)不起作用?](https://linux22.com/image/743891/HAProxy%20%E4%BD%9C%E4%B8%BA%20TCP%20%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%99%A8%EF%BC%88SSL%20%E7%9B%B4%E9%80%9A%EF%BC%89%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%EF%BC%9F.png)
我在将 HAProxy 设置为 TCP 负载平衡器(第 4 层)时遇到了一些问题,我希望得到您的建议。
我一直遵循网络上的许多指南,并得出了这种配置(日志中未显示任何错误,启动正常):
注意:真实域名已被屏蔽
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
daemon
user haproxy
group haproxy
log /dev/log local6 debug
maxconn 50000
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
#---------------------------------------------------------------------
# common defaults
#---------------------------------------------------------------------
defaults
mode tcp
log global
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
#---------------------------------------------------------------------
# dedicated stats page
#---------------------------------------------------------------------
listen stats
mode http
bind :22222
stats enable
stats uri /haproxy?stats
stats realm Haproxy\ Statistics
stats auth xxxxxx:xxxxxxxx
stats refresh 30s
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main_https_listen
bind *:443
mode tcp
option tcplog
# -------------------------------
# ACLs - SIT
# -------------------------------
acl acl_SIT_CI5 req.ssl_sni -i url1.domain.net
acl acl_SIT_HR8 req.ssl_sni -i url2.domain.net
# -------------------------------
# Conditions - SIT
# -------------------------------
use_backend backend_SIT_CI5 if acl_SIT_CI5
use_backend backend_SIT_HR8 if acl_SIT_HR8
#---------------------------------------------------------------------
# Backends
#---------------------------------------------------------------------
backend backend_SIT_CI5
mode tcp
balance source
option ssl-hello-chk
server server_SIT_CI5_1 host1.domain.net:443 check
server server_SIT_CI5_2 host2.domain.net:443 check
backend backend_SIT_HR8
mode tcp
balance source
option ssl-hello-chk
server server_SIT_HR8_1 host1.domain.net:443 check
server server_SIT_HR8_2 host2.domain.net:443 check
我已将 host1.domain.net 指向我的 haproxy vIP(它后面有一个带有虚拟 IP 的 keepalived 配置)。
现在访问时https://url1.domain.net(甚至https://负载均衡器URL但我认为这是正常的)我有一个错误无法显示此页面。在“高级设置”中启用 TLS 1.0、TLS 1.1 和 TLS 1.2,然后尝试连接到https://host1.domain.net再次。
单个 openssl s_client 可产生SSL 握手失败(没有证书等等)。
你知道我做错了什么吗?另外,我是否需要设置一些证书,因为我正在监听 443?(即使我不想解密这些证书或其他什么,因为我只希望我的 HAProxy 充当代理)。
我还尝试激活日志记录的调试模式,但它没有显示任何错误(也没有新日志)
注意:后端位于防火墙后面,后端与 HAProxy 之间的通信未在 443 上打开(仅从 Haproxy 到后端),是否需要定向? 为什么?
注2:在 haproxy 统计中,我可以看到所有后端都处于 UP 状态
此外,有没有办法知道/检查基于主机名(SNI)的重定向是否正常工作?(我的印象是连接停留在负载均衡器上,并没有重定向到后端,这就是我出现错误的原因)
Ahaproxy-vv得到:
HA-Proxy version 1.5.18 2016/05/10
Copyright 2000-2016 Willy Tarreau <[email protected]>
Build options :
TARGET = linux2628
CPU = generic
CC = gcc
CFLAGS = -O2 -g -fno-strict-aliasing -DTCP_USER_TIMEOUT=18
OPTIONS = USE_LINUX_TPROXY=1 USE_GETADDRINFO=1 USE_ZLIB=1 USE_REGPARM=1 USE_OPENSSL=1 USE_PCRE=1
Default settings :
maxconn = 2000, bufsize = 16384, maxrewrite = 8192, maxpollevents = 200
Encrypted password support via crypt(3): yes
Built with zlib version : 1.2.7
Compression algorithms supported : identity, deflate, gzip
Built with OpenSSL version : OpenSSL 1.0.2k-fips 26 Jan 2017
Running on OpenSSL version : OpenSSL 1.0.2k-fips 26 Jan 2017
OpenSSL library supports TLS extensions : yes
OpenSSL library supports SNI : yes
OpenSSL library supports prefer-server-ciphers : yes
Built with PCRE version : 8.32 2012-11-30
PCRE library supports JIT : no (USE_PCRE_JIT not set)
Built with transparent proxy support using: IP_TRANSPARENT IPV6_TRANSPARENT IP_FREEBIND
Available polling systems :
epoll : pref=300, test result OK
poll : pref=200, test result OK
select : pref=150, test result OK
Total: 3 (3 usable), will use epoll.
答案1
ew,我通过在前端添加这个来让它工作(在查看了这个帖子:)
tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }
问题是,我不知道这些选项的作用是什么...或者为什么我需要指定它们。这是否意味着 HAProxy 的默认行为是拒绝任何事情?
答案2
您添加的两行确保 HAProxy 有足够的时间在选择后端之前读取 SNI 标头,并且检查它实际上是 SSL 流量(否则拒绝它)。
您可能还想选择一个默认后端:
default_backend backend_SIT_CI5
对于不匹配的 SNI。