ZABBIXで特定ポートの通信データ量を収集

 article  Comments Off on ZABBIXで特定ポートの通信データ量を収集
Aug 092006
 

ZABBIXを使って特定ポートの通信データ量を収集してみます。
iptablesを使ってあらかじめ特定ポートの通信データ量が記録されるようにしておき、ZABBIXからはUserParameterでiptablesコマンドを実行して、そのデータ量を取得できるようにします。

以下、ssh(tcp/22)の通信データ量を記録する場合の例になります。

iptables登録

まず、記録したいポート番号をiptablesで登録します。

# iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
# iptables -A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT

この結果、iptables –listコマンドで以下のようにパケット数やバイト数を記録できるようになります。

# iptables --list INPUT -nvx
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination
    8077   680931 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22

sudoでiptablesコマンドの実行を許可

通常ZABBIX Agentは、zabbixユーザで動作しているため、iptablesコマンドを実行できません。
sudoを使って、特定のiptablesコマンドを実行できるようにしておきます。

zabbix  ALL = NOPASSWD: \
        /sbin/iptables -L INPUT  -nvx,\
        /sbin/iptables -L OUTPUT -nvx

UserParameter登録

/etc/zabbix/zabbix_agentd.confにUserParameterを登録します。

UserParameter=iptables.bytes.input[*],sudo  iptables -L INPUT  -nvx|grep "dpt:$1 $"|awk '{print $ 2}'
UserParameter=iptables.bytes.output[*],sudo iptables -L OUTPUT -nvx|grep "spt:$1 $"|awk '{print $ 2}'

もうちょっと頑張れば、chain(INPUT、OUTPUT)やプロトコル(tcp or udp)も引数指定することが可能ですが、そこまでやってません。

収集テスト

zabbix_getコマンドで登録したキーの値が収集できるか確認します。

$ /home/zabbix/bin/zabbix_get -s 127.0.0.1 -k iptables.bytes.input[22]
725075

[]内の番号はポート番号です。このポート番号でiptablesの出力結果をgrepします。
引数はUserParameterで定義したコマンドの$1になります。

ZABBIX item定義

添付のスクリーンショットのようになります(クリックで拡大)。
実はiptablesを使って特定ポートのトラフィックを計測するアイディアはHotSaNICを参考にさせてもらってます。
グラフの表現力ではまだまだRRDtoolにかないませんが、そこそこのことはZABBIXでもできるということで。

ZABBIX item iptables.traffic.{in,out}

Jul 282006
 

出先から自宅にsshしてメールを読むためにポートフォワード専用ユーザを作りました。
~/.ssh/authorized_keysに以下を記述して、いろいろ制限しています。

no-agent-forwarding,no-X11-forwarding,no-pty,permitopen="localhost:143",permitopen="localhost:80",command="/bin/sleep 8h"

tty端末アクセスを許さず、フォワード可能なポートも制限しています(ポートフォワード自体を禁止したい場合はno-port-forwardingでおこなえます)。

さらに、公開鍵をscpで書き換えられたら意味がないので、sleepコマンドを強制的に実行して実質何もできない状態にしました。

こちらの公開鍵に記述できる内容は、sshd(8)マニュアルのAUTHORIZED_KEYS FILE FORMATに書かれています。

ZABBIX 1.1でネットワークトラフィックを取得するItem定義

 article  Comments Off on ZABBIX 1.1でネットワークトラフィックを取得するItem定義
Jul 052006
 

いつからかZABBIXでネットワークトラフィック情報が収集できなくなっていたのですが、やっと原因がわかりました。キーの値がnetloadinやnetloadoutからnet.if.~に変更になっていたのです。

ZABBIXマニュアルのItemsをみるとnetloadinやnetloadoutというのはなくなっており、net.if.inやnet.if.outというキーが増えています。

しかしnetload*はbps単位で表記される値でしたが、net.if.inやnet.if.outはbytes(デフォルトのmodeの場合)になりますので、キーを単純に置き換えるだけではうまくいきません。

net.if.inやoutを使ってbps単位のトラフィック量を記録するには、Itemで以下のように設定します。

  • Custom maltipilerを8にしてバイト数をビット数にする
  • Store valueを「Delta (speed per second)にして秒単位の値にする

具体的にはページ末に添付した定義になります(いまいち自信なし)。

なお、netloadのときは1分、5分、15分単位でそれぞれキーがありましたが、今回からはキーひとつです。
netloadのように一定時間内でのインターバル平均を収集するには、Itemの設定で”Update Interval (in sec)”を60、300、1500のように変更すれば同様のことがおこなえると思います。

それから、半ば愚痴ですが…
実はZABBIX Agentの一時ファイル(/tmp/zabbix_agentd.tmp)を見ていると、netload{1,5,15}の値はきちんとデータが取れているようにみえます。サーバで収集するタイミングでエラー?になってしまうようでした。だったのでマニュアルをみて確認するのが遅くなってしまいました。
以前のバージョンからのアップグレードの場合だけでなく、クリーンインストールした場合も同じ状態になります。つまりインストール時に作成されるItem定義がすでに古いままなんです。

ZABBIX item net.if.{in,out}

Jun 162006
 

ついにZABBIX 1.1がリリースされました。とはいっても2006-06-02と大分前になりますが。

早速Cobalt Qubeで動かしているDebian/mipselにServerとAgentをビルドしてインストール。

$ tar xzvf zabbix-1.1.tar.gz
$ cd zabbix-1.1
$ ./configure --prefix=/home/zabbix --enable-server --enable-agent --with-mysql --with-net-snmp --with-ldap
$ make
$ sudo make install

以下のsqlを実行してDBスキーマも更新(beta10からのアップです)。

$ mysql -u root zabbix < ./upgrades/dbpatches/1.1beta11_to_1.1beta12/mysql/patch.sql
$ mysql -u root zabbix < ./upgrades/dbpatches/1.1beta12_to_1.1/mysql/patch.sql

プロセス再起動してアップグレード完了。configや起動rcスクリプトは更新不要でした。

週末暇を見て、Solaris 10とGentoo AlphaにもAgentをインストールしてみることにします。常時稼動マシンじゃないけど。

Jun 152006
 

YAMAHAブロードバンドルータRT57iの後継機がInteropで参考出品されていたようです。

私が満足するフィルタリング機能を有する安価なルータとしては、YAMAHA RT57iかCentreCOM AR260Sぐらいしか考えられませんでした。
なおかつIPv6やVoIPできるのはRT57iだけです。何度ヤフオクで入札しそうになったことか。
でも、後継機がでるならもうしばらく待つことにします。RT57i買うにしても、値崩れしそうに思われますし。

Jun 052006
 

ここ最近Bフレッツ回線の不調にみまわれています。
うちは今時10Mbpsの旧ファミリータイプなのですが、下りはせいぜい1.5Mbps、上りはTimeoutで測定不能といった状態。
フレッツスクエアに接続する限りでは問題ないのでプロバイダにも問い合わせたのですが、
「トラフィック異常も見受けられないし、規制もかけていない」
とのこと。

Timeoutしそうな通信、例えばちょっと入力の多いPOST処理等をおこなってからルータのログを確認すると、こんなメッセージが記録されています。

NAT RX-INFO  TCP Synchronize Flag OFF : TCP 203.141.***.*** : 80 > 210.155.***.*** : 1092 (IP-PORT=7)

これは203.141.***.***のサイトにPOSTしにいったときのログです。
TCPのSYN/ACKが返るべきところにSYNがおちた、ACKだけのパケットが届いたように見えます。
SYNフラグが落ちてパケットが届いたというよりも、その前にくるべきSYN/ACKのパケットが欠落した、もしくはルータで取りこぼしたんでしょうか?

フレッツスクエア側では発生してませんからルータでの取りこぼしも考えにくいです。
再度プロバイダに問い合わせですかね…。

■2006-06-15追記
結局Bフレッツ光回線の問題でした。NTTの方に来ていただいてレベルを測定したところ41dBと一発で異常とわかったようです。
何のレベルかよくわかりませんが、通常は小さいほどよく20dB程度が普通とのこと。
ちなみに測定機器はPhotom 211Aというものを使ってました。

Jun 042006
 

自宅内のサーバ間はホストベース認証にしてみました。
正直、ここに書いてあることを読むより

を見ていただいたほうがよっぽどわかりやすく、かつ有益だと思います。

環境

  • サーバ(接続先) : server.example.jp
  • クライアント(接続元) : client.example.jp

上記ホストは/etc/hostsもしくはDNSに登録済みで正引き逆引きともに名前解決可能であることとします。

サーバでの準備

/etc/ssh/sshd_configの設定変更

Protocol 2のみ使用することにしてますので以下の設定を加えます。Protocol 1も使う場合は別の設定が必要ですが、今更使うことは推奨されませんので割愛します。

ホストベース認証を有効にします。
HostbasedAuthentication yes

~/.ssh/known_hostsを信用しません。/etc/ssh/ssh_known_hostsに公開鍵を追加したホストのみホストベース認証を許可します。
IgnoreUserKnownHosts yes

~/.rhostsや~/.shostsを信用しません。/etc/hosts.equivなどのシステムファイルに記述されたホストのみ接続を許可します。
IgnoreRhosts yes

ただしrootユーザの場合は/etc/hosts.equivを見にいってくれません。rootでもホストベース認証したい場合、こちらはnoのままにしておいて~/.rhostsや~/.shostsを有効にする必要があります(auth-rhosts.cで判定しているっぽい)。

クライアントの公開鍵を登録

接続元となるホストからホスト公開鍵をもってきて、/etc/ssh/ssh_known_hostsに登録します。

# ssh-keyscan -t rsa client.example.jp >> /etc/ssh/ssh_known_hosts

IgnoreUserKnownHosts yesにより、ホストベース認証時はユーザの~/.ssh/known_hostsは無視されますので、こちらへの公開鍵登録が必須となります。

接続許可ホスト限定

/etc/ssh/shosts.equivに許可ホストのエントリを追加します(rootの場合は~/.shosts)。

# echo client.example.jp >> /etc/ssh/shosts.equiv

IgnoreRhosts yesにより、ユーザの~/.rhostsや~/.shostsは無視されますので、こちらや/etc/hosts.equiv等へのエントリ追加が必須となります。

クライアントでの準備

この状態で一端接続してみます。

$ ssh -o HostbasedAuthentication=yes server.example.jp
ssh-keysign not enabled in /etc/ssh/ssh_config
ssh_keysign: no reply
key_sign failed
Enter passphrase for key '/home/foobar/.ssh/id_dsa':

という具合に接続元ホストの/etc/ssh/ssh_configを変更が必要といわれます。またHostbasedAuthentication=yesをいちいち指定するのも面倒ですので、これらの設定を/etc/ssh/ssh_configに追加します。

Host *
  HostbasedAuthentication yes
  EnableSSHKeysign yes

■2009-04-04追記
ssh-keyscanで取り込んだ公開鍵が実際の公開鍵(/etc/ssh/ssh_host_rsa_key.pub等)と異なっていて接続できない場合あり。
原因は追求していないが公開鍵ファイルを直接登録して凌いだ。

May 272006
 

最近、インターネット接続の速度低下に悩まされていたのですが、ルータの不調だったようです。
電源オフしてしばらく放置しても直らなかったので、ルータ以外を疑っていたのですが、工場出荷時設定にリセットしたら直ってしまいました。

使っている機種はNECのWR7800Hで、非公式ながら telnet接続でもいろいろな設定変更をおこなえる機種です。

MTUサイズ変更

> entry wan 22 ppp mtu 1454
> entry wan 22 ppp mru 1454

wan 22-26はそれぞれ接続1-5に対応するそうです。

syslog転送

> syslog forward mode enable
> syslog forward address ***.***.***.***

show syslogで表示される項目は大抵変更できるようになっており、同じようなことがhttp://web.setup/syslog_main.htmlのウェブ管理画面でも可能になっていますが、syslogの転送設定だけはtelnetからのみ可能なようです。

ちなみにsyslogのウェブ管理画面のIDとパスワードは通常の管理画面と違い以下に固定されています。

username aterm-maintenance-110
password Aterm-Maintenance-119

いろいろいじくりすぎが原因だったのでしょうか。
しばらくウェブから変更可能な項目だけを設定した状態で使ってみようと思います。

May 192006
 

ZABBIX 1.1beta10 releasedのWhat’s Newを見た感じでは、Oracleサポート追加(Experimentalです)が結構目立ちますが、全体的には機能追加よりもバグフィックスが多くなってきたように思います。

beta9とのdiffをみるとlibs/zbxsysinfo/solaris/net.cに変更が入っていたので、もしや?と思いましたがネットワークトラフィックが収集できない状態は変わっていませんでした。Solaris 10なので仕方ないのかも知れませんが、明記されているSolaris 9(2.9)では問題ないのですかね。

それからbeta10とは全然関係ない話ですが、「特定の時間帯のみアラートをあげる」ようなことがどうやったらできるのか、漠然と考えていましたが、本家マニュアルにずばり記述がありました。
Documentation / Zabbix Manual v1.1 / Configuration / Triggers の例の中に
Example 9. CPU activity at night time
Use of function time():

よくよく考えればそうなのでした。時間を取得する関数さえあればできちゃうんですよね。
ま、zabbix:system[procload].time(0)というtime()関数がItem毎に用意されているような書き方は変な感じはしますけどね 😛

May 172006
 

Solaris 10にBig Sisterをインストールしてみました。
RRDToolはCSWパッケージで導入済です。
他にもPerlモジュールがいくつか必要になりますが、足りないものはCSWパッケージでインストールしておきます。

前提Perlモジュールのインストール

GD

pkg-get -i pm_gdでインストールできます。

SNMP

これはucd-snmpを要求しているのですが、残念ながらCSWパッケージにはありません。
SNMP機器の監視が必要な場合はCPAN等を使ってインストールする必要があります。

net-snmpはCSWパッケージがあるので、pkg-get- -i pm_netsnmpでインストールしておきました。意味ありませんが 😛

LWP::UserAgent

libwww-perlのことなのでpkg-get -i pm_libwwwでインストールできます。

Crypt:SSLeay

pkg-get -i pm_cryptssleayでインストールできます。

URI

pkg-get -i pm_uriでインストールできます。

Net::SMTP

CSW版Perlには最初から入ってます(/opt/csw/share/perl/5.8.x/Net/SMTP.pm)。

Big Sisterのインストール

bsユーザ追加

# useradd bs

configure, make

configureオプションではperlのパスを指定できないため、PATH環境変数を設定してconfigureを実行し、/opt/csw/bin/perlが最初に見つかるようにします。

# env PATH=/opt/csw/bin:$PATH ./configure
# make install

以上で/usr/local/lib/bs配下(default prefix)にインストールされます。
INSTALLドキュメントにも記載されていますが、agentのみ(install-agent)、serverのみ(install-server)といったターゲットを指定することもできます。

uxmon-net準備

/usr/local/lib/bs/adm/uxmon-netにDESCRで対象ホストの

DESCR           features=unix,sysv,solaris              localhost

それからuxmonがroot権限で動作するようにuxmon-asrootファイルを用意します。中身は空でOK。

# touch /usr/local/lib/bs/adm/uxmon-asroot

最初は無用なトラブルを避けるためにroot権限で動かしてしまいますが、最終的にrootで動かすかどうか、セキュリティ的な課題も含めて、カストマイズを進めてから決めるつもりです。

初期動作確認

とりあえずこの状態で起動してみますと

# /etc/init.d/bigsister start
Starting Big Sister ...
  Monitor bsmon                                     OK
  Server bbd                                        OK
  Agent uxmon for runxmon-net

となりuxmonのところでだいぶ待たされた挙句、結局立ち上がってくれません。
x86のDebianに入れたやつはあっけなく動いたんですけどね…。