man snmpcmd
とか man snmpd.conf
とか man snmptrapd.conf
とか tcpdump
とかで試行錯誤で推測した内容からのメモ。全然見当違いの可能性もある。
SNMP v3 のエージェントはエージェントを一意に識別するための engineID
を設定する必要がある。engineID
は不変で別のエージェントの engineID
と競合してはならない。
Net-SNMP では engineID
は未設定だとマシンのホスト名に対して見つかる最初の IP アドレスが使用される、と日本語の man にはるけど、英語の man では最初の起動時にシステム時刻と乱数に基づいて生成されるとなっている。
生成済の engineID
を削除して再生成を何度か試したところ毎回異なる値になったので、英語の man のが正しいと思われる。engineIDType
の設定で日本語の man と同じように生成することもできると思う。
生成された値は /var/lib/net-snmp/snmpd.conf
に記録される。
SNMPv3 で snmpwalk
すると、最初はユーザーや engineID
は空でリクエストが送信され、エージェントからは .1.3.6.1.6.3.15.1.1.4.0=225
のような値が応答される。この OID は SNMP-USER-BASED-SM-MIB::usmStatsUnknownEngineIDs.0
という名前で、225 という値は engineID
が不明なためにドロップされたパケットの数、らしい、MIB ファイルの記述によると。確かに実行するたびに値がインクリメントされている。
この応答が返ってくるとき、一緒に engineID
も付いて返ってくる。snmpwalk
は(つまりマネージャーは)この engineID
を使って目的の OID の値を取得するためにもう一度リクエストする。
つまり、SNMPv3 を使う場合は engineID
を取得するために1往復分余分にパケットがやり取りされている。もちろん engineID
は不変という前提なので、一度取得した engineID
をキャッシュしておけば必要ない、ただし snmpwalk
はそんなのキャッシュしてないので毎回1往復余分にパケットをやり取りする。
一方、snmptrap
コマンドでトラップを送る場合、snmpd
の初回起動時に生成された engineID
のとは別の engineID
が生成されて、その engineID
を付けてトラップが送信される。
ここで生成された値は /var/lib/net-snmp/snmpapp.conf
に記録される。
トラップの場合、送信元がエージェントで送信先がマネージャーなので、エージェントはマネージャーが自分の engineID
を知っているという前提でトラップを投げる。つまり、snmpwalk
(で送られる GetRequest)のときのように1往復余分にやりとりしたりせず engineID
が違ってればパケットが無視されておしまい。
snmptrapd
で v3 のトラップを受けるためには、送信元の snmptrap
の engineID
を調べて、その値を元に送信先の snmptrapd
でユーザーを作成する必要がある。
たぶん、ネットワーク機器とかの組み込みの SNMP なら GetRequest に応答する engineID
とトラップの engineID
は同じ?なのかな??なのでマネージャーは GetRequest したときの engineID
を記憶しておいてトラップを受信したときに照合することができる?のだろうか??マネージャーが Net-SNMP だと無理そう?だけど??
Net-SNMP の snmpd
と snmptrap
だと別々の engineID
が生成されることがあるのでそういうのはできない。
v3 snmptrap
とかでググると、適当な engineID
をベタ書きで snmptrap
コマンドの引数にしている例が多いのだけど、本当ならエージェントの /var/lib/net-snmp/snmpapp.conf
に記録された engineID
を使ってマネージャーの snmptrapd
を設定するのが正しい?ような気がする??
2ヶ月ぐらい前に社内に書いてたメモからのコピペ。
うーん、結局のところよく判っていない。いろいろあって実案件でこの知識使うこともなくなったので、詳しくは調べていない。
というかなんでこんなニッチなことを調べる必要に迫られたのか・・なにエンジニアなのかわからなくなるわ。