1
2

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.

簡易的な対外から自宅ネット監視の構築

Last updated at Posted at 2016-12-16

ことのはじまり

自宅の中のサーバ群は Zabbix を使って監視しており、メールを送信することで、アラートを検知する様にしています。
が、自宅と対外とのネットワークが落ちたときに、アラートメールが届かず、障害が発生していることが分からなかったという事案がありました。

そこで、外から簡単な自宅への監視をしようと決意。
とにかく簡単に収めようと頑張りました。

既存環境

  • CentOS 7
    • Owncloud
    • mail
    • WebServer
    • ...etc
  • アニメサーバ(許可された場所のみ閲覧可)

構築

今回のゴール

今回は、以下の条件をみたすものを作ります

  • 自宅で公開している アニメサーバ (Web) を監視
  • できる限り簡単に。
  • アラートはgmailに飛ばすように。
    • Slackも検討しましたが今回はメールで

とにかく、 簡単 がキーワードです

構築するもの

  • クラウド上のインスタンス
  • curl (標準)
  • mailx
  • 簡単なスクリプト

私の場合は、クラウドはさくらのクラウドを使用しました。
AWS EC2 でもいいと思います。(私は使ったことが無いのでなんとも言えませんが)

ほかは気合と根性で。

やったこと

  • CentOS 入りのインスタンスの起動
  • 各種初期設定
  • mailx のインストール
  • スクリプトの作成

実作業

ほぼあやふやな記憶ですが…(ほぼ覚えてない感じなので間違えてたらすいません)

CentOS7 インスタンスの起動

使用するクラウドサービスによって作業が異なるので、実際の作業は省略。
当方は、CentOS7 系のインスタンスを雑に1台立てました。

各種初期設定

人によってここも変わると思うので、ざっくりと。

SSH設定

パッケージ入れたり(元々入ってた気がする)、鍵入れたり(必要に応じて)します。
手抜きした私は、パスワード認証で頑張ります

SELinux の無効化

伝説のあれ。
今回は別にいらないと思うのですが、一応。

setenforce 0
sudo vim /etc/selinux/config

( config内 )
SELINUX=enforcing
↓
SELINUX=disabled

参考 : http://rfs.jp/server/security/selinux01.html

Firewall設定

CentOS7 なので、firewall-cmd です。
今回は、SSHだけ空いていればOKなので、

sudo firewall-cmd --add-service=ssh 
sudo firewall-cmd --add-service=ssh --permanent

的なコマンドを打ち込めばおk(ちなみに、さくらのクラウドの場合は最初から空いていた気が)

参考 : http://www.torutk.com/projects/swe/wiki/CentOS_7_%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB

mailx のインストール

CentOS7 の場合は、mailx のパッケージをインストールして使用するとmailコマンドの代わりをするらしい

sudo yum install mailx 

インストール後、mailx コマンドで、メールを送信することが可能になる

echo "本文" | mailx -s "件名" 宛先@メアド

スクリプト作成

今回の監視対象はこんな感じ

  • Web監視
    • 200 番とそれ以外を判定
    • 1分間に1回監視
  • アラート検知時にメール発砲
    • 問題発生
    • 修復

上記を満たすには、次の様にする

  • Web 監視 : Curl で読み取り
    • 1分間に1回 : crontab で対応
  • アラート時にメール発砲 : スクリプト作成

というわけで、本稿ではスクリプトの作成をする。

スクリプトとして欲しい機能

  • Curlの取得結果 + 日付
  • アラートの判定
  • メールの送信

至ってシンプル。簡単 is ベスト

今回作ったスクリプト

LANG=ja_JP.utf8
CURL_DATA=`curl --connect-timeout 30 -vvvv http://<your.website.url> 2>&1 `
IF_DATA=`echo $CURL_DATA | grep "HTTP/1.1 200 OK"`
SENDER=`cat mail_flag`
DATE=`date +"%Y/%m/%d %H:%M:%S"`

if [ -n "$IF_DATA" ]; then
  if [ "$SENDER" = "2" ]; then
   echo -e "$DATE\n$CURL_DATA" | col -b | mailx -s 'Recovery' <send_alart@mail.address>
   SENDER=1
  fi
else
  if [ "$SENDER" = "1" ]; then
   echo -e "$DATE\n$CURL_DATA" | col -b | mailx -s 'Problem' <send_alart@mail.address>
   SENDER=2
  fi
fi

echo $SENDER > mail_flag

gist : https://gist.github.com/kayo-tozaki/2d81be1ae23bf564e5b13efd3e4bab03

もっといいやり方があったと思いますが、
私が今できるのはこれまでなので…(汗

スクリプト作った上で困った部分

幾つか困った気がするので。

gmailでアラートが受け取れない

私の場合、メールの送り先はGmailにしていましたが、
最初はメールが受信できていないように見受けられました。

結果としては、迷惑メールフォルダに格納されてたっていうオチ。
届かないと思った場合は 迷惑メールフォルダ をチェック。

gmailで "noname" ってファイルが添付されてる

元々、メールの本文に、エラーの状況を載せようと思ったのですが、
当初の設計では、下記のようなメールが届きました。

スクリーンショット_2016-12-16_21_33_39.png

このように、 "noname" というメールが届いていました。

対策としては、スクリプト内にある、次の2つが有効でした。

  • LANG=ja_JP.utf8
  • echo "本文" | col -b | mailx ...

先人の知恵、素晴らしい。

curl のタイムアウト時間の調整

1分間に1回なので、時間の調整をしないと、アラートが鳴り止まないと言うか、
スクリプトがバグる可能性があるので、タイムアウトの時間を明示的に設定します。
やり方は、下記の通り。

curl --connect-timeout 秒数

デプロイ

Crontab で1分間で1回を実現する

たくさんの先人の知恵があるのですが…

crontab -e 

*/1 * * * * コマンド

分のところを */1 とするといい感じです。
たくさんの先人の知恵、素晴らしい。

以上、完成。

実際に送られてくるメールはこちら。

スクリーンショット_2016-12-16_21_42_53.png

誰かのご参考までに。

1
2
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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?