haproxy を REQ_SSL_SNI と SSL 終了で動作させようとしています。
私が従ってきたガイドhttps://www.haproxy.com/blog/enhanced-ssl-load-balancing-with-server-name-indication-sni-tls-extension/ https://stuff-things.net/2016/11/30/haproxy-sni/
セットアップ: HA-Proxy バージョン 1.6.3 Ubuntu 16.04
ログは以下を生成します:
HTTP-in ~ http-in/NOSRV-1/-1/12 0 SC 0/0/0/0/0 0/0
frontend http-in
bind *:443 ssl crt /etc/haproxy/certs/
log global
reqadd X-Forwarded-Proto:\ https
mode tcp
option tcplog
# wait up to 5 seconds from the time the tcp socket opens
# until the hello packet comes in (otherwise fallthru to the default)
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
acl is_site1 req_ssl_sni -i foo.foobar.com
acl is_site2 req_ssl_sni -i foobar.com
use_backend www-foo-foobar if is_site1
use_backend www-foobar if is_site2
backend www-foo-foobar
log global
mode tcp
option tcplog
redirect scheme https if !{ ssl_fc }
server www-1 127.0.0.1:3030 check
backend www-foobar
log global
mode tcp
option tcplog
redirect scheme https if !{ ssl_fc }
server www-1 127.0.0.1:5000 check
何が足りないのでしょうか?
誰か私に正しい方向を指し示してくれませんか?
答え1
以下をお試しくださいssl_fc_sni
:
acl is_site1 ssl_fc_sni foo.foobar.com
acl is_site2 ssl_fc_sni foobar.com
ssl_fc_sni
基本的に、SSL を終了/解読する場合は、 (OpenSSL API から SNI を取得)を使用する必要があります。
TCP モードで渡す場合は、 を使用する必要がありますreq_ssl_sni
(TCP パケット内の SNI を解析します)。
ドキュメントより:
ssl_fc_sni : 文字列
これは、SSL/TLS トランスポート層を介して行われ、haproxy によってローカルに解読された着信接続から Server Name Indication TLS 拡張 (SNI) フィールドを抽出します。結果 (存在する場合) は通常、HTTPS ホスト名に一致する文字列 (253 文字以下) です。SSL ライブラリは、TLS 拡張のサポートを有効にしてビルドされている必要があります (haproxy -vv を確認してください)。
このフェッチは、haproxy によって解読される接続に適用され、盲目的に転送される SSL コンテンツには適用されないという点で、上記の「req_ssl_sni」とは異なります。以下の「ssl_fc_sni_end」および「ssl_fc_sni_reg」も参照してください。これには、SSL ライブラリが TLS 拡張機能のサポートを有効にしてビルドされている必要があります (haproxy -vv を確認してください)。
ACL誘導体:
- ssl_fc_sni_end : サフィックス一致
- ssl_fc_sni_reg : 正規表現の一致
https://cbonte.github.io/haproxy-dconv/2.0/configuration.html#7.3.4-ssl_fc_sni