我在将 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://loadbalancerURL但我认为这是正常的)我有一个错误这个页面无法显示。在高级设置中打开 TLS 1.0、TLS 1.1 和 TLS 1.2 并尝试再次连接到https://host1.domain.net。
单个 openssl s_client会导致 ssl 握手失败(无证书 blabla)。
你知道我做错了什么吗?另外,我在收听 443 时是否需要设置一些证书?(即使我不希望这些证书被解密或者我只希望我的 HAProxy 充当代理)。
我也尝试激活调试模式进行日志记录,但它没有显示任何错误(也没有新日志)
注意:后端位于防火墙后面,后端与 HAProxy 之间的通信未在 443 上打开(仅从 Haproxy 到后端),是否需要定向?为什么?
注意2:在haproxy stats中,我可以看到所有后端UP
另外,有没有办法知道/检查基于主机名(SNI)的重定向是否工作正常?(我的印象是连接停留在负载均衡器上并且没有重定向到后端,这就是我出错的原因)
haproxy -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.
ew,我通过在前端添加它来使它工作(在看了这篇文章之后:)
问题是,我不知道这些选项在做什么......或者为什么我需要指定它们。这是否意味着 HAProxy 默认行为是拒绝任何东西?
您添加的两行确保 HAProxy 在选择后端之前有足够的时间读取 SNI 标头,并检查它实际上是 SSL 流量(否则拒绝它)。
您可能还想选择一个默认后端:
对于不匹配的 SNI。