【NURO光】グローバルIPアドレスをLINEで通知する仕組みをつくってみた
外部からVPNで入ったりするために、まずは自分ちのグローバルIPアドレスを知る必要があります。
NURO光はグローバルIPアドレスはほとんど変わらない半固定という情報もありますが、一応動的IP。
IPが変更されても大丈夫なようにする必要があります。
Dynamic DNS(DDNS)を使ったりとかもありますが、まずはIPアドレスを直接入力できるようにグローバルIPのアドレスを通知する仕組みを作ります。
通知する方法も色々ありますが、グロバルIPにつなぐのは外出時になるわけですから、スマホに通知が来るLINEが一番いいと思います。
- 処理の概要
- 準備
- 実装
- 動作結果
処理の概要
というわけで、以下のような形でグローバルIPが変わったらLINEに通知するようにします。
・常時電源ONのサーバ(lubuntu)から定期的にグローバルIPアドレスを取得する
・グローバルIPアドレスが変化したらLINEに変更したIPアドレスを通知する
・次回起動の比較用に現在のIPアドレスを覚えておく
・(未実装)この通知システム自体がちゃんと動いているかを時々LINEに通知する(いきてるでー)
・一定周期(一時間おきくらい)で起動する
常時電源ONのサーバ(lubuntu)から定期的にグローバルIPアドレスを取得する
とりあえず手っ取り早くグローバルIPを教えてくれる外部サービスを利用する
ここ
inet-ip.info
このページにも書いてありますが、curlコマンドで生グローバルIPアドレスそのものが取得できます。
curl inet-ip.info
らくちん
グローバルIPアドレスが変化したらLINEに変更したIPアドレスを通知する
前回取得したIPアドレスと違う場合はLINEに通知します。
LINE通知の仕組み、LINE notifyがイケてるのでこれを使います
あちこちで紹介されているので、わかりそうなところでここらを参照
djeeeno.blogspot.com
設定はあるものの、curlコマンド一発でLINEに通知できます。
超クール!
グローバルIPが変化したのを検出する(あるいは初回)
IPアドレスを適当なファイルに書き込んで、次回は取得したIPとこれを比較します。
ファイルがない場合は初回だという事でIPを通知します。
今回は「/tmp/global_ip.txt」に書き込む事にします。
グローバルIPアドレスの取得に失敗したら、LINEに「取れなかった」って通知
inet-ip.infoが落ちてたりしたら、LINEに通知します。
とりあえず落ちてるあいだは毎回LINE通知行っちゃうけどまぁいいか
(未実装)この通知システム自体がちゃんと動いているかを時々LINEに通知する(いきてるでー)
一定間隔(あるいはIPアドレスが一定期間かわらなかったら)LINE通知する仕組みが欲しいと思います。
特にNUROはグローバルIPがほとんど変わらないという噂だし、気が付いたらチェックしてなかったぜみたいな事は避けたい。
LINE notifyのサービスもいつ障害起きたり終了するかわからないし。
一週間に一回とか一か月に一回とか通知がくればうざくないし、「あれ?そういえば来てないじゃん」って気が付きます
IP書き込んだファイル(global_ip.txt)の日付を見て判断するか、global_ip.txtに書き込むかで前回通知してからどれくらい経ったかがわかるから実現はできそうです。
一定周期(一時間おきくらい)で起動する
手っ取り早くCRONを使います。
クーロンの書き方はどこかの解説サイトを見てもらうとして、1時間周期で起動するようにします
実装
シェルのソース
エラー処理とかいい加減(というか無い)ですが、こんな感じで
GlobaIPNotify.sh って名前で作成します(なんでもいいけど)
#!/bin/bash FILE_NAME="/tmp/global_ip.txt" LINE_TOKEN="取得したトークン" function send_message() { curl -s -X POST -H "Authorization: Bearer ${LINE_TOKEN}" -F "message=$1" https://notify-api.line.me/api/notify } # 前回取得のGlobal IPをファイルから取り出す # ファイルが存在しない場合、Global IP未取得とみなす if [ -e $FILE_NAME ]; then last_IP=`cat $FILE_NAME` else last_IP="" fi # 現在のGlobal IPを取得 now_IP=`curl -s inet-ip.info` if [ "${now_IP}" = "" ]; then echo "curl error?" send_message "グローバルIPの取得に失敗しました(${last_IP})" elif [ "${now_IP}" = "${last_IP}" ]; then echo "same ip" else echo "change ${last_IP} -> ${now_IP}" # LINEへIPアドレス変更を通知 if [ "${last_IP}" = "" ]; then send_message "初期起動または再起動したよー(${now_IP})" else send_message "IPがかわったよー(${last_IP} -> ${now_IP})" fi echo "" # 変更したIPを覚える echo $now_IP > $FILE_NAME fi
動作結果
LINEに通知が来ます