コマンドラインでのnet.tcp.service[tcp,,**]動作が不自然

広瀬(若)です

アクション設定を済ませ、メール通知出来るかどうかのテストを
していましたら、net.tcp.service[tcp,,**]の動作が微妙におか
しい状況にぶち当たりました。

1、Postfix停止前の状態。
# zabbix_agent -t 'net.tcp.service[tcp,,smtp]'
net.tcp.service[tcp,,smtp] [u|1]
# zabbix_agent -t 'net.tcp.service[tcp,,25]'
net.tcp.service[tcp,,25] [u|1]

・・・通常通りに正常です。直にPort番号でもニーモニックでもOK。

2、Postfix停止させます
[root@www ~]# /etc/init.d/postfix stop
postfix を停止中: [ OK ]

3、再度コマンドラインで確認すると・・・
[root@www ~]# zabbix_agent -t 'net.tcp.service[tcp,,25]'
net.tcp.service[tcp,,25] [u|0]
[root@www ~]# zabbix_agent -t 'net.tcp.service[tcp,,smtp]'
net.tcp.service[tcp,,smtp] [u|1]

・・・上記の通りにPort番号指定とニーモニック指定で違いが出る
状況。tcp,,smtp以外の書式ではmaillogにエラー吐くため、ニー
モニック指定を優先させていました。

※tcp,,22のSSHでも同様で、単に[ssh]だけか、[tcp,,22]の場合、
/var/log/secureにエラーが吐かれるの為、デフォルトは[tcp,,ssh]を設定

さらに、[tcp,,http]を設定してあり、/etc/init.d/http stopを
実行させました。結果が以下の通り。

1,httpd停止前の状態。
[root@www ~]# zabbix_agent -t 'net.tcp.service[tcp,,http]'
net.tcp.service[tcp,,http] [u|1]
[root@www ~]# zabbix_agent -t 'net.tcp.service[tcp,,ssh]'
net.tcp.service[tcp,,ssh] [u|1]
[root@www ~]# zabbix_agent -t 'net.tcp.service[tcp,,smtp]'
net.tcp.service[tcp,,smtp] [u|1]
[root@www ~]# zabbix_agent -t 'net.tcp.service[tcp,,22]'
net.tcp.service[tcp,,22] [u|1]
[root@www ~]# zabbix_agent -t 'net.tcp.service[tcp,,25]'
net.tcp.service[tcp,,25] [u|1]
[root@www ~]# zabbix_agent -t 'net.tcp.service[tcp,,80]'
net.tcp.service[tcp,,80] [u|1]
[root@www ~]#
[root@www ~]#

2、httpサービス停止
[root@www ~]# /etc/init.d/httpd stop
httpd を停止中: [ OK ]
[root@www ~]#
[root@www ~]#

3、コマンドラインで再度状況確認すると・・・
[root@www ~]# zabbix_agent -t 'net.tcp.service[tcp,,80]'
net.tcp.service[tcp,,80] [u|0]
[root@www ~]# zabbix_agent -t 'net.tcp.service[tcp,,25]'
net.tcp.service[tcp,,25] [u|1]
[root@www ~]# zabbix_agent -t 'net.tcp.service[tcp,,22]'
net.tcp.service[tcp,,22] [u|1]
[root@www ~]# zabbix_agent -t 'net.tcp.service[tcp,,21]'
net.tcp.service[tcp,,21] [u|1]
[root@www ~]#

Port番号指定は、当然の状況ですが・・・

[root@www ~]# zabbix_agent -t 'net.tcp.service[tcp,,ftp]'
net.tcp.service[tcp,,ftp] [u|0]
[root@www ~]# zabbix_agent -t 'net.tcp.service[tcp,,http]'
net.tcp.service[tcp,,http] [u|0]
[root@www ~]# zabbix_agent -t 'net.tcp.service[tcp,,smtp]'
net.tcp.service[tcp,,smtp] [u|0]
[root@www ~]# zabbix_agent -t 'net.tcp.service[tcp,,ssh]'
net.tcp.service[tcp,,ssh] [u|0]
[root@www ~]#

ニーモニック指定の場合だと・・・!?

[root@www ~]# /etc/init.d/httpd start
httpd を起動中: [ OK ]

説明が悪く申し訳無いのですが、Webのフロントエンド上で、

net.tcp.service[tcp,,http]
net.tcp.service[tcp,,ssh]
net.tcp.service[tcp,,ftp]
net.tcp.service[tcp,,smtp]

4つの設定を仕掛け、トリガー/アクション設定を済ませた上で、
監視対象であるサーバのhttpdプロセスを落としたところ、落ちる
はずの無い、ssh、ftpがダウンしたという通知が出てきたので調
べてみたところ、上記のような結果になった訳です。

バグ・・・なのか微妙なラインですが、上記の件に関して何か情報があればご提供いただければ幸いです。

[root@www etc]# more /etc/redhat-release
CentOS release 5.4 (Final)
[root@www etc]# rpm -qa | grep zabbix
zabbix-agent-1.8.1-1.el5.JP
zabbix-1.8.1-1.el5.JP

以上です。よろしくお願いいたします。

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー TNK の写真

ソースを見て確認しましたが、'net.tcp.service[tcp,,smtp]'という指定は誤りだと思います。
net.tcp.service[tcp,,smtp]は、net.tcp.service[tcp,,0]と同じことになってしまうと思います。
# ポート番号として atoi("smtp") の値を利用。

つまり、'net.tcp.service[tcp,,smtp]'では、smtpのチェックになっていません。

smtpのチェックを行いたいのであれば、
<code>
net.tcp.service[tcp,,25]
</code>

<code>
net.tcp.service[smtp]
</code>
のどちらかになると思います。

ただし、どちらの方法もmaillogにメッセージが出力されます。
ソース上は、お行儀よくSMTPサーバに接続後QUITコマンドを送るようにしようと考えられてはいるようですが、現時点では、まだその機能はきちんと実装されていません。

該当ソース:
 src/libs/zbxsysinfo/simple/simple.c
  関数: CHECK_SERVICE()
 src/libs/zbxsysinfo/common/net.c
  関数: tcp_expect()

関数tcp_expect()内で、「request」が空であっても「sendtoclose」が指定されていれば、サーバ側に「sendtoclose」で指定された文字列を送出するようにすることで、「lost connection after CONNECT」というログは出なくなると思います。