使用環境
外部サーバー:Ubuntu16.04
自宅サーバー:Raspbian Stretch Lite (on Raspberry Pi 3 Model B)
対象PCから外部サーバーへリモートポートフォワード
リモートポートフォワーディングとは、外部サーバのポートに送られたパケットをローカルサーバのポートに転送する機能のことです。Raspberry Pi側から次のコマンドを実行するとsshトンネルを作成できます。
$ ssh -R [外部サーバー側の空いているポート]:localhost:[Raspberry Piのsshポート] -i [秘密鍵の場所] -p [外部サーバーのsshポート] [ユーザー名]@[外部サーバーIPアドレス]
(例)$ ssh -R 10001:localhost:22 -i /home/user/.ssh/id_rsa -p 10000 user@serverip
(例)で説明すると、serverip:10001からlocalhost:22へのトンネルが出来上がりました。sshでserverip:10001に接続すればRaspbery Piにつながります。コマンドについては「ssh リモートポートフォワード」などで検索すると良いページがたくさん出てくると思います。
autosshを使えば接続が切れても自動再接続
上で使ったsshコマンドは接続が切れた場合手動で再接続する必要があります。これを自動化してくれるautosshを使えば便利です。aptでインストール出来ます。
$ sudo apt install autossh
コマンドをsshからautosshに変えるだけで使えます。
$ autossh -R 10001:localhost:22 -i /home/user/.ssh/id_rsa -p 10000 user@serverip
crontabで起動時にsshトンネル作成
最後にcrontabを使って起動時に自動でトンネルを作成するようにします。次のコマンドで編集モードで起動します。
$ crontab -e
最後の行に次を追加すれば設定完了です。
@reboot /usr/bin/autossh -fN -R 10001:localhost:22 -i /home/user/.ssh/id_rsa -p 10000 user@serverip
追加した-fNはシェルを使用せずにバックグラウンドで実行するコマンドです。Rapsberry Piを再起動して外部サーバー経由でssh接続できれば成功です。