前提条件
- 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として利用しよう。
システム構成
構築手順
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を設定する。
{"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は汎用性が高く、さらなる利用につなげることができそうだ。