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


概要

環境

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

手順

  1. いつも通りにラズパイを準備する。

    • ラズパイのパスワード変更はしておいたほうがいいと思う。
  2. ngrokのサイトにサインアップして、Authのとこから、Your Tunnel Authtokenのトークンを取得しておく。

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

    # 取得した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. アクセスポートのチェック

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

    実行例(初回接続時は、yesとタイプするとこがあるカモ)
    pi@raspberrypi2:~ $ ssh [email protected] -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.
    [email protected]'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. アンインストール

    アンインストール
    cd ${HOME} && \
    sudo ./systemd-ngrok/uninstall.sh && \
    rm -rfv ./systemd-ngrok
    
  2. 起動時や、アクセスするポート番号を監視して変更があったら、通知(Email?Slack?/Tweet?)すると便利かもしれない。

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

    authtoken: AaBbCcDdEeFfGgHhIiJj_KkLlMmNnOoPpQqRrSsTt
    tunnels:
      http:
       addr: 80
       proto: http
    
    (実行例)設定書き換え後、以下実行。
    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:~ $