HAProxyを使用したドメインに基づいたSSHトラフィックのルーティング


2

現在、自宅で自分の小さなクラスターを構築しており、SSHルーティング(負荷分散)をHAProxyと連携させようとしています。HTTPトラフィックをルーティングする方法を見つけましたが、SSHに苦労しています。TCPプロトコルについて十分に知らないため、ホストのようなもの(接続のどこかにあるかどうかわからない)の接続を照会する方法を判別できるように、探しているものを即座に知ることができます。どのサーバーにSSH接続するか。

ドキュメンテーションはSSHトラフィックについて何度も言及しているので、私が見逃したものがあるかもしれません。別のポートを使用したり、別のポートを使用して前後にルーティングしたりしたくないのは、それらが標準ではない可能性があるため、パブリックネットワークまたは他の制限事項でブロックされるためです。

私の現在のセットアップは次のようになります。

ドメイン(またはIP)での要求->ルーター->ポートに応じてNAT転送->そのポートでリッスンするHAProxy->特定のサーバー専用のトラフィックと、そのサーバーへのプロキシトラフィックを識別します。

編集:Cha0sが解決したので、これはSSH(または同様)では不可能です。

別の方法に興味がある場合、Svenの答えは似たようなことをするのに良い洞察を与えますが、異なるサブドメインが異なるパブリック静的IPに解決される


なぜSSHトラフィックをルーティングし、なぜこの目的でHAをルーティングするのですか?
030

同じIPの背後に複数のマシン(mac miniがgitlabでメールnスタッフraspberry pi 2を実行している)があるためです。これは私が支払う静的IPですが、2つ目のIPを取得する方法はありません。私は可能なIPに制約されています
コンスタンティンジェイコブ

回答:


2

用語を混同していると思います。

通常、ロードバランシングとは、1つのホスト(example.com)に接続し、ロードバランサーがすべての接続を1つ以上のバックエンドホストに分散させることを意味します。通常は、実際に接続するホストをユーザーが制御できません。これは、さまざまな方法でSSHに対して簡単に実行できます。

HTTPのようないくつかのプロトコルで、Hostヘッダは、ロードバランサに接続が(例えばにルーティングされるべきバックエンドサーバを決定するより多くの情報与えることができますexample.comにルーティングされますab、ながらexample.orgにルーティングされるcd)を。

SSHにはそのようなフィールドがないため、ロードバランサーと1つのIPアドレスのみではこれを実行できません。これにより、LBがこのタスクに適さなくなります。

通常、これはホストをSSHプロキシ/ゲートウェイ/ジャンプホストとして使用して解決し、SSHクライアントにそのように使用するように指示します。OpenSSHを使用している場合は、クライアントに次のものを追加します~/.ssh/config

Host  *.internal.lan
   ProxyCommand ssh -q -A  -x proxy.example.com -W %h:%p

Host行にリストされている名前に接続すると、SSHクライアントは最初に接続しproxy.example.com(パブリックIPアドレスを指す必要があります)、それを実際のマシンに転送するためのゲートウェイとして使用します(ポート22へのNATポート転送を使用します)該当する場合、実際のプロキシマシンの)。proxy.example.com解決できる必要があることに注意してください*.internal.lan。DNSサーバーをセットアップするか、ルーターが提供する内部サーバーを使用してこれを実現します。

その後、接続する外部ネットワークからnas.internal.lanNAS(またはraspi.internal.lanその他...)にアクセスし、ローカルネットワーク内から使用するnasか、またはraspi(接続はゲートウェイ経由ではなく直接接続されます)。

別の方法として、NATを使用するという事実を考えると:

NATルーターでポート転送を作成します。たとえば

Port 2210 -> internal host1, port 22
Port 2211 -> internal host2, port 22

次に、クライアントに次を入力します~/.ssh/config

Host host1.example.com  
   Port 2210

Host host2.example.com 
   Port 2211

host1/2.example.com両方が外部IPアドレスを指していることを確認してください。

その後、SSH経由で接続するだけでhost1.example.com 、OpenSSHはポート2210に接続し、NATゲートウェイによって内部ホスト1に転送されます。

どちらの方法もシナリオで機能します。


答えてくれてありがとう。私の質問の下に私の最後のコメントを見ると、なぜこれが私にとって不可能なのかがわかります。それは良い情報を与えるので、とにかくあなたの答えを支持します。
コンスタンティンジェイコブ

本当じゃない。私は同様のセットアップをしており、問題なく動作します。
スヴェン

しかし、これらすべてのサブドメインとホストが同じパブリックIPに解決される場合、既に述べた理由のために必要のないポート以外のトラフィックを識別できないという問題がまだあります(標準ポートなどを使用したい) ..)
コンスタンティンジェイコブ

この問題を回避する方法を示しました。それは簡単であり、私はそれを常に使用して、職場でも自宅でも、何百ものマシンに接続しています。HTTPのように機能すると主張する場合、あなたは運が悪いです。
スヴェン

1
はい。二人ともお互いのポイントを見逃しているかどうか分からなかった。今夜のセットアップを試してみます
コンスタンティンジェイコブ

0

私の知る限り、ドメインに基づいてこれを行うことはできません。HTTPにはHost、ブラウザ(この場合はリバースプロキシ)が理解し、それに基づいて決定を下せる特別なヘッダーがあるため、HTTPはそのように機能します。

他のTCPプロトコルでは、似たようなものは知りません。間違いなくSSHではありません。


それでは、SSHルーティング(負荷分散)は間違いなく不可能ですか?
コンスタンティンジェイコブ

0

そのため、一般的には、はい、HTTPのみがHAProxyの宛先ホスト名を決定できます...ただし、HAProxyに接続するTCPクライアントが宛先アドレス(IPまたはFQDN)を送信する場合、その情報を破棄してルーティングに使用することできます。

Minecraftの共有ポートポーカーディーラーを紹介します。

#starting from top of file, for completeness.
    global
       user haproxy
       group haproxy
#setting tcp mode here is required, won't work if in frontend area!
    defaults
       mode tcp
#setting up the HAProxy listener:
    frontend frontend-name
       bind :25565
       tcp-request inspect-delay 3s
#ACLs for 1.9 and newer clients:
        acl mojang req.payload(5,16) -m sub sub1.domain.tld1
        acl bungee req.payload(5,16) -m sub sub2.domain.tld1
        acl bungee req.payload(5,16) -m sub sub1.domain.tld2
        acl nukkit req.payload(5,16) -m sub sub3.domain.tld1
#ACLs for 1.8 and older clients, keeping pinger working:
        acl mojang req.payload(4,16) -m sub sub1.domain.tld1
        acl bungee req.payload(4,16) -m sub sub2.domain.tld1
        acl bungee req.payload(4,16) -m sub sub1.domain.tld2
        acl nukkit req.payload(4,16) -m sub sub3.domain.tld1
#Accept connections if matching an ACL above:
        tcp-request content accept if bungee
        tcp-request content accept if mojang
        tcp-request content accept if nukkit
#Route connection to appropriate backend server:
        use_backend minecraft.bungee if bungee
        use_backend minecraft.mojang if mojang
        use_backend minecraft.nukkit if nukkit
#backend servers - one bungee network, one notchian server, one nukkit server:
    backend minecraft.bungee
    #here we're directing the connection to bungee on 127.0.0.1:25566
    #We're also sending the proxy-protocol(v2) to bungee (check conf!)
       server bungee-server 127.0.0.1:25566 send-proxy-v2
    backend minecraft.mojang
    #Mojang servers can't use the proxy-procotol, so not sending it
       server mojang-server 127.0.0.2:25567
    backend mincraft.nukkit
    #nukkit will never work here, as Bedrock is based on UDP, not TCP!
       server sponge-server 127.0.0.3:25568
#EoF

これは基本的なセットアップであり、機能します。私のプロダクションセットアップは、セットアップに必要なオプションを使用してかなり異なります。

さて、それは結局のところ-パケット内で宛先ホストを見つけて、HAProxyのペイロードでそれを探すことができますか?

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