web-dev-qa-db-ja.com

プロキシTCPホスト名による

私は複数のゲームサーバーを持っていますTCPポートが1台のホストマシン上にあります。目的は、ユーザーがserver1.domain.netに接続し、そのサブドメインに基づいてユーザーを指定できるようにすることです。最初の本能は次のように書いたが、TCPトラフィックには読み取るヘッダーがないことに気付いた。HAProxy1.5.8を使用して、同じことを複数のバックエンド、use_backendおよび完全なACL行ですが、同じ結果になります(当然です)。

listen game-listener
  bind x.x.x.x:22222
  mode  tcp
  use-server  server1 if { hdr(Host) -i server1.domain.net }
  use-server  server2 if { hdr(Host) -i server2.domain.net }
  server server1 localhost:22201 check
  server server2 localhost:22202 check

TCP接続に使用できるhdr(Host)のようなチェックはありますか?それとも正しく実行していて、ゲームがうまくいかないのですか?

ありがとう!

8
shaun m

プロキシの代わりに(ホスト名に基づいて実行できるかどうかがアプリケーションプロトコルに依存する場合)、クライアントソフトウェアが SRV 対応かどうかを確認できます。 DNSだけでこれを設定できるはずです。

SRVレコードの形式は次のとおりです。

_Service._Proto.Name TTL Class SRV Priority Weight Port Target


Minecraftの複数のインスタンスについて言及した特定の例では、SRVレコードに基づいてこれを行うことが可能であり、レコードは次のようになります。

_minecraft._tcp.foo.example.com. 86400 IN SRV 0 5 25565 server1.example.com.
_minecraft._tcp.bar.example.com. 86400 IN SRV 0 5 25566 server1.example.com.
4

TCPレイヤーでは、クライアントが接続しているホスト名に応じて、異なるバックエンドへの接続をディスパッチすることは不可能です。

ホスト名ごとに個別のIPアドレスを使用するか、アプリケーション層でプロトコル固有のコードを使用してプロキシを実装し、ホスト名を検出する必要があります。

このようなプロキシは、特定のプロトコルでは可能ですが、他のプロトコルでは不可能です。簡単なものから不可能なものまで、私が十分に知っているプロトコルは次のとおりです。

  • HTTPのサポートは簡単です。すべてのHTTP/1.1クライアントとほとんどのHTTP/1.0クライアントは、サーバーからの応答を期待する前にホストヘッダーを送信します。最近の多くのサイトはHostヘッダーがないと機能しないため、Hostヘッダーのないクライアントはおそらくなくなるでしょう。
  • HTTPSは、SNIをサポートするすべてのクライアントでサポートできます。 SNIはHTTP/1.1よりもはるかに最近に標準化されましたが、SNIサポートのないクライアントがまだいくつかあります。
  • DNSはサポート可能ですが、少し注意が必要です。ほとんどの場合、権限のあるDNSサーバーをプロキシの代わりにパブリックIPアドレスで直接操作するだけです。
  • SMTPをサポートすることは可能ですが、注意が必要です。 SMTPのプロキシは、プロキシよりもSMTPリレーのように見える可能性があります。
  • SSHはサポートできません。ホスト名の概念は、プロトコルには存在しません。クライアントはDNSを使用してサーバーのIPアドレスを解決し、格納されているホストキーをホスト名に関連付ける場合がありますが、これは完全にクライアント側の実装の詳細です。これはプロキシからは見えないため、接続のディスパッチには使用できません。さらに、有用な情報がクリアテキストで送信されることはなく、SSHプロトコルの開始時にクリアテキストで送信されるいくつかの情報でさえ、後でプロトコルで認証されるため、その誤りの一部が発生すると、通信が切断されます。これを処理することがさらに困難になるのは、サーバーがバナーをクライアントに送り返すまで、クライアントが1バイトのペイロードも送信しないという事実です。そのため、プロキシには操作する情報が文字通りありません。

そのような目的で使用される可能性のある、ホスト名を持つ他のプロトコルについては知りません。したがって、上記のリストにないプロトコルのほとんどは、ホスト名でプロキシすることは不可能だと思います。

4
kasperd