[メモ](ラズパイ) ngrokを使って外からsshログイン

# 概要
- ngrok を使って外からsshログイン。
- systemdで自動起動<br> [`https://github.com/vincenthsu/systemd-ngrok`](https://github.com/vincenthsu/systemd-ngrok.git)のを使わせてもらっています。

# 環境
- Raspberry Pi 3B
- `2019-04-08-raspbian-stretch` ベース。<br>`apt-get update && apt-get upgrade -y`でパッケージ更新済み(2019/5/16)


# 手順
1. いつも通りにラズパイを準備する。
    - ラズパイのパスワード変更はしておいたほうがいいと思う。

2. [ngrok](https://ngrok.com/)のサイトにサインアップして、[Auth](https://dashboard.ngrok.com/auth)のとこから、Your Tunnel Authtokenのトークンを取得しておく。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75594/84e3e9bf-00de-013c-16fa-6fe74ab4367e.png)

    <!--
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75594/d73527d4-b928-080e-8226-7d72569cd6f3.png)
    -->


3. コンソールを開いて、以下を実行する. `NGROK_TOKEN=~`のところは、うまいように書き換える。

    ```bash
# 取得したTOKENを下に書く
NGROK_TOKEN=AaBbCcDdEeFfGgHhIiJj_KkLlMmNnOoPpQqRrSsTt
#
#以下コピペ
sudo sh -c 'apt update && apt install -y jq git curl unzip' && \
cd ${HOME} && \
git clone https://github.com/vincenthsu/systemd-ngrok.git && \
sed -i -e 's/amd64/arm/g' ./systemd-ngrok/install.sh && \
sudo ./systemd-ngrok/install.sh ${NGROK_TOKEN}
```

4. アクセスポートのチェック

    ```bash
curl -s localhost:4040/api/tunnels | jq -r ".tunnels[].public_url"
```

    ```shell-session:実行例-アクセスに使うポート番号が出てくるので、これを使う
pi@raspberrypi:~ $ curl -s localhost:4040/api/tunnels | jq -r ".tunnels[].public_url"
tcp://0.tcp.ngrok.io:16496
```

5. 外からアクセス (`ssh pi@0.tcp.ngrok.io -p 16496`)

	```shell-session:実行例(初回接続時は、yesとタイプするとこがあるｶﾓ)
	pi@raspberrypi2:~ $ ssh pi@0.tcp.ngrok.io -p 16496 ls /
	The authenticity of host '[0.tcp.ngrok.io]:16496 ([12.23.34.45]:16496)' can't be established.
	ECDSA key fingerprint is SHA256:xppMhi47bVQPIxZrB2OMT6cSdi9zHRVoJrxpkZ2NRjI.
	Are you sure you want to continue connecting (yes/no)? yes
	Warning: Permanently added '[0.tcp.ngrok.io]:16496,[3.17.202.129]:16496' (ECDSA) to the list of known hosts.
	pi@0.tcp.ngrok.io's password:
	bin
	boot
	dev
	etc
	home
	lib
	lost+found
	media
	mnt
	opt
	proc
	root
	run
	sbin
	srv
	sys
	tmp
	usr
	var
	pi@raspberrypi2:~ $ 
	```

# おまけ

1. アンインストール

    ```bash:アンインストール
cd ${HOME} && \
sudo ./systemd-ngrok/uninstall.sh && \
rm -rfv ./systemd-ngrok
```

2. 起動時や、アクセスするポート番号を監視して変更があったら、通知(Email?Slack?/Tweet?)すると便利かもしれない。

3. `/opt/ngrok/ngrok.yml`の設定を書き換えれば、Webサーバを公開できたりする

	```yaml:例:/opt/ngrok/ngrok.yml
	authtoken: AaBbCcDdEeFfGgHhIiJj_KkLlMmNnOoPpQqRrSsTt
	tunnels:
	  http:
	   addr: 80
	   proto: http
	```

	```shell-session:(実行例)設定書き換え後、以下実行。
	pi@raspberrypi:~ $ cd ${HOME}
	pi@raspberrypi:~ $ sudo systemctl daemon-reload
	pi@raspberrypi:~ $ sudo systemctl restart ngrok.service
	pi@raspberrypi:~ $ curl -s localhost:4040/api/tunnels | jq -r ".tunnels[].public_url"
	https://33523460.ngrok.io
	http://33523460.ngrok.io
	pi@raspberrypi:~ $ mkdir -p ${HOME}/www && echo 'Hello World! Qiita!' > ${HOME}/www/index.html && cd ${HOME}/www && sudo python3 -m http.server 80
	Serving HTTP on 0.0.0.0 port 80 ...
	.
	. >>>> ブラウザを開いて、https://33523460.ngrok.io　に接続 <<<<
	.
	127.0.0.1 - - [16/May/2019 14:40:48] "GET / HTTP/1.1" 200 -
	127.0.0.1 - - [16/May/2019 14:40:48] code 404, message File not found
	127.0.0.1 - - [16/May/2019 14:40:48] "GET /favicon.ico HTTP/1.1" 404 -
	.
	. >>>> テストが終わったら、CTRL-C <<<<
	.
	^C
	Keyboard interrupt received, exiting.
	pi@raspberrypi:~/www $ cd ${HOME}
	pi@raspberrypi:~ $ rm -rfv www
	removed 'www/index.html'
	removed directory 'www'
	pi@raspberrypi:~ $ 
	```


	![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75594/bb1aa894-4a6b-0ab7-a589-58c30733a07b.png)