
会社で BSD ベースなサーバルータ、 pfSense を使い始めてかれこれ10年。当時はかなりとっつきにくかった設定も、特に ver.2 系になってからは小気味良く改善されると共に機能そのものも豊富に。それでもかなり永い間、「これは BSD 側のバグ」として解決されてこなかったのが、 SNMPD が吐き出すエラーメッセージでログが埋め尽くされる問題。フォーラムではログレベルをいじれば良い、とあったのですが全く効果無しでした。
pfSense v2.4系がリリースされるに当たり、NET-SNMP パッケージが利用可能に。早速、v2.3稼働中の実機をアップグレードすることにしました。
通常、マイナーアップデートであれば、WebGUI からアップデート可能なのですが、今回は USB 起動メディアを作成してのフレッシュインストールとなります。フレッシュインストールでは、以前の設定をきちんとリストア出来るかがどうしても懸念されますが、公式ドキュメントの手順に沿って行えば問題有りません。
キモは、USB 起動してから表示されるこのダイアログで、「Recover config.xml」を行ってから、「Install」へ進むことです、多分。その後、インストール完走〜再起動すると、今までの設定が全て維持されていました。
無事にアップグレード完了すると、パッケージマネージャから net-snmp をインストールすることが出来ます。そして晴れて SNMPD を無効にすればあの忌まわしきエラーバグは解消されるわけです。
ここでSNMP経由で取得していた項目で取れていないものがあるのに気づきました。調べてみると、NET-SNMP にすることで、今まで使えていた pfSense 独自の MIB が使えないのだそうです。具体的にはルータが現在こなしているセッション数など。
そこにある通り、セッション数を取得する pf コマンドを拡張 oid に放り込む旨の設定を /var/etc/netsnmpd.conf に加えます。そして監視に使っている SNMP サーバからその oid を参照することで、ルータのセッション数を監視出来るようになるわけです。
ところがこれをSNMP鯖でグラフ化すると、ゼロ一直線。早速、コマンドから直接覗いてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
$ snmpget -v 2c -c public 172.16.0.252 1.3.6.1.4.1.8072.1.3.2.3.1.1.9.99.117.114.115.116.97.116.101.115 iso.3.6.1.4.1.8072.1.3.2.3.1.1.9.99.117.114.115.116.97.116.101.115 = STRING: "7893" $ $ $ snmpwalk -v 2c -c public 172.16.0.252 1.3.6.1.4.1.8072.1.3.2 iso.3.6.1.4.1.8072.1.3.2.1.0 = INTEGER: 2 iso.3.6.1.4.1.8072.1.3.2.2.1.2.9.99.117.114.115.116.97.116.101.115 = STRING: "/bin/sh" iso.3.6.1.4.1.8072.1.3.2.2.1.2.9.109.97.120.115.116.97.116.101.115 = STRING: "/bin/sh" iso.3.6.1.4.1.8072.1.3.2.2.1.3.9.99.117.114.115.116.97.116.101.115 = STRING: "/root/snmp_curstates.sh" iso.3.6.1.4.1.8072.1.3.2.2.1.3.9.109.97.120.115.116.97.116.101.115 = STRING: "/root/snmp_maxstates.sh" iso.3.6.1.4.1.8072.1.3.2.2.1.4.9.99.117.114.115.116.97.116.101.115 = "" iso.3.6.1.4.1.8072.1.3.2.2.1.4.9.109.97.120.115.116.97.116.101.115 = "" iso.3.6.1.4.1.8072.1.3.2.2.1.5.9.99.117.114.115.116.97.116.101.115 = INTEGER: 5 iso.3.6.1.4.1.8072.1.3.2.2.1.5.9.109.97.120.115.116.97.116.101.115 = INTEGER: 5 iso.3.6.1.4.1.8072.1.3.2.2.1.6.9.99.117.114.115.116.97.116.101.115 = INTEGER: 1 iso.3.6.1.4.1.8072.1.3.2.2.1.6.9.109.97.120.115.116.97.116.101.115 = INTEGER: 1 iso.3.6.1.4.1.8072.1.3.2.2.1.7.9.99.117.114.115.116.97.116.101.115 = INTEGER: 1 iso.3.6.1.4.1.8072.1.3.2.2.1.7.9.109.97.120.115.116.97.116.101.115 = INTEGER: 1 iso.3.6.1.4.1.8072.1.3.2.2.1.20.9.99.117.114.115.116.97.116.101.115 = INTEGER: 4 iso.3.6.1.4.1.8072.1.3.2.2.1.20.9.109.97.120.115.116.97.116.101.115 = INTEGER: 4 iso.3.6.1.4.1.8072.1.3.2.2.1.21.9.99.117.114.115.116.97.116.101.115 = INTEGER: 1 iso.3.6.1.4.1.8072.1.3.2.2.1.21.9.109.97.120.115.116.97.116.101.115 = INTEGER: 1 iso.3.6.1.4.1.8072.1.3.2.3.1.1.9.99.117.114.115.116.97.116.101.115 = STRING: "7581" iso.3.6.1.4.1.8072.1.3.2.3.1.1.9.109.97.120.115.116.97.116.101.115 = STRING: "128000" iso.3.6.1.4.1.8072.1.3.2.3.1.2.9.99.117.114.115.116.97.116.101.115 = STRING: "7581" iso.3.6.1.4.1.8072.1.3.2.3.1.2.9.109.97.120.115.116.97.116.101.115 = STRING: "128000" iso.3.6.1.4.1.8072.1.3.2.3.1.3.9.99.117.114.115.116.97.116.101.115 = INTEGER: 1 iso.3.6.1.4.1.8072.1.3.2.3.1.3.9.109.97.120.115.116.97.116.101.115 = INTEGER: 1 iso.3.6.1.4.1.8072.1.3.2.3.1.4.9.99.117.114.115.116.97.116.101.115 = INTEGER: 0 iso.3.6.1.4.1.8072.1.3.2.3.1.4.9.109.97.120.115.116.97.116.101.115 = INTEGER: 0 iso.3.6.1.4.1.8072.1.3.2.4.1.2.9.99.117.114.115.116.97.116.101.115.1 = STRING: "7581" iso.3.6.1.4.1.8072.1.3.2.4.1.2.9.109.97.120.115.116.97.116.101.115.1 = STRING: "128000" |
この戻り値の「7581」がセッション数なのですが、原因はそのデータ型が STRING になってしまっていることでした。グラフ化するにはこれが INTEGER や GAUGE であることが必須です。
今回、SNMP の拡張に extend を使いましたが、同じく任意のスクリプト実行してその結果を格納する機能に、pass, sh, exec があるようで、その中にはデータ型を指定出来るものも。早速あれこれ試してみましたが、データ型は STRING のままびくともしません。
今回はここで手詰まり。まだ pfSense に NET-SNMP が使えるようになって間もないので、どなたか先人さまが突破してくださるのを待ちたいと思います。