Memoteki

メモ的な何か。https://tiryoh.com/blog/about-blog をお読みください。

SSH

プライベートネットワーク内にsshでログインする方法

2017/07/29

LINEで送る
Pocket

プライベートネットワーク内に存在し、外部に公開されていないPCに対して、外からsshでログインする方法が大変便利だったのでメモしておきます。

ここで紹介されている手法です。
異なるprivateネットワーク内の端末をsshで繋ぐ - Qiita
http://qiita.com/FGtatsuro/items/e2767fa041c96a2bae1f

このエントリではもう少し具体的に、手元のMacBookからVPSを経由して別のネットワーク内のLinuxマシンにログインする例を紹介します。

コマンドの例

必要なコマンドは以下の通りです。

Linuxマシンで実行するコマンド
ssh vpsuser@vps.example.com -p 443 -i ~/.ssh/id_rsa -R 11011:localhost:22
MacBook(Terminal1枚目)で実行するコマンド
ssh vpsuser@vps.example.com -p 443 -i ~/.ssh/id_rsa -L 22011:localhost:11011
MacBook(Terminal2枚目)で実行するコマンド
ssh linuxuser@localhost -p 22011 -i ~/.ssh/id_rsa

もうそれぞれの環境について少し詳しく説明しておきます。

MacBook : モバイルルータに接続
モバイルルータに割り当てられるIPアドレスは何でもよく、プライベートIPで外からはアクセスできない場合でも問題ありません。

Linuxマシン : 自宅や職場のネットワーク内に接続
自宅や職場のネットワーク内に割り当てられるIPアドレスは何でもよく、グローバルIPは固定されておらず、様々な事情でポートが自由に開放できないような環境でもこの方法はしようできます。

VPS : グローバルIPが固定で割り当て
今回検証に使用したのはさくらのVPSですが、VPSでなくとも外部からsshでログインできるマシンならば特に何でも問題はありません。
このVPSにはMacBook・Linuxマシンともにsshでログインできるようにしておく必要があります。パスワード認証ではなく、公開鍵認証で接続します。
ネットワークに制限がある環境でもsshでログインできるよう、443番ポートでsshを待ち受けている状態にしています。

この方法で特筆すべき点は、VPSに秘密鍵を置いておく必要はないということです。VPSは踏み台になるだけなので、Linuxマシンにログインするための秘密鍵は手元のMacBookにあれば十分です。仮にVPSが何らかの手法で乗っ取られてしまったとしても、プライベートな情報はなにもありませんから安心です。

実行するコマンドの説明

今回紹介したsshコマンドについて少し説明しておきます。

今回はsshの"-L"オプションと"-R"オプションを利用します。
どちらもsshのポートフォワーディングと呼ばれるものです。

Linuxマシンでの操作

まず、ログインしたいLinuxマシンでの操作についてです。以下のコマンドを実行します。

Linuxマシンで実行するコマンド
ssh vpsuser@vps.example.com -p 443 -i ~/.ssh/id_rsa -R 11011:localhost:22

sshでVPS(今回は"vps.example.com")にログイン(今回はユーザ名は"vpsuser")します。
sshログインに使用するポートは"-p"で443番ポートを指定して、公開鍵認証のための秘密鍵は"-i"で~/.ssh/id_rsaを指定しています。
さらに、"-R"でVPSの11011番ポートを"localhost"の22番ポートにリモートフォワードしています。
ここで指定している"localhost"はLinuxマシンのlocalhost、つまりLinuxマシン自身を指しています。

公開鍵認証についてはさくらのナレッジに詳しい説明がありますのでそちらをご覧ください。
「よく分かる公開鍵認証」~初心者でもよくわかる!VPSによるWebサーバー運用講座(2) - さくらのナレッジ
http://knowledge.sakura.ad.jp/beginner/3543/

MacBookでの操作

次にMacBookでの操作についてです。以下の2つのコマンドをそれぞれ別々に順番に実行します。

MacBook(Terminal1枚目)で実行するコマンド
ssh vpsuser@vps.example.com -p 443 -i ~/.ssh/id_rsa -L 22011:localhost:11011
MacBook(Terminal2枚目)で実行するコマンド
ssh linuxuser@localhost -p 22011 -i ~/.ssh/id_rsa

sshでVPS(今回は"vps.example.com")にログイン(今回はユーザ名は"vpsuser")します。
sshログインに使用するポートは"-p"で443番ポートを指定して、公開鍵認証のための秘密鍵は"-i"で~/.ssh/id_rsaを指定しています。
さらに、"-L"でMacBookの22011番ポートをVPSのlocalhost:11011、つまり、VPS自身の11011番ポートにローカルフォワードしています。
ここで指定しているlocalhostは、VPSから見たlocalhostとなっています。この点がリモートフォワードと異なるので注意が必要です。

この状態でMacBookのlocalhostの22011番ポートにsshでログインします。
すると、MacBookはVPSの11011番ポートにローカルフォワードされており、LinuxマシンはVPSの11011番ポートにリモートフォワードされていますから、
Linuxマシンのユーザ名(ここではlinuxuser)とLinxuマシンにログインするための秘密鍵(ここでは~/.ssh/id_rsa)を指定すれば、Linuxマシンにログインできます。
MacBook - Linxuマシン間の通信はVPSから見た際、VPS内の通信となりますので、ufwやiptablesで11011番ポートを開いておく必要はありません。

接続イメージ

本来ならば黄色の矢印のようにログインしたいですが、残念ながらそうはいきません。
そこで、まず、ssh -RでVPSからLinuxマシンにポート転送できるようにLinuxマシンからVPSにログインします。(ピンク色の矢印)
次に、ssh -LでMacBookからVPSにポート転送できるようにMacBookからVPSにログインします。(黄緑色の矢印)
ポート転送されるようになった状態でMacBook上でlocalhostにログインすると、ポート転送され、Linuxマシンにログインすることができるようになります。
黄緑色の矢印とピンク色の矢印で構成された経路の上を通っていくわけです。
こうすることで、まるで黄色の矢印のようにログインしているような使い方ができるようになります。


画像 : いらすとやの画像を加工

さらに便利に使うために

今回はsshのログインのための転送ポートとして22011番ポートや11011番ポートを使用しました。
実際に使用する際にはwell-known portsとして予約されている0-1023番ポート以外であれば何も問題ありません。

sshの設定を~/.ssh/configに書いておくと、コマンドを一部省略することもできます。
例えば、VPSへのログインはもっと簡単にできます。
ssh vpsuser@vps.example.com -p 443 -i ~/.ssh/id_rsa
このコマンドは以下のようにconfigを書いておくと
ssh vps
だけでログインできるようになります。

Host vps
  HostName vps.example.com
  User vpsuser
  IdentityFile ~/.ssh/id_rsa

さらに詳しくまとまっているQiitaの投稿がありましたのでそちらを紹介しておきます。
多段SSHやポートフォワーディングを '.ssh/conig' に書く - Qiita
http://qiita.com/lasta/items/41e95a2fdded18c34dae

まとめ

手元のMacBookからVPSを経由して別のネットワーク内のLinuxマシンにログインしたい、そんなときに使える便利な方法を紹介しました。

Linuxマシンで実行するコマンド
ssh vpsuser@vps.example.com -p 443 -i ~/.ssh/id_rsa -R 11011:localhost:22
MacBook(Terminal1枚目)で実行するコマンド
ssh vpsuser@vps.example.com -p 443 -i ~/.ssh/id_rsa -L 22011:localhost:11011
MacBook(Terminal2枚目)で実行するコマンド
ssh linuxuser@localhost -p 22011 -i ~/.ssh/id_rsa

参考文献

異なるprivateネットワーク内の端末をsshで繋ぐ - Qiita
http://qiita.com/FGtatsuro/items/e2767fa041c96a2bae1f

sshポートフォワーディング - Qiita
http://qiita.com/mechamogera/items/b1bb9130273deb9426f5

楽しいトンネルの掘り方(オプション: -L, -R, -f, -N -g) — 京大マイコンクラブ (KMC)
https://www.kmc.gr.jp/advent-calendar/ssh/2013/12/09/tunnel2.html

SSHポートフォワード(トンネリング)を使って、遠隔地からLAN内のコンピュータにログインする - ククログ(2014-09-12)
http://www.clear-code.com/blog/2014/9/12.html

LINEで送る
Pocket

-SSH
-, ,