閉じたネットワークのAndroidにsshでアクセスしたい
仕事はAndroidを使ってフォトブースを作ってます。
物理的に(600kmも)遠く離れたところにあるフォトブースをなんとか管理しなければならないのです。
困ったことにフォトブースで使っているモバイルルータは外部からアクセスができません。
モバイルルータなので、固定IPなんてものもありません。
ubuntuからサーバーにautosshでポートフォワードする
サーバ経由でsshをできるようにするには、sshコマンドで次のようにできます。
(ubuntu上で実行)
$ ssh www.server.com -R 13334:192.168.80.100:3334
でもsshコマンドだとネットワークが切れた時にアクセスできなくなるので、autosshコマンドを使います。
(ubuntu上で実行)
$ autossh photobooth@www.server.com -M 0 -C -N -f -R 13334:192.168.80.100:3334
これで一度サーバーにログインして、13334ポートにssh接続すれば、ルータ内にあるandroidにアクセスできるわけです。
(サーバー上で実行)
$ ssh -p 13334 admin@localhost
いや、そもそもターゲット(今回の例ではAndroid)でautosshが動けば、それでOKなのですが、なんせAndroidなので、そんなコマンドは使えません。
もう一つsshポートフォワード
上記までだと、一度サーバにログインしなければならないので面倒です。
そこでlocalからserverでもsshポートフォワードをすることにします。
サーバー上では同じ13334ポートを指定しているので、localからのsshコマンドはそのままandroidまで転送されます。
(local上で実行)
$ ssh -L 3334:localhost:13334 -f -N maintenance@www.server.com
最後はlocal上でsshをすればOKです。
androidに直接ログインしているように扱えます。
(local上で実行)
$ ssh -p 3334 admin@localhost
もちろんscpだって同じように使えます。
(local上で実行)
$ scp -P 3334 targetFile admin@localhost:/sdcard/
参考
ForwardAgentを使う
SSHコマンドでForwardAgentという機能を使うと、今回説明したような多段接続の際に便利です。
ForwardAgentとは、簡単にいえば、ssh-agentがインストールされて動いていれば、一度接続したことのあるマシンの場合に再度キーを指定しないで接続してくれます。
しかも多段接続の場合でも動いてくれます。
例えば、一度ログインしたことのあるマシンから、以下のようにすれば入れるはず。
$ ssh -A maintenance@www.server.com
多段接続の場合は -tオプションも併用してできます。
$ ssh -A maintenance@www.server.com -t ssh -p 13334 admin@localhost
ForwardAgentについてはssh-agentの基本を参照してください。