Ssl

HAProxy 作為 TCP 負載平衡器(SSL 直通)不起作用?

  • April 3, 2022

我在將 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 &lt;willy@haproxy.org&gt;

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,我通過在前端添加它來使它工作(在看了這篇文章之後:)

tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }

問題是,我不知道這些選項在做什麼……或者為什麼我需要指定它們。這是否意味著 HAProxy 預設行為是拒絕任何東西?

您添加的兩行程式碼確保 HAProxy 在選擇後端之前有足夠的時間讀取 SNI 標頭,並檢查它實際上是 SSL 流量(否則拒絕它)。

您可能還想選擇一個預設後端:

default_backend backend_SIT_CI5

對於不匹配的 SNI。

引用自:https://serverfault.com/questions/988049