Ubuntuサーバーが複数のリモートロケーションに展開されている状況があります。これらのサーバーは、キャリアグレードNATおよび内部NATの背後にありました。中央の場所から、いつでもアクセスしたいのですが、それらのサーバーと同様のNATの背後にもいます。
それらのサーバーがオンラインになったら、アクセスします(SSHまたはSSHトンネルを介して)。パブリックIPを持つサーバーのようにアクセスできないことは知っていますが、TeamViewerの動作原理を介して何らかの方法でアクセスできます。この方法では、別のパブリックサーバーが必要な場合、Google Compute Engineで管理できます。
パブリックIPアドレスを持つサーバーにアクセスできる場合、ゲートウェイとして使用できます。これは、リバースSSHポートフォワーディング接続を介して実現できます。 3つのインスタンスがあるとします。
パブリックサーバー:ここには、操作可能なSSHサーバーとパブリックIPアドレス(および/またはドメイン名)があります。パスフレーズで保護されていない公開鍵と秘密鍵のペアでこのサーバーに接続できます( reference )。
プライベートサーバー:ここには、運用可能なSSHサーバーがあります。ファイアウォール(NAT、ISPなど)の背後にあり、パブリックIPアドレスはありませんが、パブリックサーバーへのSSH接続を確立できるため、ここにはSSHクライアントもあります。
クライアントマシン:ここでは、(必要な)SSHクライアントのみがあります。 Public ServerへのSSH接続を確立できます。 このインスタンスからプライベートサーバーへのSSH接続を確立します。
プリンシパルレベルでは、少なくとも2つのシナリオを適用できます。
シナリオ1。パブリックサーバーのファイアウォールで追加のポートを開きたくない場合:
シナリオ2。パブリックサーバーのファイアウォールで追加のポートを開く場合:
シナリオ1の主な利点は、プライベートサーバーの安全性を考える必要がないことです。シナリオ2の主な利点は1つのステップを省略できることですが、この場合、転送されたポートを介してパブリックにアクセスできるようになるため、プライベートサーバーのセキュリティについて考慮する必要があります。さらに、これらのシナリオは、HTTPなどのSSHだけでなく、さまざまなポートとサービスに適用できます。
プライベートサーバーからパブリックサーバーへのポート転送で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…
プライベートサーバーからパブリックサーバーへのポート転送で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.