ラズパイに固定(静的)グローバルIPで、外部からアクセスしたい
自宅のラズパイに外出先(外部)からSSHアクセスをしたい。
ラズパイで実装した監視カメラを覗いたり、ファイルサーバーアクセスをしたい。
...というように外部から自宅のラズパイにアクセスをしたくなりました。
そんなの簡単じゃん。
そんなときは、ルーターでポートフォワーディングを設定し、グローバルIPからアクセスをすればいい。
いや。ちょっと待ったあぁぁぁあ。
動的IPアドレスでグローバルIPは気づいたら変わってしまいます。そういうものなのだ。
昨日まで、アクセス出来ていたグローバルIPアドレスに今日はアクセスできなくなっているなんてことは当たり前に起こりうる。
そんなときは、固定(静的)グローバルIP設定をすればいいわけなのだが、実はこの設定はプロバイダーへのオプションとして申し込むケースが多く、料金も月額500円〜1000円ほど搾取されてしまう。
貧乏人の僕にはこのお金を払うのはもったいないので、それなら自力で
「ラズパイでグローバルIPを通知し、外部からアクセスしてみよう」と思いついたので、ぜひ参考にどうぞ。
まず、ここまでの設定をしておきましょう。
余力があればこちらの記事も参考に↓
Raspberry Pi3のLAN外からのSSH接続設定方法
https://qiita.com/3no3_tw/items/4b5975a9f3087edf4e20
ラズパイのグローバルIPを通知し、外部からアクセスしてみる
動的IPの仕組みでグローバルIPはいつのまにか変化してしまう。
ならば、変化したグローバルIPを知ることができれば、そのIPにアクセスを行い、いつでもラズパイにアクセスできる。そうだ。グローバルIPをLINEで通知しようではないか。
実装に際して、LINE送信のためのトークンを取得お願いします。
サクッと3分くらいで完了します。
[超簡単]LINE notify を使ってみる
https://qiita.com/iitenkida7/items/576a8226ba6584864d95
ラズパイでグローバルIP確認
$ curl inet-ip.info
今回はこちらのコマンドの結果を、変化があったタイミング(グローバルIPアドレスが変化したタイミング)でLINEにて通知します。
ラズパイでグローバルIPのLINE通知システム
以下コピペでGrobalIP_Rasp.py
を作成。token = '取得したLINEのトークン'
は各自のトークンを使用下さい。
#coding:UTF-8
import requests
import subprocess
import time
import sys
import datetime
def main():
globalIP_backup = ""
while True:
#実行コマンド
cmd = "curl inet-ip.info"
globalIP = (subprocess.check_output(cmd.split())).decode(encoding='utf-8')
globalIP = globalIP.rstrip("\n") #整形
#globalIPが変わったら or プロセス起動時 にLine通知
if globalIP != globalIP_backup:
url = "https://notify-api.line.me/api/notify"
token = '取得したLINEのトークン'
headers = {"Authorization" : "Bearer "+ token}
payload = {"message" : globalIP}
r = requests.post(url ,headers = headers ,params=payload)
globalIP_backup = globalIP
#5分周期で行う
time.sleep(300)
if __name__ == '__main__':
main()
5分周期でグローバルIPをチェックし、変化があった(グローバルIPが変わった)タイミングでLINEを通知します。
(周期を5分にしているため、グローバルIPが変更された場合、最長5分はグローバルIPの変化を検知出来ません。もっと早めたい場合はtime.sleep(300)
をお好きな間隔に変更どうぞ。)
プロセスの常時起動
作成したプログラムは常時起動していなければ意味はありません。
そのままスクリプトを起動しても動きはしますがOOMKillerでプロセスが殺されてしまうだろう。
それを防ぐためにSupervisorでデーモン化しておく。
詳しくは以下の記事で

今回作成した、Supervisor起動に必要な.confファイル
はこんな感じ。
[program:GrobalIP_Rasp] ;プロセス名
command=python3 /home/pi/work_room/GrobalIP/GrobalIP_Rasp.py ;実行したいコマンド
process_name=GrobalIP_Rasp ;ステータスで表示するプロセス名
directory=/home/pi/work_room/GrobalIP/ ;作業ディレクトリ
numprocs=1 ;起動インスタンス数
autostart=true ;自動起動する
autorestart=true ;自動再起動する
user=pi ;起動ユーザー
/home/pi/work_room/GrobalIP/配下にGrobalIP_Rasp.py
とGrobalIP_Rasp.conf
を置く
そして/etc/supervisor/conf.d/
にGrobalIP_Rasp.conf
のシンボリックリンクを貼る
$ ln -s home/pi/work_room/GrobalIP/GrobalIP_Rasp.conf /etc/supervisor/conf.d/GrobalIP_Rasp.conf
これで準備完了。再起動します。
ラズパイの固定(静的)グローバルIPがLINEで通知された
初回起動時にIPアドレスがLINEから送信されます。
その後はバックグラウンドでプロセスが常駐し、グローバルIPが変化した場合にLINE通知を受けとれます。
グローバルIPが変化するタイミングは約2日ほどでしょうか。(ルーター、プロバイダー等に依存しますが...)
このグローバルIPを使ってラズパイにアクセスしてみます。
$ ssh pi@[グローバルIP] -p [ポートフォワーディングするポート]
ラズパイにsshログインできました。
これで外部からssh以外にも、ラズパイで実装したファイルサーバーや、自宅の監視カメラへのアクセスが出来ますね。セキュリティ設定は慎重に。
ということで、LINEを活用すればラズパイを固定(静的)グローバルIP化する必要がないんですね。
最後に
Supervisorでプロセスを常時起動させなくても、cronで指定時間ごとに処理を行うという風に実装してみても良かったですね。いろいろ方法はあるのでお好きなやりやすい方法でグローバルIPを通知してみると良いかも。
コメント