GCE f1-micro インスタンスを介して reverse SSH 接続する


漢なら GCE(Google Compute Engine) f1-micro インスタンスですね!

f1-micro インスタインスを介して, 外出先の PC からでもオフィスとか GPU クラスタとかのリモートに接続したいですね!

やりましょう!

Reverse SSH

今回は, とりあえずてっとりばやく環境が構築できる reverse SSH tunneling を使います.

構成はこんな感じになります.

+-------------+                 +----------+         +----------+
| remote node |  -------------> | f1 micro |  <----- | local PC |
+-------------+                 +----------+         +----------+
                  reverse SSH                   SSH

f1 micro のインスタンスでは, OS には, なんとなく CoreOS を選んでみました.

サーバー側設定

remote note 側での設定です. gcloud をインストールしてあるものとします.
こんな感じのスクリプトを作り, crontab で回すようにします.

pgrep -f "google_compute_engine" > /dev/null 2>&1 || gcloud compute --project "example.com:PROJECTNAME" ssh --zone "us-west1-a" "INSTANCE" -- -N -f -R 19998:localhost:22

既存に動いているプロセス判定はもっとスマートにしたいところ.

これにより, f1 micro インスタンスで, ポート 19998 に ssh すると, remote node にログインできるようになります.

ローカル PC 設定

gcloud コマンドを駆使して直接リモートに console ログインするのはなんかうまくいかなかったので, 一旦 gcloud ssh ~ とかして f1 micro インスタンスの IP アドレスと, 使っている SSH private 鍵を取得しておきます.

その後, ~/.ssh/config にホスト名記載します.
CoreOS では nc はインストールされておらず, 同様の機能のものとして ncat がインストールされているので, ncat を使うようにします.

Host f1-micro
    HostName xxx.xxx.xxx.xxx
    IdentityFile ~/.ssh/google_compute_engine
    ForwardAgent yes

Host remote-note
    ForwardAgent yes
    ProxyCommand ssh f1-micro ncat localhost 19998
    ServerAliveInterval 60
    ServerAliveCountMax 4

これで, 手元 local PC から,

$ ssh remote-node

とするとリモート PC にログインできるようになります.

(optional) OpenVPN を使う

接続したいノード数が増えてきたりしたら, OpenVPN に移行するのも検討してみてください.

GCE(Goole Compute Engine) CoreOS インスタンスで OpenVPN サーバを立てる
https://qiita.com/syoyo/items/f4ed1186b644dfdc8c0c

TODO

  • crontab で回すときに既存でプロセスが動いているときの pgrep を極める.
  • 証明書ベースログインとかしたい.
  • 優秀な若人が, f1 micro インスタンスを活用することで, 人類史上最速で優秀な GCE 若人が育成されるスキームを確立したい 日々精進あるのみですね.