web-dev-qa-db-ja.com

NATの背後にある複数のリモートサーバーにアクセスする

Ubuntuサーバーが複数のリモートロケーションに展開されている状況があります。これらのサーバーは、キャリアグレードNATおよび内部NATの背後にありました。中央の場所から、いつでもアクセスしたいのですが、それらのサーバーと同様のNATの背後にもいます。

enter image description here

それらのサーバーがオンラインになったら、アクセスします(SSHまたはSSHトンネルを介して)。パブリックIPを持つサーバーのようにアクセスできないことは知っていますが、TeamViewerの動作原理を介して何らかの方法でアクセスできます。この方法では、別のパブリックサーバーが必要な場合、Google Compute Engineで管理できます。

1
Sagar Khatiwada

パブリックIPアドレスを持つサーバーにアクセスできる場合、ゲートウェイとして使用できます。これは、リバースSSHポートフォワーディング接続を介して実現できます。 3つのインスタンスがあるとします。

  • パブリックサーバー:ここには、操作可能なSSHサーバーとパブリックIPアドレス(および/またはドメイン名)があります。パスフレーズで保護されていない公開鍵と秘密鍵のペアでこのサーバーに接続できます( reference )。

  • プライベートサーバー:ここには、運用可能なSSHサーバーがあります。ファイアウォール(NAT、ISPなど)の背後にあり、パブリックIPアドレスはありませんが、パブリックサーバーへのSSH接続を確立できるため、ここにはSSHクライアントもあります。

  • クライアントマシン:ここでは、(必要な)SSHクライアントのみがあります。 Public ServerへのSSH接続を確立できます。 このインスタンスからプライベートサーバーへのSSH接続を確立します。


主なレベル

プリンシパルレベルでは、少なくとも2つのシナリオを適用できます。

シナリオ1。パブリックサーバーのファイアウォールで追加のポートを開きたくない場合:

  1. プライベートサーバーからパブリックサーバーへのポート転送でSSH接続を確立します。
  2. クライアントマシンからパブリックサーバーへのポート転送でSSH接続を確立します。
  3. クライアントマシンからプライベートサーバーに接続します。

シナリオ2。パブリックサーバーのファイアウォールで追加のポートを開く場合:

  1. プライベートサーバーからパブリックサーバーへのポート転送でSSH接続を確立します。
  2. パブリックサーバーを介して、クライアントマシンからプライベートサーバーに接続します。

シナリオ1の主な利点は、プライベートサーバーの安全性を考える必要がないことです。シナリオ2の主な利点は1つのステップを省略できることですが、この場合、転送されたポートを介してパブリックにアクセスできるようになるため、プライベートサーバーのセキュリティについて考慮する必要があります。さらに、これらのシナリオは、HTTPなどのSSHだけでなく、さまざまなポートとサービスに適用できます。


Ubuntu内でシナリオ1を適用する方法

プライベートサーバーからパブリックサーバーへのポート転送でSSH接続を確立します

次のコマンドで実行できます。

ssh user-of-the-public-server@public-server -p 22 -R 2222:127.0.0.1:22 -i ~/.ssh/pass-less/id_rsa
  • -p 22は、パブリックサーバーのSSHポートを提供します(必須ではありません)。

  • -i ~/.ssh/pass-less/id_rsaは認証キーファイルを提供します。

  • -R 2222:127.0.0.1:22は、(リモート)パブリックサーバーのポート2222が、(この場合は22である)(ローカル)プライベートサーバーのSSHポートに転送されることを意味します。

この接続をバッ​​クグラウンドにプッシュするには、_OpenSSHクライアントのオプション-fTN(- reference )を追加します。また、ツールautosshを使用して、接続が長期間有効であることを確認できます( reference ):

autossh user-of-the-public-server@public-server -p 22 -fTN -R 2222:127.0.0.1:22 -i ~/.ssh/pass-less/id_rsa

~/.ssh/configファイルに次の行を実装することにより、上記のコマンドを簡素化できます。

Host public-server-reverse
    HostName 100.100.100.100  # this is the IP address or the domain name of the Public Server
    IdentityFile ~/.ssh/pass-less/id_rsa
    User user-of-the-public-server
    Port 22
    RemoteForward 2222 localhost:22

この場合、上記のコマンドは次のようになります。

autossh public-server-reverse -fTN

次のCronジョブにより、システムの再起動時にこのタスクを簡単に自動化できます(または、 サービスの作成 の方がよいアプローチです):

@reboot sleep 45 && autossh public-server-reverse -fTN

この接続が確立されたら、次のコマンドを使用して、リバーストンネルを介して、パブリックサーバーからプライベートサーバーに接続できます。

ssh user-of-the-private-server@localhost -p 2222    # provide an additional authentication data (for the Private Server) if it is needed…


クライアントマシンからパブリックサーバーへのポート転送でSSH接続を確立します

次のコマンドで実行できます。

ssh user-of-the-public-server@public-server -p 22 -fTN -L 1111:127.0.0.1:2222 -i ~/.ssh/pass-less/id_rsa
  • -L 1111:127.0.0.1:2222は、(ローカル)クライアントマシンのポート1111が(リモート)パブリックサーバーのポート2222(プライベートサーバーのSSHポートに転送される)に転送されることを意味します。 -L 2222:127.0.0.1:2222を使用できることに注意してください。

  • -fTNこれらのオプションは、上記のように接続をバッ​​クグラウンドにプッシュします。

  • ディレクティブautosshまたはRemoteForwardを使用して、LocalForwardおよび~/.ssh/configファイルも実装できます。


それ自体を介してクライアントマシンからプライベートサーバーに接続します

上記の2つの手順が実装されたら、次のコマンドでクライアントマシンからパブリックサーバーに接続できます。

ssh user-of-the-private-server@localhost -p 1111    # provide an additional authentication data (for the Private Server) if it is needed…

Ubuntu内でシナリオ2を適用する方法

プライベートサーバーからパブリックサーバーへのポート転送でSSH接続を確立します

この手順はシナリオ1の最初の手順と同じですが、追加の作業はほとんど必要ありません。

パブリックサーバーのファイアウォールで転送されたポート2222を開きます-これはこの回答の範囲外です。

Public Serverの/etc/ssh/sshd_configを変更し、SSHトンネルを公開することを許可する次のディレクティブを追加します(サーバーを再起動することを忘れないでください:Sudo systemctl restart sshd.service):

GatewayPorts yes

SSHトンネルを公開します。このステップは、質問内で詳しく説明されています:( sshトンネルを公開する方法? )。そこでの答えによると、プライベートサーバーとパブリックサーバーを接続するコマンドに-gオプションを追加できます。

autossh public-server-reverse -gfTN
@reboot sleep 45 && autossh public-server-reverse -gfTN

または、代わりに、次のように~/.ssh/configファイルを変更できます。

Host public-server-reverse
    HostName 100.100.100.100  # this is the IP address or the domain name of the Public Server
    IdentityFile ~/.ssh/pass-less/id_rsa
    User user-of-the-public-server
    Port 22
    RemoteForward \*:2222 localhost:22

最後にkillall autosshして、接続を再度確立する必要があります。


パブリックサーバーを介してクライアントマシンからプライベートサーバーに接続します

上記の手順を実行すると、次のコマンドで目標を達成できます。

ssh user-of-the-private-server@public-server -p 2222    # provide an additional authentication data (for the Private Server) if it is needed… forward some ports, etc.
0
pa4080