web-dev-qa-db-ja.com

curlでhaproxy sniベースのルールを確認するにはどうすればよいですか?

SNIフィールドに基づいて完全なトラフィックを通過させる単純なHaProxy構成を作成しました。こちらが私のhaproxy.cfgです

defaults
    log global
    timeout client 50s
    timeout client-fin 50s
    timeout connect 5s
    timeout server 10s
    timeout tunnel 50s
frontend tcp-0_0_0_0-443
    bind *:443
    mode tcp

    acl sni_acl_example_com req.ssl_sni -m sub example.com
    use_backend example_com_be if sni_acl_example_com

backend example_com_be
    mode tcp
    server name1 93.184.216.34

次のDockerfileを使用してHaProxyを実行します。

FROM haproxy:1.7.9-Alpine
COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
EXPOSE 443

および次のコマンド:docker build -t my-haproxy . && docker run -p 443:443 --rm -d --name my-running-haproxy my-haproxy

ここで、sni_acl_example_comというルールがcURLを使用して期待どおりに機能するかどうかを確認します。

curl -k -X 'GET' -H 'Host: example.com' --resolve example.com:443:127.0.0.1 https://example.com

結果は次のとおりです。

curl:(35)LibreSSL SSL_connect:example.com:443に接続するSSL_ERROR_SYSCALL

明らかに、ルールは機能せず、適切なバックエンドがありません(そのため、SSL_ERROR_SYSCALLを取得します)。 default_backendを追加すると、代わりにそれがリクエストの実行に使用されます。

CURLリクエストが開かないのはなぜですか http://example.com HaProxyを使用していますか?

最新のOSX High Sierraでcurl 7.54.0を使用しています。

3
Kirill

理解した。 cURLリクエストは完全に正しいです。

haproxy.cfgに2つの構成ステートメントがありませんでした。 sniルールを機能させるには、以下も必要です。

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

frontendセクションの下。

3
Kirill