HAProxy 作为 TCP 负载均衡器(SSL 直通)不起作用?

HAProxy 作为 TCP 负载均衡器(SSL 直通)不起作用?

我在将 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。

相关内容