ポート監視

ポート監視

ネットワークの話をしていて「ポート」と言うと、イーサネットなどの物理ポートを指すこともあって紛らわしいんですが、このページではTCPとUDPのLayer 4ポートのことを指しています。

Xymonのportという名前のcolumnは、Xymonサーバから監視対象をポーリングするのではなくXymonクライアントがレポートしてきたnetstatの結果から抽出した情報に基づいて監視しています。SSHやHTTPなどいくつかのプロトコルについては標準でアプリケーション層監視ができるのに加え、試したことはありませんがtelnetでしゃべれるようなテキストベースのアプリケーション層プロトコルについてはprotocols.cfgに設定を追加するとtestが定義できるようです。しかしポートをXymonサーバからLayer 4でポーリングするtestは標準では見当たらないので、必要であればtestモジュールを自前で用意する必要があるようです。

Xymonではnetstatの結果から情報を抽出するので、ソケットのstateや、コネクションの両端のアドレスやポート番号を条件に情報を抽出して判定や計数をすることができます。その設定をする箇所は、XymonクライアントではなくXymonサーバの~xymon/server/etc/analysis.cfgで、マニュアルのPORTS STATUS COLUMN SETTINGSのセクションで説明されています。

analysis.cfgは他にCPUやファイルシステムの監視の判定しきい値、プロセス監視の条件などの項目もありますが、ポート監視の抽出条件はPORTというキーワードで始まる行で定義します。PORTに続いてLOCALというキーワードとそのパラメータで、抽出の対象とするローカル側のアドレスとポート番号、EXLOCALで抽出の対象から除外するローカル側のアドレスとポート番号、以下REMOTEEXREMOTESTATEEXSTATEの各条件を定義できます。

マニュアルには

PORT LOCAL=*:80

と書けばローカル側のアドレスは任意でポート番号が80番のソケットが抽出されると解釈できる説明が書かれているんですが、試したところなぜかマッチせず、その続きで説明されている正規表現を使った方法で

PORT LOCAL=%:80$

と書いたところ、うまく動作しました。マニュアルでは

PORT LOCAL=%[.:](80|443)

という例が挙げられていますけれど、BSDのnetstatはアドレスとポート番号の区切りが'.'であるのに対し、RedHat属やDebian属のLinuxディストリビューションのnetstatはアドレスとポート番号の区切りが':'であることには注意して下さい。=の直後の%は、以降が正規表現であることのスイッチで、まったくの想像ですがSQLのLIKEの右辺からの連想ではないかと思います。この先は正規表現に詳しくない方向けの補足ですが、[.:]は'.'か':'のいずれか1文字、(80|443)は'80'という文字列か'443'という文字列のいずれか一方を意味しています。

ここで話をちょいと戻します。

PORT LOCAL=*:80

は先程書いたようにDebianやCentOSのXymonクライアントがレポートしてきたnetstatの結果とはマッチしてくれなかったんですが

PORT LOCAL=*.80

はFreeBSDのnetstatの結果とちゃんとマッチしてくれます。

MINMAXは、正常と判定される下限と上限で、MINのデフォルトは1です。MAXのデフォルトは-1で、上限を設定しないこと意味します。

TRACK=idを指定すると、そのPORT行に該当したソケットの数がport,id.rrdというファイルに取り込まれてグラフ化されます。

例えば

PORT LOCAL=%[.:](80|443)$ STATE=SYN_RCVD MIN=0 MAX=16 TRACK=HTTP_SYN_RCVD

と設定しておけばSYN-RECEIVED状態のソケットの数を監視/グラフ化することができ、WWWサーバがSYN flood攻撃を受けていることを検知できそうです。


index
Copyright(c) 2020 Koh-ichi Ito, All rights reserved
Last update: $Date:: 2020-04-27 17:12:24 +0900#$