はじめに
職場や研究室のPCにグローバルIPが割り当てられるケースはまれで、1つのグローバルIPを共有するNAPT(NAT)の傘下にあることがほとんどです。
この記事では、そのようなPCに対してもリモートポートフォワーディングを使用して自宅からssh接続できるようにする方法を紹介します。
なお、個人利用であればTeam Viewerなどのリモートデスクトップ系のソフトの方が楽かも知れません。
この記事はTeam Viewerが重くてやだ/商用利用できない、端末さえ叩ければ十分なのに、という人向けの記事です。
必要なもの
- 職場/研究室のPC(※常時電源ON)
- 固定グローバルIPがないLinux PCを想定
- 自宅PC
- 自宅PCからssh接続可能な、固定グローバルIPをもったLinuxサーバー(VPSなど)
- ネットワーク管理者の許可 ← 重要
イメージ図
大まかなやり方
大まかには以下のような手順となります。
1. 職場PCでssh -fNR 12345:localhost:22 vps
を打っておく
2. 自宅PCからssh vps
→ssh localhost -p12345
で多段ssh接続して職場PCに接続
詳しいやり方
職場で準備としてやっておくこと
あらかじめ、職場PCの~/.ssh/config
にVPSへの接続情報を書いておきます(新規作成の場合はchmod 600 ~/.ssh/config
しておくことを忘れずに)。
Host vps ←任意の名前を指定
User username ←適宜変更
HostName xxx.xxx.xxx.xxx ←適宜変更
Port 22
ServerAliveInterval 60
ExitOnForwardFailure yes
TCPKeepAlive no
Host
,User
,HostName
,Port
の行は適宜書き換えてください。また、(普通そうだと思いますが)VPSへのssh接続が鍵認証の場合で、職場PCのデフォルトの鍵とは異なるものを使用する必要がある場合はIdentityFile
などの情報も足してください。
なお、TCPKeepAlive
をyesにしてしまうと、少しでも接続が切れると通信が閉じられてしまうのでnoのままにしておくことをお勧めします。
~/.ssh/config
の準備ができたら、職場PCから以下のコマンドを叩きます。ポート番号は適当に12345にしています。
$ ssh -fNR 12345:localhost:22 vps
各オプションの意味は、
-
-f
: バックグラウンド実行 -
-N
: ssh先のシェルを開かない -
-R
: リモートポートフォワード(リモート側のポートをローカルのポートに繋ぐ)
です。
このコマンドによって、VPS側の12345番ポートに職場PCの22番ポートが常時フォワードされた状態になります。
つまり、VPS側でlocalhostの12345番ポートにssh接続を飛ばせば、職場PCの22番ポートにssh接続を飛ばしたことと同じになります。
このsshコマンドは、-fN
オプションが付いているおかげで、実行するとバックグラウンドでプロセスが残り続けます。
実行したシェルを閉じてもsshのプロセスは残り続けるので、実行した後はexit
で端末を閉じて大丈夫です。
(もしこのプロセスを終了したい場合はps
コマンドでプロセスIDを調べた上でkill [プロセスID]
を叩いてください。)
動作確認: VPSから職場PCへ接続できることを確認しておこう
そのまま帰宅すると上手くいくか不安なので、帰る前にVPSからssh接続できることを確認しておきましょう。
VPSからの接続確認を行うために、まず職場PCからVPSに対して(常時接続のものとは別に)普通にssh接続します。
$ ssh vps
先ほど述べたとおり、VPS側でlocalhostの12345番ポートにssh接続を飛ばせば、職場PCの22番ポートにssh接続を飛ばしたことと同じになります。
すなわち、VPS上で以下のコマンドを叩けば職場PCにssh接続できます。
$ ssh username@localhost -p12345
username
は職場PCでの自分のユーザー名に変更してください。
これで職場PCへssh接続できた場合は成功です。帰りの支度を始めましょう。
自宅からの使い方
使う時は多段階でsshしてあげれば良いだけです。
-
自宅PCからVPSへssh接続(※自宅PCの
~/.ssh/config
にもvpsという名前で接続先が登録されてる想定)$ ssh vps
-
VPSから職場PCへssh接続
$ ssh username@localhost -p12345
おわり。
一発で自宅PCから職場PCまでssh接続を通したい場合は、以下の記事を参考に~/.ssh/config
を書いてみてください。
→ 「多段SSHやポートフォワーディングを '.ssh/config' に書く - Qiita」
参考記事
- 「SSHポートフォワード(トンネリング)を使って、遠隔地からLAN内のコンピュータにログインする - ククログ」
- だいたいこの記事で説明されている内容と同じです
- 「sshポートフォワーディングについて図示してみる」
- リモートポートフォワードのイメージ図が載ってます