リバースプロキシはSSLパススルーでSNIを使用できますか?


18

1つの外部IPアドレスを使用して、https経由で複数のアプリケーションを提供する必要があります。

SSL証明書は、リバースプロキシで管理しないでください。アプリケーションサーバーにインストールされます。

SNIを使用し、エンドポイントで終了するためにSSLを渡すようにリバースプロキシを構成できますか?

これはNginxやApacheのようなものを使用して可能ですか?構成はどのように見えますか?

回答:


14

これはHaproxyで可能です。TCPプロキシをセットアップしてSNIを抽出し、SNIに基づいてルーティングを行うことができます。以下に例を示します。

backend be.app1
    mode tcp
    no option checkcache
    no option httpclose
    tcp-request inspect-delay 5s
    tcp-request content accept if { req.ssl_hello_type 1 }
    tcp-request content reject
    use-server server1 if { req.ssl_sni -m beg app1. }
    server server1 server1:8443 check id 1 weight 0

SSL helloを取得するまでリクエストを遅らせることが不可欠です。そうしないと、haproxyはSNIヘッダーを受信する前に接続を試行します。

現在の構成では、SNIごとに実行しているサーバーは1つだけで、ランダムな要求を受信したくないため、重み0のサーバーを使用しています。おそらくこれで遊ぶより良い方法を見つけることができます。

これがお役に立てば幸いです。


答えを受け入れることができるように、これに関するドキュメントまたは構成スニペットを教えていただけますか?
user319862 14

3
@ user319862私はこの素晴らしいチュートリアルを見つけました。
マイケルハンプトン

1
本当に?なぜ誰かがこの答えに反対票を投じるのでしょうか?
フローリンアサヴォアエ14

これに伴う問題は、クライアントのIPアドレスが転送されないため、サーバーはプロキシからのトラフィックのみを参照することです。
カイル

@Kyleもちろん。TCPプロキシです。これについてできることは、haproxyをサーバーのルーターとして構成および設定し、tproxyを使用する場合だけです。
フローリンAsăvoaie17年

5

sniproxyを使用できます:https : //github.com/dlundquist/sniproxy

設定例:

listener 0.0.0.0:443 {
    protocol tls
    table TableHTTPS
    fallback 127.0.0.1:8443
}

listener 0.0.0.0:80 {
    protocol http
    table TableHTTP
    fallback 127.0.0.1:8080
}

table TableHTTPS {
    domain1.com backend1:443
    domain2.org backend2:443
}

table TableHTTP {
    domain1.com backend1:80
    domain2.org backend2:80
}

そのプロジェクトについて投稿していただきありがとうございます。私はそれに気づいていなかった
user319862

@mick Sickを透過プロキシとして実行すると、一部のサイトがSSLエラーで壊れる 修正方法
gripenfighter

1

2019年に予定されているTLS 1.3でも、これは確かに可能です!多くのWebサーバーまたは特殊なリバースプロキシは、すぐにこの機能を提供します。

  • Nginx≥1.11.5(Debian≥バスターまたはストレッチバックポート)
  • HAProxy≥1.5(Debian≥jessie)
  • Sniproxy(Debian≥buster)

これはNginxの設定例です。これは、リバースプロキシを必要とするセットアップで非常に一般的な選択肢です。

stream {
  map $ssl_preread_server_name $selected_upstream {
    example.org upstream_1;
    example.net upstream_2;
    example.com upstream_3;
    default upstream_4;
  }
  upstream upstream_1 { server 10.0.0.1:443; }
  upstream upstream_2 { server 10.0.0.2:443; }
  upstream upstream_3 { server 10.0.0.3:443; }
  upstream upstream_4 { server 10.0.0.4:443; }
  server {
    listen 10.0.0.5:443;
    proxy_pass $selected_upstream;
    ssl_preread on;
  }
}

関連nginxのモジュールがあるstream_corestream_ssl_preread。マニュアル:

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.