自宅のVyattaのトラフィックをグラフ化してモニターする

Bitcasaを使い始めて調子に乗ってアップロードしまくっていたところ、自宅で使っているIIJ mioからお前送出トラフィックが多すぎて迷惑だから、このままだと回線止めるぞと言われてしまいました。そんなこともあって、最近はかなりびびっていて、ちょっとずつしかアップロードしないようにとか窮屈な生活を送っています。IIJ mioは連絡によると、制限値は15GB/dayだそうなので、大体それくらいになるようにびくびくしながらアップロードしている毎日です。おそらくは15GB/dayを1日超えただけで警告が来るわけじゃなくて、1週間くらいの値を見てるみたいで、警告には7日分の送出トラフィックの値が記載されていました。

とはいえ、今日はまだアップロードしても平気なんだっけ、とか不安になることもあるし、前日分だけをガッツリ見るわけでもないなら、日々アップロード量を確認しながらアップロードすればまあ大丈夫かなぁなんてことを思っていて、自宅のサーバじゃない機器たちはPPPoEやらNATやらを一手に引き受けてるVyattaが動いてるノートPCを経由するので、ここのトラフィックをちゃんとグラフ化して監視することにしました。

とりあえず、別にアラートをどっかに投げたりも必要なくて監視というほどでもないので、VyattaのSNMPから取れる値をmuninでグラフを含んだHTMLにした上で、S3にアップロードするという形で、あとはそのURLを日々ブラウザで確認できるようにという構成にしました。下記、備忘録的メモとして作業手順をざっとおさらい。

VyattaのSNMPのコミュニティ名を設定

「Vyatta SNMP」でぐぐるといういつもの行為から入ったところ、そもそもSNMPは動いているようなので、単純にコミュニティ名だけ設定すればよさそう。

というわけで、

$ configure
# set service snmp community home-env
# commit
# save
# exit

という感じで、コミュニティ名だけ設定します。

んで、とりあえず、snmpwalkでちゃんと値が取れるかどうか確認だけします。

$ snmpwalk -v2c -c home-env home-vyatta

で、ずらーといろんな値がちゃんととれればOK。(home-vyattaはVyattaが実際動いているホスト名です。内部でもDNSが動いてるのでこれで名前が引けます。)

muninのセットアップ

自宅でほんとはNAS用なんだけど暇してるGentooが入ったマシン(正確にはVMだけど)にmuninを入れます。munin-nodeになるのもこいつで、このホストからvyattaのSNMPの値を定期的に取得します。

# emerge -av net-analyzer/munin
# emerge --config net-analyzer/munin

というかんじで、–configのほうを実行すると、crontabの設定が入るみたい。

まずはmunin-nodeの設定から、今回はSNMPで取得したいので以下のような形で

# munin-node-configure --snmp home-vyatta --snmpcommunity home-env --shell| sh

とやって、各種pluginの設定をやってもらいます。 とりあえず、もっと細かくいろいろやってもいいのかもしれないけど、とりあえずは、このplugin周りの設定はそのまま利用します。

その後、/etc/munin/munin-node.confを設定します。特に変更する箇所は普通はないかも。ログファイルの場所とhost_nameだけ今回は変更しました。重要なのはというか、設定が必要なのは、Gentooであれば、/etc/munin/plugin-conf.d/munin-nodeのほうで、ホストの設定をします。

[smnp_home-vyatta_*]
    env.community home-env
    env.version 2

という感じで、コミュニティ名とバージョンを設定します。versionが2で正しいのかは実は自信がないんですが、snmpwalkで2でも動くし、実際、そのままでも動いてるのでこれでいいんじゃないかな、という適当な感じ。

最後に、実際、munin-nodeからデータを集めて、HTML化するmunin-cronが走るのも同一のホストなので、今回は/etc/munin/munin.confのほうも設定します。 設定としては、上記と一緒で、SNMPで取ってくる分のホストを追記すればいいんですが、私の環境ではついでに、dbdir,htmldir,logdirを変更しています。(/varにマウントしているディスクが4GBしかないのであまり使いたくないのです。)

[home-vyatta]
    address 127.0.0.1
    use_node_name no

こんな感じで追加します。ここでよくハマるというか、今回もやったのが、この場合、addressはmunin-nodeが動いているアドレスなので、127.0.0.1じゃないとアカンことですね。ちなみに、今回はさらにハマっていて、この設定追加する前に、とりあえず、munin-cronを動かしてみたら、

not a reference at /usr/lib/perl5/site_perl/5.8.8/Munin/Master/Utils.pm

という感じのエラーメッセージとともにエラーになって、あれーとおもって、各所にprintいれて、munin-htmlが動いてないのがまずそう→あれ、なんか$dataが空だな、うーん、なんでだろう、という感じで1日悩んでいて、次の日にまたやってみるかーとおもって触っていて、node treeの設定が空なのが原因であることをやっと突き止めて、あー、先に設定が必要だったのね、みたいな切ないオチを体験もしました。

素直に検索すれば、コレ とかに、”if you dont have collected any data for any node. So the directory usually created in /var/opt/munin is empty.”とかそれっぽいことが書かれたりしてたんですが、まあソースさらっと読めばわかるやろーくらいであまり真剣に検索しなかった過去の自分を後ろから刺したい。

まあ、同時に、そういうときのエラーはもう少し分かりやすくメッセージ出して欲しいッスと思わなくもないんですけどね。

ここまでくれば、

$ sudo -u munin /usr/bin/munin-cron

とかやれば、htmldirに指定したディレクトリに各種HTMLファイルが生成されているはず。

S3にHTML一式を定期的にアップロードする

ここまで来ればあとはこのHTMLを見れる環境にしてあげるだけです。ローカルにApacheやらnginx入れてもいいんですが、munin入れたホストが外部からアクセスするのがちょっとめんどくさい子というのと、まあなんやかんや、自宅サーバってよく間違ってプロセス落としてたりするので、安心できるところにアップロードしとくのがいいかなーとおもって、S3にファイルを置いておくことにしました。

手順というか、方法は簡単で、s3cmdを使ってsyncします。s3cmd –configureをつかって設定ファイルをよしなに生成しておいて、それをmuninユーザから読める位置に置いておきます。んで、下記のようなシェルスクリプトを作ります。 (前提として、S3 websiteが有効なBucketがすでにあってそれを指定しているという前提です。下記だと、xxxxx.mat2uken.netですね。)

#!/bin/bash

/usr/bin/s3cmd -P -c /data/munin/scripts/s3cfg sync /data/munin/html/* s3://xxxxxx.mat2uken.net/ninmu-html/ 2>&1 | logger -t munin-upload -p local0.info

これをmunin-uploadとか名前つけて適当な場所に置いておきます。

最後に、muninに設定されたcrontabをちょっと改変します。

# This runs the munin task every 5 minutes.
*/5   * * * *         /usr/bin/munin-cron

# This runs the munin task every 5 minutes.
*/5   * * * *         /usr/bin/munin-cron && /data/munin/scripts/munin-upload

みたいな感じに。 これで、5分ごとの生成が終わったあとに、s3に更新されたファイルをアップロードします。

という感じで

Vyattaのトラフィック情報をmuninでグラフ化してS3にアップロードするまでの手順をざっとメモ化しました。

これで、以下のようなグラフが見れるようになりました。

../../../_images/munin_traffic_graph_thumb.jpg

まださっき設定したばかりなのでほぼ空っぽのグラフ

これで適宜モニターして、あ、やべーな思ったより使ってるなというのにたぶん気づけるようになったかもしれません。15GB超えたらアラートメールかSNSで通知みたいなのもやってもいいんだけど、実はこれと並行して、あまり制限がないらしいかもめインターネットに申し込んでしまったので、Bitcasa向けの通信は、今後はかもめインターネットに切り替えるつもり、というどんでん返しがあったりするのですが、まあトラフィックを可視化できたので、それはそれできっと使い出があるだろうということでよしとしています。

次はVyattaでPPPoE2本張って特定の宛先だけ、こっちのPPPoE使うみたいな設定例も一応書いておきたいところ。ルーティング追加するだけだけど。(Bitcasaのアプリの通信先特定するパケットキャプチャとかのほうがめんどくさそう。)