プログラマ探偵の事件簿:コピペの落とし穴
ソースコードをコピー&ペーストして作った処理が思わぬ落とし穴になったという話である。
事件のはじまり
助手の猫の四十九日を過ぎた頃のことである。TwitterでTWSNMPを検索しているとDocker版でSNMP TRAPを受信できないという書き込みを見つけた。
Docker版で確かに受信できない
気になったので、その日の夜、試してみたらDocker版では確かにSNMP TRAPを受信できない。開発環境のMac OS版では問題なく受信できている。Docker版でもsyslogやNetFlowは受信できているのに不思議だ!
Linux版の問題か?
試しにDocker環境ではなくLinux(Debian 10)環境で試してみた。そうするとLinux版でも受信できない。
SNMP TRAPパケットは届いるか?
そもそもSNMP TRAPのパケットが届いていないのかもしれない。tcpdumpコマンドでキャプチャーしてみた。
# tcpdump udp port 162
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp1s0, link-type EN10MB (Ethernet), capture size 262144 bytes
18:34:55.628411 IP 192.168.1.210.35088 > 192.168.1.6.snmp-trap: C="test" V2Trap(50) system.sysUpTime.0=20026500 S:1.1.4.1.0=.iso.org.dod
20:08:49.489283 IP 192.168.1.210.60490 > 192.168.1.6.snmp-trap: C="test" V2Trap(50) system.sysUpTime.0=20589886 S:1.1.4.1.0=.iso.org.dod
20:44:46.207505 IP 192.168.1.210.59391 > 192.168.1.6.snmp-trap: C="test" V2Trap(51) system.sysUpTime.0=20805558 S:1.1.4.1.0=.iso.org.dod.4
た
確かに受信している。
ポートはオープンしているか?
TWSNMP FCがSNMP TRAPを受信するUDPの162番ポートをオープンしているかnetstatコマンドで調べてみた。
# netstat -anup
稼働中のインターネット接続 (サーバと確立)
Proto 受信-Q 送信-Q 内部アドレス 外部アドレス 状態 PID/Program name
udp 0 0 0.0.0.0:43044 0.0.0.0:* 489/rsyslogd
udp 0 0 0.0.0.0:68 0.0.0.0:* 469/dhclient
udp 0 0 0.0.0.0:36937 0.0.0.0:* 25479/snmpd
udp 0 0 0.0.0.0:161 0.0.0.0:* 25479/snmpd
udp 0 0 0.0.0.0:33326 0.0.0.0:* 489/rsyslogd
udp6 0 0 :::2055 :::* 19782/twsnmpfc
udp6 0 0 ::1:161 :::* 25479/snmpd
udp6 0 0 :::162 :::* 19782/twsnmpfc
udp6 0 0 :::514 :::* 19782/twsnmpfcた
確かにオープンしている。
なんと実環境のDocker版では受信できる!
試しに実環境のDocker版で試してみた。なんと受信できる。受信できない環境との違いはベースのLinuxがDebian 9か10だけである。Linuxのファイアウォールの設定などいろいろ比べたが違いはない。
マップ設定がデフォルトなのが問題では?
途方にくれていると助手の猫が天から「環境の違い以外にマップ設定の違いもある」とアドバイスをくれたような気がした。
確かに受信できない環境は、テスト用に起動しただけでマップの設定をほとんど変更しないデフォルトのままであった。
試しにマップでSNMP TRAPの受信に関係ある設定を変えてみた。
デフォルトはSNMPv2cでpublicになっている。これをSNMPv3認証にしてみた。ユーザー名、パスワードも適当に設定した。
(ユーザー名とパスワードを空欄から変えたことに効果があったようだ。)
受信できたが元の設定に戻しても受信できる!
なんと、設定を変えるだけで受信できた。しかし、設定を元に戻しても受信できる。一度受信できるようになると受信できな状態に戻らない。
またまた、不思議な現象である。
コピペしたソースコードの修正を忘れていた
マップのSNMPに関する設定が関係することがわかったので、この設定に関連するTRAP受信の処理の処理のソースコードを見直してみた。
あれ、SNMPv2cの処理がSNMPv3の処理のまま残っている。
試しに、この部分を正しく修正して、受信できない環境で試してみた。
受信できるようになった。
助手の猫から一言
「プログラムは沢山コピペすることがあるけど、変更すべきところを忘れてバグになることもある!」
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。