paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

自宅のグローバルIP変化をslackで通知する

外から家の環境にアクセスする時はSSL VPNを張るのですがある時繋げなくなってしまいました。
思い当たるのはVPN装置のpfsenseが落ちているかグローバルIPが変わるしか心当たりがありません。

帰宅後グローバルIPが変わっていたことが判明したのですが、変わるなんて滅多に無かったのでタイミングがわかりません。

ISPの簡易レンタルルータなのでログみても良くわかりませんでした。
再起動したかキャリア側の期間終了でDHCP再取得したような感じですが... WAN側が同軸ケーブルのルータなので置き換えができないんですよね。

でも急に繋げなくなると困るので監視ツールを作ります。

グローバルIP監視

ルータにログインしてスクレイピングして、とか考えましたがグローバルIP診断サイトにwgetとかでできるじゃんと思いつきました。
診断サイトにcurlでアクセスしてIPを正規表現で抜けばOK。
記事用にマスクします。

❯ curl -s http://www.myglobalip.com/ | grep -oP "(\d{1,3}\.){3}\d{1,3}" | sed -r 's/[0-9]{1,3}/xxx/g'
xxx.xxx.xxx.xxx

これを一次ファイルに書いておいて定期的に上記のシェルを実行したタイミングで突合すればOKですね。

通知ツール

出先でも分かるようにスマホに飛ばしたいです。

上記と同じくshellから飛ばして終わらせたい。
と調べたら

らへんがお手軽に出来そうです。

shellからのmail送信試したのですがgmailは自前MTAとかだとセキュリティを下げないと受信できないらしく、このためにセキュリティ下げるのはなあと思い諦めました。

www.digitalocean.com

後者のchat系は沢山ありますがたまたまスマホにslackが入っていたのでこちらに通知するようにします。

APIの準備

APIのページに行ったらフレームワークやWebソケットがどうのと種類がたくさんあってどれを使えばいいかパッとわかりません。

curlからメッセージを飛ばすチュートリアルがあったのでこちらを参考にします。

Posting messages using curl | Slack

APIはCreate appから連携するworkspaceと権限等設定して完了です。
(この辺の設定は通勤中にスマホからポチポチとやったのでスクショがありません)

Slackにインストール

これも忘れてしまいましたが作成過程のポップアップ等でSlack側にAPIをインストールできたと思います。 調べれば出るので割愛。

APIのテスト

Authenticationのテストをします。 (tokenはマスク)

❯ curl -d "token=xoxb-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" https://slack.com/api/auth.test
{"ok":true,"url":"https:\/\/masashi-qmv6034.slack.com\/","team":"masashi","user":"the_workspace_reporte", () }%    

OKが返ったので成功した様です。

テストメッセージを飛ばします。

 ❯ curl -d "text=Hi I am a bot that can post messages to any public channel." -d "channel=home-lab" -H "Authorization: Bearer xoxb-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" -X POST https://slack.com/api/chat.postMessage
{"ok":true,"channel":"(略)","ts":"(略)","message":{"bot_id":"B06491FEEAV","type":"message","text":"Hi I am a bot that can post messages to any public channel.","user":"(略)}}}%    

slack側を見るとメッセージ受信しました。OKです。
通知ツールの名前がよくわからないデフォルトのやつになってしまった。
どう変更するんだろ。まあこのままでもいいか。

IPアドレス変更メッセージを送信

IPが変わった体でメッセージを飛ばしてみます。

マスク版IPを変数に入れておいて、

IPADDRESS=$(curl -s http://www.myglobalip.com/ | grep -oP "(\d{1,3}\.){3}\d{1,3}" | sed -r 's/[0-9]{1,3}/xxx/g')
❯ curl -d "text=IPアドレスが変更されました。$IPADDRESS" -d "channel=home-lab" -H "Authorization: Bearer $(cat slacktoken)" -X POST https://slack.com/api/chat.postMessage
{"ok":true,"channel":"(略)","ts":"(略)","message":{"bot_id":"B06491FEEAV","type":"message","text":"IP\u30a2\u30c9\u30ec\u30b9\u304c\u5909\u66f4\u3055\u308c\u307e\u3057\u305f\u3002<http:\/\/xxx.xxx.xxx.xxx|xxx.xxx.xxx.xxx>","user":()}}}%   

これも送信OK。

slackでも無事に受信しました。
ちなみにメッセージ内の改行が効かなかったので2回実行してます。

旧IP、新IPの診断もOKです。
globalipaddressファイルに今のIPを書いてます。

test $(echo $IPADDRESS) = $(cat globalipaddress) ; echo $?
0

あとはこれらをスクリプト化してcronに仕込んでおけばOKですね。

まとめ

slack apiの豊富さに驚いて他のツール通知(LINE, Facebook, X等)にすればよかったかなと思いましたが意外と簡単に作れました。
とりあえずグローバルIPなんて能動的に見るものではないので、push通知があるツールで作りたかったのですがなんとかなりそうです。
home-lab用のチャンネルなので他にも家のラボ系の通知にも使えそう。

とりあえずこれでいつIPが変わってもVPNを貼り直すことができます。
まあ、IPの接続先変更はOKとしてもOPENVPN側のconfigを直す必要があるのですが...