Python
RaspberryPi
Slack

SlackとRaspberry PiでグローバルIPアドレスの変更を通知

前提条件

  • Raspberry Pi B+
  • Linux 4.9.16+
  • Python 2.7.9
  • Slack

背景

 実家のPCのメンテナンスを頼まれることが度々ある。PCを立ち上げてもらい、グローバルIPアドレスを探し出し、SSHログインを行いトンネルリングし遠隔サポートを行う。実家のグローバルIPを探すステップは面倒である。
 とはいえ、実家用に固定IPアドレスを払い出すというのもコスト的に難しい。

問題 課題
固定グローバルIPアドレス 運用コスト高い
遠隔ログイン用のPCの24時間稼働 運用コスト高い

1. グローバルIPアドレス

 固定されたグローバルIPアドレスは有れば便利であるが、IPアドレスが解ってさえすれば、変動でも構わない。IPアドレスが変わったタイミングで、手元に通知されれば良い。そうだ、Slackを使おう。

2. 遠隔ログイン用のPC

 一般的なPCを24時間稼働させるとコスト的厳しい。省電力PCであれば、電気台は節約できる。そうだ究極の省電力PCが販売されているのではないか。Raspberry PiをPCとして利用しよう。

システム構成

system.png

構築手順

1. Slackアカウントの用意

Slackアカウントを取得し、Incoming Web-hookを取得する
https://api.slack.com/incoming-webhooks

2. プログラムの作成

Raspberry Pi用グローバルIPアドレスが変更されると、通知を飛ばすPythonプログラムを作成する。

開発のポイント

グローバルIPアドレスの取得

以下のサービスを利用するとグローバルIPを教えてくれる。
http://ipcheck.ieserver.net/

import requests
res = requests.get('http://ipcheck.ieserver.net/')

Slackへ通知

import json
import requests
def sendSlackMsg(global_ipaddr):
    """ send message to Slack
    """
    msg = ''
    msg = '\\nglobal IP Addr : ' + global_ipaddr

    payload = json.loads('{"text": "%s"}' % msg)
    r = requests.post('<YOUR_SLACK_INCOMING_WEBHOOK>', data=json.dumps(payload))
    print r.status_code
    print r.text

 汎用的に利用できるため作成物をGitHubで公開した。
https://github.com/thesaitama/checkgip

インストール

リポジトリのクローン

> git clone https://github.com/thesaitama/checkgip.git

 依存関係のインストールと設定ファイルテンプレートの作成する。

> cd checkgip
> pip install -r requirements.txt
> mv checkgip.sample.json checkgip.json

設定

 checkgip.jsonを編集し1.で取得したIncoming Web-hookを設定する。

checkgip.json
{"slackWebhook": "<YOUR_SLACK_INCOMING_WEBHOOK>"}

 設定ファイルに次回比較用のIPアドレスが記録されるため、書き込み権限を付与する。

> chmod +w checkgip.json

3. 定期実行の設定

 作成したプログラムが定期的に実行されるようcronを設定する。

# m h  dom mon dow   command
0 12 * * * python /<DEPLOY_DIR>/checkgip.py > /dev/null

4. セキュリティ対策

 Raspberry Piに各種セキュリティ対策を施す。

  • Brute force
  • iptables

等適切に設定する。(本稿では割愛する)

5. デプロイ

 構成した機材一式を、実家に物理的にデプロイする。

  • ケース(裸ではこころもとないため)
  • 電源(Micro USB 1.5A以上推薦)

6. 利用

  • グローバルIP変更があると、Slackに通知が飛ぶ。
  • 遠隔サポートが必要なタイミングで、Slackに記載されたアドレスにSSHログインを行う。

考察

 グローバルIPアドレスを探し出す苦労をしなくても良くなった。
 クラウド連携の遠隔サポートツールを導入すれば問題は解決するが、Raspberry Piは汎用性が高く、さらなる利用につなげることができそうだ。