はじめに
前々回の記事では、Dockerネットワーク内にZabbixサーバを立てて、Zabbixエージェントを監視してみた。
前回の記事では、SNMPエージェントを監視してみた。
今回の記事では、SNMPエージェントのSNMPトラップログを見やすくする。
具体的には、SNMPトラップの要であるMIBファイルを、SNMPエージェント・SNMP監視側の両方に配置することで、OIDを人間が見やすい形にする。
また、SNMPトラップのアイテムの設定をすることで、Zabbixのテンプレートを拡張した監視を試す。
Zabbixサーバ側のマウント設定を変更する
Zabbixの公式の方法でコンテナを立てると、Windowsマシンの場合、フォルダのマウントがうまくいかない。
うまくいかないというのは、Windows側のどのフォルダがマウントされているかわからない。
今回は、zabbix-snmptraps
にCドライブのmnt
フォルダをマウントする。
(zabbix-server-pgsql
は--volumes-from zabbix-snmptraps
オプションによって、zabbix-snmptraps
と同じフォルダをマウントされる。)
# zabbix-snmptrapsコンテナの -v オプションに c:\mnt... を追記する
docker run --hostname zbx-traps --name zabbix-snmptraps -t -v c:/mnt/zbx_instance/snmptraps:/var/lib/zabbix/snmptraps:rw -v c:/mnt/var/lib/zabbix/mibs:/usr/share/snmp/mibs:ro --network=zabbix-net -p 162:1162/udp --restart unless-stopped -d zabbix/zabbix-snmptraps:alpine-6.0-latest
# zabbix-sever-pgsql側は特に変更なし。--volume-fromを参照。
docker run --hostname zbx-server --name zabbix-server-pgsql -t -e DB_SERVER_HOST="postgres-server" -e POSTGRES_USER="zabbix" -e POSTGRES_PASSWORD="zabbix_pwd" -e POSTGRES_DB="zabbix" -e ZBX_ENABLE_SNMP_TRAPS="true" --network=zabbix-net -p 10051:10051 --volumes-from zabbix-snmptraps --restart unless-stopped -d zabbix/zabbix-server-pgsql:alpine-6.0-latest
このときWindowsマシン側にあらかじめフォルダを作っておく必要はない。
SNMPエージェント用マシンを作成する
前回記事と同じ方法で、Ubuntuマシンを立てて、SNMPエージェントをインストールする。
このとき-v
オプションでフォルダをマウントする理由は、UbuntuでダウンロードしたMIBファイルをZabbixサーバ側へ移すため。
(移す作業は手作業。Cドライブにあるファイルを移す。後述する。)
docker run --name ubuntu-3 --hostname snmp-cl2 --privileged -it -v c:/mnt/cl/mibs:/usr/share/snmp/mibs --network=zabbix-net -d ubuntu
コンテナの中に入り、必要なパッケージをインストールする。
docker container exec -it ubuntu-2 bash
apt update
apt install -y vim net-tools
apt install -y snmp snmpd
SNMPのパッケージをインストールした時点で、/usr/share/snmp/mib
にはMIBファイルが複数ダウンロードされた状態になっている。
このあと、さらにMIBファイルをダウンロードする予定。
root@snmp-cl2:/usr/share/snmp/mibs# ls
LM-SENSORS-MIB.txt NET-SNMP-EXTEND-MIB.txt NET-SNMP-TC.txt UCD-DISKIO-MIB.txt UCD-SNMP-MIB.txt
NET-SNMP-AGENT-MIB.txt NET-SNMP-MIB.txt NET-SNMP-VACM-MIB.txt UCD-DLMOD-MIB.txt
NET-SNMP-EXAMPLES-MIB.txt NET-SNMP-PASS-MIB.txt UCD-DEMO-MIB.txt UCD-IPFWACC-MIB.txt
マウントした先のWindowsマシン側のフォルダからも、MIBファイルが見える。
SNMPエージェトをセットアップする
SNMPをインストールしただけでは、サービスが立ち上がっていない。
root@snmp-cl2:/usr/share/snmp/mibs# snmpwalk -v 2c -c public 172.20.240.7 system
Created directory: /var/lib/snmp/cert_indexes
system: Unknown Object Identifier (Sub-id not found: (top) -> system)
root@snmp-cl2:/usr/share/snmp/mibs# service --status-all
[ - ] procps
[ - ] snmpd
root@snmp-cl2:/usr/share/snmp/mibs# service snmpd start
* Starting SNMP Services snmpd [ OK ]
root@snmp-cl2:/usr/share/snmp/mibs# service --status-all
[ - ] procps
[ + ] snmpd
root@snmp-cl2:/usr/share/snmp/mibs# snmpwalk -v 2c -c public 172.20.240.7 system
system: Unknown Object Identifier (Sub-id not found: (top) -> system)
SNMPデーモンをスタートさせたあとでも、snmpwalk
の結果、OIDが見つけられていない。(最終行)
snmp.conf
ファイルの4行目のmibs:
をコメントアウトする
root@snmp-cl2:/# cat /etc/snmp/snmp.conf
# As the snmp packages come without MIB files due to license reasons, loading
# of MIBs is disabled by default. If you added the MIBs you can reenable
# loading them by commenting out the following line.
# mibs :
# If you want to globally change where snmp libraries, commands and daemons
# look for MIBS, change the line below. Note you can set this for individual
# tools with the -M option or MIBDIRS environment variable.
#
# mibdirs /usr/share/snmp/mibs:/usr/share/snmp/mibs/iana:/usr/share/snmp/mibs/ietf
その上で再度snmpwalk
する
snmpwalk -v 2c -c public 172.20.240.7 system
snmpwalk -v 2c -c public 172.20.240.7 .
相変わらず「Cannot find module」「Did not find」「Unlinked OID in 」といったエラーメッセージが流れてくる。
ここまでは、前回記事で通った道。
/etc/snmp/snmpd.conf
の2ヶ所を変更する。(下記画像の黄色のところ)
-
agentaddress
は127.0.0.1
ではなく、自身の固定IPアドレス172.20.240.7
にする -
rocommunity
はDockerネットワークのセグメント172.20.0.0/16
にする
これでsnmpwalk
の結果がズラズラと大量に表示されるようになるはず。
MIBファイルをさらに取得する
ZabbixサーバにMIBファイルを渡すために、Ubuntu側でインターネットからMIBファイルをダウンロードしておく。
前述のとおり、apt install snmp
をした時点で、MIBファイル(.txtファイル)が/usr/share/snmp/mib
に生成されが、さらにほかのMIBを取得する。
apt install -y snmp-mibs-downloader
download-mibs
MIBファイル置き場に、新たにiana
とietf
フォルダが生成される。
root@snmp-cl2:/usr/share/snmp/mibs# ls
LM-SENSORS-MIB.txt NET-SNMP-EXTEND-MIB.txt NET-SNMP-TC.txt UCD-DISKIO-MIB.txt UCD-SNMP-MIB.txt
NET-SNMP-AGENT-MIB.txt NET-SNMP-MIB.txt NET-SNMP-VACM-MIB.txt UCD-DLMOD-MIB.txt iana
NET-SNMP-EXAMPLES-MIB.txt NET-SNMP-PASS-MIB.txt UCD-DEMO-MIB.txt UCD-IPFWACC-MIB.txt ietf
iana
フォルダの中身
root@snmp-cl2:/usr/share/snmp/mibs# ls iana
IANA-ADDRESS-FAMILY-NUMBERS-MIB IANA-GMPLS-TC-MIB IANA-LANGUAGE-MIB IANA-PRINTER-MIB IANATn3270eTC-MIB
IANA-CHARSET-MIB IANA-IPPM-METRICS-REGISTRY-MIB IANA-MALLOC-MIB IANA-PWE3-MIB IANAifType-MIB
IANA-FINISHER-MIB IANA-ITU-ALARM-TC-MIB IANA-MAU-MIB IANA-RTPROTO-MIB IPFIX-SELECTOR-MIB
ietf
フォルダの中は大量のファイルがあるので、巻末に記載する
これらのMIBファイルをZabbixサーバ側のパス/usr/share/snmp/mibs
に移動する。
その際、iana
やietf
のフォルダからMIBファイルを出して、mibs
フォルダ直下にすべてファイルを展開する。
フォルダを再帰的に見てくれるのかわからないので、念のため。
Zabbixサーバの設定変更
ZabbixサーバがMIBファイルを参照できるようにする
こちらの記事を大いに参考にした。
まずはzabbix-server-pgsql
コンテナに管理者権限で入る。
docker container exec -u 0 -it zabbix-server-pgsql bash
/usr/share/snmp/snmp.conf
を作成し、以下の内容を書き込んで保存。
参考記事でも書かれているが、このコンフィグファイルは元から存在しないため、自分でファイルを作成する必要がある。
公式が出している手順に沿って作ったコンテナなのに、必要なファイルが無いことが不思議である。
MIBDIRS /usr/share/snmp/mibs:/var/lib/zabbix/mibs
MIBS all
ここまできたら、MIBファイルの場所をマウントしている2つのコンテナzabbix-snmptraps
とzabbix-server-pgsql
を再起動する
再起動後にIPアドレスが変わった場合は、Zabbixエージェントのconfigファイルの変更が必要であることに注意する。
SNMP TRAP発報する
Zabbixの公式に載っているsnmptrap
コマンド
snmptrap -v 1 -c public 172.20.240.2:1162 '.1.3.6.1.6.3.1.1.5.3' '0.0.0.0' 6 33 '55' .1.3.6.1.6.3.1.1.5.3 s “teststring000”
以下の二つは、適当につくったテストコマンド
snmptrap -v 2c -c public 172.20.240.2:1162 '' coldstart HOST-RESOURCES-MIB::hrSWRunName.89 s "bash111"
snmptrap -v 2c -c public 172.20.240.2:1162 '' coldstart SNMPv2-MIB::sysLocation.0 s 'america'
coldstart
が何を意味しているのかは、まだわからない。
※前回の記事のコメントで親切な方が指摘してくれた。
余談 SNMP Translate
数字の羅列を人間が読める形にしてくれるコマンド
root@snmp-cl2:/usr/share/snmp/mibs# snmptranslate 1.3.6.1.2.1.1.6.0
SNMPv2-MIB::sysLocation.0
Zabbixサーバにテンプレートでデフォルトで設定されている監視設定
ZabbixサーバでSNMPトラップを見てみる
MIBファイルを所定のフォルダ/usr/share/snmp/mibs
に格納し、zabbix-snmptraps
コンテナを再起動する。
再起動する前と後で、Linux: SNMP traps (fallback)
のログの見え方が変わった。
MIBファイルを格納する前は、iso
から始まる人間が理解できない数字の羅列でしかなかったが、MIBファイルを格納した後は人間でも読める形になっている。
# Before: 左辺が数字の羅列でしかなく、人間には理解できない
20240922.152521 UDP: [172.20.240.7]:40000->[172.20.240.2]:1162
iso.3.6.1.2.1.1.3.0 = 55
iso.3.6.1.6.3.1.1.4.1.0 = iso.3.6.1.6.3.1.1.5.3.0.33
iso.3.6.1.6.3.1.1.5.3 = "E2 80 9C 74 65 73 74 73 74 72 69 6E 67 30 30 30 [...teststring000]
E2 = 80 9D [...]"
iso.3.6.1.6.3.18.1.4.0 = "public"
iso.3.6.1.6.3.1.1.4.3.0 = iso.3.6.1.6.3.1.1.5.3
# MIB格納後: 人間が読んでも理解できる内容になった
20240922.155704 UDP: [172.20.240.7]:39578->[172.20.240.2]:1162
DISMAN-EVENT-MIB::sysUpTimeInstance = 55
SNMPv2-MIB::snmpTrapOID.0 = IF-MIB::linkDown.0.33
IF-MIB::linkDown = "E2 80 9C 74 65 73 74 73 74 72 69 6E 67 30 30 30 [...teststring000]
E2 = 80 9D [...]"
SNMP-COMMUNITY-MIB::snmpTrapCommunity.0 = "public"
SNMPv2-MIB::snmpTrapEnterprise.0 = IF-MIB::linkDown
OIDを指定してSNMPポーリング監視
SNMPエージェントのアイテムを追加する
定期的にbash
という文字列を取得できている。
OIDを指定してSNMPトラップ監視
SNMPトラップのキーでは、fallbackか正規表現かの2つを選べる。
ここでは正規表現を選択してみた。
SNMPトラップを実行
snmptrap -v 2c -c public 172.20.240.2:1162 '' coldstart HOST-RESOURCES-MIB::hrSWRunName.1 s "qiita20240923"
Zabbixサーバ側のアイテムで最新のヒストリに、トラップの内容が表示される
なお、正規表現でひっかけた場合、Linux: SNMP traps (fallback)
の方のログには引っかからない!!
また、トラップを送っても自身が保持する値は変更されない
root@snmp-cl2:/usr/share/snmp/mibs# snmpwalk -v 2c -c public 172.20.240.7 HOST-RESOURCES-MIB::hrSWRunName.1
HOST-RESOURCES-MIB::hrSWRunName.1 = STRING: "bash"
参考
おまけ
インターネットからダウンロードしてきた大量の
MIBファイル一覧
root@snmp-cl2:/usr/share/snmp/mibs# ls ietf
ACCOUNTING-CONTROL-MIB IFCP-MGMT-MIB RADIUS-DYNAUTH-SERVER-MIB
ADSL-LINE-EXT-MIB IGMP-STD-MIB RAQMON-MIB
ADSL-LINE-MIB INET-ADDRESS-MIB RBRIDGE-MIB
ADSL-TC-MIB INTEGRATED-SERVICES-GUARANTEED-MIB RDBMS-MIB
ADSL2-LINE-MIB INTEGRATED-SERVICES-MIB RFC1155-SMI
ADSL2-LINE-TC-MIB INTERFACETOPN-MIB RFC1213-MIB
AGENTX-MIB IP-FORWARD-MIB RFC1381-MIB
AGGREGATE-MIB IP-MIB RFC1382-MIB
ALARM-MIB IPATM-IPMC-MIB RFC1414-MIB
APM-MIB IPFIX-MIB RIPv2-MIB
APPC-MIB IPFIX-SELECTOR-MIB RMON-MIB
APPLETALK-MIB IPMCAST-MIB RMON2-MIB
APPLICATION-MIB IPMROUTE-STD-MIB ROHC-MIB
APPN-DLUR-MIB IPOA-MIB ROHC-RTP-MIB
APPN-MIB IPS-AUTH-MIB ROHC-UNCOMPRESSED-MIB
APPN-TRAP-MIB IPSEC-SPD-MIB RPKI-ROUTER-MIB
APS-MIB IPV6-FLOW-LABEL-MIB RS-232-MIB
ARC-MIB IPV6-ICMP-MIB RSERPOOL-MIB
ATM-ACCOUNTING-INFORMATION-MIB IPV6-MIB RSTP-MIB
ATM-MIB IPV6-MLD-MIB RSVP-MIB
ATM-TC-MIB IPV6-TC RTP-MIB
ATM2-MIB IPV6-TCP-MIB SCSI-MIB
BATTERY-MIB IPV6-UDP-MIB SCTP-MIB
BFD-STD-MIB ISCSI-MIB SFLOW-MIB
BFD-TC-STD-MIB ISDN-MIB SIP-COMMON-MIB
BGP-MPLS-LAYER3-VPN-MULTICAST-MIB ISIS-MIB SIP-MIB
BGP4-MIB ISNS-MIB SIP-SERVER-MIB
BRIDGE-MIB ITU-ALARM-MIB SIP-TC-MIB
CAPWAP-BASE-MIB ITU-ALARM-TC-MIB SIP-UA-MIB
CAPWAP-DOT11-MIB Job-Monitoring-MIB SLAPM-MIB
CHARACTER-MIB L2L3-VPN-MULTICAST-MIB SMF-MIB
CIRCUIT-IF-MIB L2L3-VPN-MULTICAST-TC-MIB SMON-MIB
CLNS-MIB L2TP-MIB SMUX-MIB
COPS-CLIENT-MIB LANGTAG-TC-MIB SNA-NAU-MIB
DECNET-PHIV-MIB LISP-MIB SNA-SDLC-MIB
DIAL-CONTROL-MIB LMP-MIB SNMP-COMMUNITY-MIB
DIFFSERV-CONFIG-MIB LOWPAN-MIB SNMP-FRAMEWORK-MIB
DIFFSERV-DSCP-TC MALLOC-MIB SNMP-IEEE802-TM-MIB
DIFFSERV-MIB MAP-E-MIB SNMP-MPD-MIB
DIRECTORY-SERVER-MIB MAU-MIB SNMP-NOTIFICATION-MIB
DISMAN-EVENT-MIB MGMD-STD-MIB SNMP-PROXY-MIB
DISMAN-EXPRESSION-MIB MIDCOM-MIB SNMP-REPEATER-MIB
DISMAN-NSLOOKUP-MIB MIOX25-MIB SNMP-SSH-TM-MIB
DISMAN-PING-MIB MIP-MIB SNMP-TARGET-MIB
DISMAN-SCHEDULE-MIB MOBILEIPV6-MIB SNMP-TLS-TM-MIB
DISMAN-SCRIPT-MIB MPLS-FRR-FACILITY-STD-MIB SNMP-TSM-MIB
DISMAN-TRACEROUTE-MIB MPLS-FRR-GENERAL-STD-MIB SNMP-USER-BASED-SM-MIB
DLSW-MIB MPLS-FRR-ONE2ONE-STD-MIB SNMP-USM-AES-MIB
DNS-RESOLVER-MIB MPLS-FTN-STD-MIB SNMP-USM-DH-OBJECTS-MIB
DNS-SERVER-MIB MPLS-ID-STD-MIB SNMP-USM-HMAC-SHA2-MIB
DOCS-BPI-MIB MPLS-L3VPN-STD-MIB SNMP-VACM-AAA-MIB
DOCS-CABLE-DEVICE-MIB MPLS-LC-ATM-STD-MIB SNMP-VIEW-BASED-ACM-MIB
DOCS-IETF-BPI2-MIB MPLS-LC-FR-STD-MIB SNMPv2-CONF
DOCS-IETF-CABLE-DEVICE-NOTIFICATION-MIB MPLS-LDP-ATM-STD-MIB SNMPv2-MIB
DOCS-IETF-QOS-MIB MPLS-LDP-FRAME-RELAY-STD-MIB SNMPv2-PDU
DOCS-IETF-SUBMGT-MIB MPLS-LDP-GENERIC-STD-MIB SNMPv2-SMI
DOCS-IF-MIB MPLS-LDP-STD-MIB SNMPv2-TC
DOT12-IF-MIB MPLS-LPS-MIB SNMPv2-TM
DOT12-RPTR-MIB MPLS-LSR-EXT-STD-MIB SOFTWIRE-MESH-MIB
DOT3-EPON-MIB MPLS-LSR-STD-MIB SONET-MIB
DOT3-OAM-MIB MPLS-OAM-ID-STD-MIB SOURCE-ROUTING-MIB
DPI20-MIB MPLS-TC-EXT-STD-MIB SSPM-MIB
DS0-MIB MPLS-TC-STD-MIB SYSAPPL-MIB
DS0BUNDLE-MIB MPLS-TE-EXT-STD-MIB SYSLOG-MSG-MIB
DS1-MIB MPLS-TE-STD-MIB SYSLOG-TC-MIB
DS3-MIB MSDP-MIB T11-FC-FABRIC-ADDR-MGR-MIB
DSA-MIB MTA-MIB T11-FC-FABRIC-CONFIG-SERVER-MIB
DSLite-MIB Modem-MIB T11-FC-FABRIC-LOCK-MIB
DSMON-MIB NAT-MIB T11-FC-FSPF-MIB
DVB-RCS-MIB NATV2-MIB T11-FC-NAME-SERVER-MIB
EBN-MIB NEMO-MIB T11-FC-ROUTE-MIB
EFM-CU-MIB NETWORK-SERVICES-MIB T11-FC-RSCN-MIB
ENERGY-OBJECT-CONTEXT-MIB NHDP-MIB T11-FC-SP-AUTHENTICATION-MIB
ENERGY-OBJECT-MIB NHRP-MIB T11-FC-SP-POLICY-MIB
ENTITY-MIB NOTIFICATION-LOG-MIB T11-FC-SP-SA-MIB
ENTITY-SENSOR-MIB NTPv4-MIB T11-FC-SP-TC-MIB
ENTITY-STATE-MIB OLSRv2-MIB T11-FC-SP-ZONING-MIB
ENTITY-STATE-TC-MIB OPT-IF-MIB T11-FC-VIRTUAL-FABRIC-MIB
ETHER-CHIPSET-MIB OSPF-MIB T11-FC-ZONE-SERVER-MIB
ETHER-WIS OSPF-TRAP-MIB T11-TC-MIB
EtherLike-MIB OSPFV3-MIB TCP-ESTATS-MIB
FC-MGMT-MIB P-BRIDGE-MIB TCP-MIB
FCIP-MGMT-MIB PARALLEL-MIB TCPIPX-MIB
FDDI-SMT73-MIB PCE-PCEP-MIB TE-LINK-STD-MIB
FIBRE-CHANNEL-FE-MIB PIM-BSR-MIB TE-MIB
FLOAT-TC-MIB PIM-MIB TED-MIB
FLOW-METER-MIB PIM-STD-MIB TIME-AGGREGATE-MIB
FORCES-MIB PINT-MIB TN3270E-MIB
FR-ATM-PVC-SERVICE-IWF-MIB PKTC-IETF-EVENT-MIB TN3270E-RT-MIB
FR-MFR-MIB PKTC-IETF-MTA-MIB TOKEN-RING-RMON-MIB
FRAME-RELAY-DTE-MIB PKTC-IETF-SIG-MIB TOKENRING-MIB
FRNETSERV-MIB PMIPV6-MIB TOKENRING-STATION-SR-MIB
FRSLD-MIB PMIPV6-TC-MIB TPM-MIB
Finisher-MIB POLICY-BASED-MANAGEMENT-MIB TRANSPORT-ADDRESS-MIB
G9981-MIB POWER-ATTRIBUTES-MIB TRILL-OAM-MIB
G9982-MIB POWER-ETHERNET-MIB TRIP-MIB
G9983-MIB PPP-BRIDGE-NCP-MIB TRIP-TC-MIB
GBOND-MIB PPP-IP-NCP-MIB TUNNEL-MIB
GMPLS-LABEL-STD-MIB PPP-LCP-MIB UDP-MIB
GMPLS-LSR-STD-MIB PPP-SEC-MIB UDPLITE-MIB
GMPLS-TC-STD-MIB PSAMP-MIB UPS-MIB
GMPLS-TE-STD-MIB PTOPO-MIB URI-TC-MIB
GSMP-MIB PTPBASE-MIB UUID-TC-MIB
HC-ALARM-MIB PW-ATM-MIB VDSL-LINE-EXT-MCM-MIB
HC-PerfHist-TC-MIB PW-CEP-STD-MIB VDSL-LINE-EXT-SCM-MIB
HC-RMON-MIB PW-ENET-STD-MIB VDSL-LINE-MIB
HCNUM-TC PW-MPLS-STD-MIB VDSL2-LINE-MIB
HDSL2-SHDSL-LINE-MIB PW-STD-MIB VDSL2-LINE-TC-MIB
HOST-RESOURCES-MIB PW-TC-STD-MIB VM-MIB
HOST-RESOURCES-TYPES PW-TDM-MIB VPLS-BGP-MIB
HPR-IP-MIB PerfHist-TC-MIB VPLS-GENERIC-MIB
HPR-MIB Printer-MIB VPLS-LDP-MIB
IANA-GBOND-TC-MIB Q-BRIDGE-MIB VPN-TC-STD-MIB
IANA-PWE3-MIB RADIUS-ACC-CLIENT-MIB VRRP-MIB
IBM-6611-APPN-MIB RADIUS-ACC-SERVER-MIB VRRPV3-MIB
IF-CAP-STACK-MIB RADIUS-AUTH-CLIENT-MIB WWW-MIB
IF-INVERTED-STACK-MIB RADIUS-AUTH-SERVER-MIB
IF-MIB RADIUS-DYNAUTH-CLIENT-MIB