6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

自宅のグローバルIPアドレスの変更をMackerelで通知する

Last updated at Posted at 2018-07-22

背景

  • 自宅のRaspberry Piから、Google Cloud PlatformのAPI使ってる
  • Google Cloud Platformは課金上限の設定が出来ないので、APIキーの漏洩が怖い
  • APIキーが漏洩しても大丈夫なように、Google Cloud Platform側でIPアドレスの制限かけよう
  • 自宅は固定IPじゃ無いので、グローバルIPアドレスが変わるたびに、手作業でGoogle Cloud Platformのホワイトリストにプロバイダのネットワークアドレスを追加する
  • とりあえず、グローバルIPアドレスの変更通知はMackerelで対応しよう

ということで、Raspberry Pi上で動かしているmackerel-agentから、グローバルIPアドレスの変更をアラートとしてあげる設定を行いました。
なお、以下Raspberry Piを前提として記述していますが、スクリプト自体はLinux汎用です。

MacherelでRaspberry Piを監視する

参考:Raspberry Pi を Mackerel で監視する

グローバルIPアドレスの変更検知スクリプトを作る

参考:LinuxでグローバルIPアドレスを確認する方法

http://globalip.me でグローバルIPアドレスを取得し、変更が検知されたらエラーを返すスクリプト、checkglobalip.shを作る。Raspberry Piで動作させます。

/home/pi/bin/checkglobalip.sh

checkglobalip.sh
#!/bin/sh
IPFILE='/tmp/globalip'

PREVIP=`cat $IPFILE` 2>/dev/null
IP=`curl globalip.me` 2>/dev/null

if [ "$IP" != "" ]; then
  echo "Global IP address: $IP"

  if [ "$PREVIP" != "$IP" ]; then
    echo $IP > $IPFILE
    if [ "$PREVIP" != "" ]; then
      echo "Global IP address changed from $PREVIP"
      echo
      whois -h whois.nic.ad.jp $IP | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.\S*' | tr '\n' ' '
      exit 1
    fi
  fi
else
  echo "Can't get IP address"
  exit 1
fi

return 0

Macherelのチェック項目として追加

グローバルIPアドレスが変わると、Google CLoud Platformに登録しているIPアドレスの範囲外となり、APIが403を返して使えなくなります。趣味の利用で即時対応は必要ないので、検知は一時間おきにします(Macherelで設定可能な最大値)。あまり頻繁に http://globalip.me にアクセスするのも気が引けますし。
なお、AM4:00頃にglobalip.meが毎度503を返すようなので、max_check_attempts = 2 にします。

/etc/mackerel-agent/mackerel-agent.conf

[plugin.checks.globalip]
command = "/home/pi/bin/checkglobalip.sh"
max_check_attempts = 2
check_interval = 60
memo = "This check monitors change of global IP address."

Mackerel再起動

sudo systemctl start mackerel-agent

MackerelからLINE Notifyでアラート通知

こんな感じで通知が着ます。通知がきたらCMAN見て割り当てIPネットワークアドレスを調べ、Google Cloud Consoleの「APIとサービス」-「認証情報」のサーバーIPアドレスリストに追加。とりあえず自分が使っているプロバイダからのアクセスなら許可ということにします。

正直もうちょっといい方法ないのかなと思わないでもないですが、はたしてどのくらい追加を続けたら、プロバイダのネットワークアドレスを網羅できるのやら。

追記

CMANでネットワークアドレス調べるより、whoisコマンドのほうが良いかも。チェックスクリプトにも仕込みました。

pi@raspberrypi:~ $ whois -h whois.nic.ad.jp 122.26.128.XXX
Network Information:            
a. [Network Number]             122.26.128.0/17
b. [Network Name]               OCN
g. [Organization]               Open Computer Network
(略)                                
Less Specific Info.
----------
NTT COMMUNICATIONS CORPORATION
                     [Allocation]                                122.16.0.0/12

よくわからないけど、アドレスの範囲がOCN(122.26.128.0/17)よりも、Less Specific InfoででてるNTT COM(122.16.0.0/12)のほうが広い。Google Cloud Platformにはこっちを設定したほうが楽。
関係ないけど、OCNがOpen Computer Networkの略だというのは始めて知りました。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?