ubuntu on WSL に ngrok を通して ssh する

ubuntu のバージョンは18.04を使います。また、ubuntu のインストールが終わって最初にターミナルを立ち上げた直後を想定してます。

cat /etc/lsb-release
# DISTRIB_ID=Ubuntu
# DISTRIB_RELEASE=18.04
# DISTRIB_CODENAME=bionic
# DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"

また ngrok pro アカウントなので、このアカウント上で以下を行ってます。異なるプランの場合は参考程度にしてください。
また、同じプランの場合でも、悩みながらやった為、無駄な過程が含まれてる可能性があります。

流れは以下の通りです。

  1. ngrok ダウンロード
  2. sshd 周り
  3. ssh 周り
  4. tcpトンネリング

1. ngrok ダウンロード

まず以下で ngrok バイナリが ZIP 化されたファイルをダウンロードしてきます。

curl -O https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
# ngrok-stable-linux-amd64.zip が作られる

ubuntu には最初この ZIP を解凍する為のコマンドが無いので、そのためのコマンドunzipをインストールします。

sudo apt update
sudo apt install unzip -y

先程のファイルを解凍します。

unzip ngrok-stable-linux-amd64.zip
ls 
# ngrok があるハズ

解凍すると同じディレクトリにngrokバイナリができてます。ngrokを使うために認証が必要なので以下で認証も行っておきます。

./ngrok authtoken <YOUR_AUTH_TOKEN>

2. sshd 周り

どうやらsshdを起動していないと、ssh時にssh_exchange_identification: Connection closed by remote hostというエラーに遭遇します。

これを回避する為にまず、sudo vim /etc/ssh/sshd_configで設定ファイルを開き以下の2行のコメントアウトと編集をします。(2行は続けてではなく離れてます)

ubuntu on WSL で作業します。

# TCPKeepAlive yes
# ClientAliveInterval 0

を以下に編集。

TCPKeepAlive yes
ClientAliveInterval 600

また以下で/etc/ssh/ssh_host_rsa_keyというファイルも作ります。

ssh-keygen -f /etc/ssh/ssh_host_rsa_key -N '' -C '' -b 4096 -t rsa -m PEM
# `/etc/ssh/ssh_host_rsa_key` と `/etc/ssh/ssh_host_rsa_key.pub` ができる

できたらsshdを起動します。

/etc/init.d/sshd start

3. ssh 周り

鍵でsshで接続できるようにする為authorized_keyなどを作ります。まだ ubuntu on WSL で作業します。

# `~/.ssh`ディレクトリ作成
mkdir ~/.ssh && chmod 700 ~/.ssh
# `~/.ssh/id_rsa`と`~/.ssh/id_rsa.pub`作成
ssh-keygen -f ~/.ssh/id_rsa -N '' -C '' -b 4096 -t rsa -m PEM
# 公開鍵で`~/.ssh/authorized_keys`を作る
cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys \
&& chmod 600 ~/.ssh/authorized_keys

ここまで済んだら、以下のコマンドで表示される、-----BEGIN RSA PRIVATE KEY-----から-----END RSA PRIVATE KEY-----\nまでをコピーしてローカルマシンで利用しやすいようにslackなどに貼り付けて送ります。

cat ~/.ssh/id_rsa
# -----BEGIN RSA PRIVATE KEY-----
# ...
# -----END RSA PRIVATE KEY-----
#

ローカルマシンに戻り、先程コピペしたものから秘密鍵ファイル(ここでは~/.ssh/wsl)を作り、以下でパーミッションも整えます。

chmod 600 ~/.ssh/wsl
  1. tcpトンネリング

ubuntu on WSL に戻り以下で tcp トンネリングを行います。

./ngrok tcp 22 --region jp

すると以下のような感じでログがでます。

Session Status                online
Account                       純 (Plan: Pro)
Version                       2.3.35
Region                        Japan (jp)
Web Interface                 http://127.0.0.1:4040
Forwarding                    tcp://0.tcp.jp.ngrok.io:15368 -> localhost:22

ここのForwardingというのがsshするのに必要な情報です。ここで上記の場合ホストが0.tcp.jp.ngrok.io、ポートが15368で待ち構えられてるというのが分かります。

では、これまでの情報からsshしてみます。(ちなみにユーザー名はnju33

# -o 'StrictHostKeyChecking no' はホスト検証回避の為
ssh -o 'StrictHostKeyChecking no' nju33@0.tcp.jp.ngrok.io -p 15368 -i ~/.ssh/wsl
# Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 4.4.0-18362-Microsoft x86_64)
# ...
# nju33@DESKTOP-MLLARGC:~$

Welcome ~がでたら完了です。