web-dev-qa-db-ja.com

HAProxy:SSL接続の内容を検出し、転送するかどうかを決定します

ポート443にHAProxyを備えたフロントエンドが必要です。このフロントエンドは次のように機能します。

接続の内容を復号化し、以下をチェックします。

1-接続の暗号化されたコンテンツがsshの場合、つまりパケットの最初のワードがSSH-2.0の場合、復号化されたパケットをポート22に転送します。このようなバックエンドは次のようになります。

backend ssh
    mode tcp
    option tcplog
    server ssh 127.0.0.1:22
    timeout server 2h

2-暗号化されたコンテンツがそれ以外の場合は、暗号化されたコンテンツをポート8443に転送します。ポート8443には、正しいSNIキーを持つApacheサーバーが含まれています。各Webアドレスにすべての正しいSNIキーを含める必要がある場合(中間者攻撃と見なされないようにするために、例を使用してそれを行う方法を教えていただけますか?追加しても問題ありません) HAProxyへのすべてのキー。

なぜ?すでにApacheがポート443で動作しているためです。構成全体を書き直さずに、他のポートに移動したいと思います。たとえば、ポート8443に移動し、HAProxyに、接続がSSHでない場合は、取得したすべてのものをポート443に転送するように指示します。

このようなフロントエンド+バックエンドをどのように書くのですか?助けてください。

私は現在、出発点として次のフロントエンドを持っています:

frontend ssl
    bind 0.0.0.0:443 ssl crt /home/myuser/SSL/certs.pem no-sslv3   #decrypts the connection with the keys certs.pem
    mode tcp
    option tcplog
    tcp-request inspect-delay 5s
    tcp-request content accept if HTTP
    acl client_attempts_ssh payload(0,7) -m bin 5353482d322e30   #if the decrypted information starts with SSH-2.0

    use_backend ssh if client_attempts_ssh   #forward to SSH if condition client_attempts_ssh is satisfied.
    use_backend forwardToApache if !client_attempts_ssh

追加の詳細が必要かどうかお問い合わせください。

ありがとうございました。

最初にSNIを使用して、

site1.domain.com, 
site2.domain.com,

または

ssh.domain.com

ssh.domain.comが選択されている場合にのみ、復号化して、sshマジックを実行し、暗号化されていないローカルWebサーバーに送信します。これは、通常のhttpsトラフィックのように見えるはずですが、httpsコンテンツ内に機密情報が含まれていないためです。これはsite1とsite2によって処理されます。

0
BeerSerc