がらぱっぱ

自分用覚え書き中心(モバイル関係中心だったはずが)

【NURO光】グローバルIPアドレスをLINEで通知する仕組みをつくってみた

外部からVPNで入ったりするために、まずは自分ちのグローバルIPアドレスを知る必要があります。
NURO光グローバルIPアドレスはほとんど変わらない半固定という情報もありますが、一応動的IP。
IPが変更されても大丈夫なようにする必要があります。
Dynamic DNS(DDNS)を使ったりとかもありますが、まずはIPアドレスを直接入力できるようにグローバルIPのアドレスを通知する仕組みを作ります。

通知する方法も色々ありますが、グロバルIPにつなぐのは外出時になるわけですから、スマホに通知が来るLINEが一番いいと思います。

処理の概要

というわけで、以下のような形でグローバルIPが変わったらLINEに通知するようにします。
f:id:garapappa:20210305201625p:plain
・常時電源ONのサーバ(lubuntu)から定期的にグローバルIPアドレスを取得する
グローバルIPアドレスが変化したらLINEに変更したIPアドレスを通知する
・次回起動の比較用に現在のIPアドレスを覚えておく
・(未実装)この通知システム自体がちゃんと動いているかを時々LINEに通知する(いきてるでー)
・一定周期(一時間おきくらい)で起動する

常時電源ONのサーバ(lubuntu)から定期的にグローバルIPアドレスを取得する

とりあえず手っ取り早くグローバルIPを教えてくれる外部サービスを利用する

ここ
inet-ip.info

このページにも書いてありますが、curlコマンドで生グローバルIPアドレスそのものが取得できます。

curl inet-ip.info

らくちん

外部サービス依存になるからF660Aの管理画面をスクレイピングして取得(未実装)

やはり外部サービスなので、サービスの停止や廃止に影響されるのが怖いです。
F660Aの管理画面から「ステータス>>ネットワークインタフェース情報>>WAN接続情報」
グローバルIPがとれるので取得できるはず

グローバル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時間周期で起動するようにします

準備

curlインストール

lubuntu、curlも入っていないんですねぇ

sudo apt install curl

実装

シェルのソース

エラー処理とかいい加減(というか無い)ですが、こんな感じで
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

CRON設定

crontabの編集
crontab -e

エディタで以下を追加します

MAILTO=""
00 * * * * ~/tools/GlobaIPNotify.sh

・メール通知しない設定
MAILTOはcron処理結果をメールで通知するかの設定です。
メール通知ありにするとpostfixが入っていないので
「(CRON) info (No MTA installed, discarding output)」
というメッセージが/var/log/syslogに出ます

・毎時00分にカレントディレクトリ下のtools/GlobaIPNotify.shを実行します

動作結果

LINEに通知が来ます
f:id:garapappa:20210306000846p:plain