ZabbixでSNMPトラップ監視をdocker-composeで構築してテストしてみた

そろそろ真面目にSNMPでネットワーク機器を監視しようと思って勉強中です。
最近だとPrometheusが流行っているみたいですが、snmp_exporterはトラップが受信できないようなので、まずはZabbixを触ってみることにしました。
今回はひとまずSNMPトラップをZabbixで受信するところまでを試します。

実行環境は以下の通り。

$ cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
$ docker --version
Docker version 19.03.6, build 369ce74a3c
$ docker-compose --version
docker-compose version 1.25.3, build d4d1b42b

docker-compose.ymlは以下のようにしました。
zabbix-snmptrapsを使うには/var/lib/zabbix/snmptrapsを
紐付けたボリュームをzabbix-serverと共有して、
ZBX_ENABLE_SNMP_TRAPSをtrueにする必要があります。

version: "3"

services:
  zabbix_db:
    image: mysql:5.7
    container_name: zabbix_db
    volumes:
      - ./db:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=zabbix
      - MYSQL_USER=zabbix
      - MYSQL_PASSWORD=zabbix
      - MYSQL_ROOT_PASSWORD=P@ssword

  zabbix_server:
    image: zabbix/zabbix-server-mysql:alpine-4.4-latest
    container_name: zabbix_server
    volumes:
      - ./snmptraps:/var/lib/zabbix/snmptraps
      - ./mibs:/var/lib/zabbix/mibs
    environment:
      - DB_SERVER_HOST=zabbix_db
      - MYSQL_DATABASE=zabbix
      - MYSQL_USER=zabbix
      - MYSQL_PASSWORD=zabbix
      - ZBX_DEBUGLEVEL=3
      - ZBX_ENABLE_SNMP_TRAPS=true

  zabbix_web:
    image: zabbix/zabbix-web-apache-mysql:alpine-4.4-latest
    container_name: zabbix_web
    ports:
      - "8080:80"
    environment:
      - ZBX_SERVER_HOST=zabbix_server
      - DB_SERVER_HOST=zabbix_db
      - MYSQL_DATABASE=zabbix
      - MYSQL_USER=zabbix
      - MYSQL_PASSWORD=zabbix
      - PHP_TZ=Asia/Tokyo

  zabbix_snmptraps:
    image: zabbix/zabbix-snmptraps:alpine-4.4-latest
    container_name: zabbix_snmptraps
    volumes:
      - ./snmptraps:/var/lib/zabbix/snmptraps
      - ./mibs:/var/lib/zabbix/mibs
    ports:
      - "162:162/tcp"
      - "162:162/udp"

4つのコンテナがちゃんと起動したらzabbix-webにログインできるか試してみてください。
ユーザ名:admin
パスワード:zabbix
でログインできます。

zabbix_snmptraps_001.png

続いてSNMPトラップを受信できるか試します。
Macで以下のコマンドを実行します。IPアドレスはZabbixを構築したサーバのIPに変更してください。
コマンドの内容は適当に拾ってきたものなのでよくわかりません(笑

% snmptrap -v 2c -c public 192.168.100.4 '' netSnmpExperimental netSnmpExperimental.1 s "hogehoge1" netSnmpExperimental.2 s "hogehoge2"

無事受信できればsnmptraps.logに以下の内容が書き込まれます。

$ docker exec -it zabbix_server cat snmptraps/snmptraps.log
20200216.054112 ZBXTRAP 192.168.100.2 NET-SNMP-MIB::netSnmpExperimental 0 (null) NET-SNMP-MIB::netSnmpExperimental.1 hogehoge1 NET-SNMP-MIB::netSnmpExperimental.2 hogehoge2 

では、Zabbixで確認してみます。
設定⇒ホスト⇒ホストの作成でホストを追加します。
SNMPインターフェースに監視する機器のIPを指定してください。

zabbix_snmptraps_002.png

アイテムはひとまずテンプレートのTemplate Module Generic SNMPv2でドバッと追加しました。

zabbix_snmptraps_003.png

ホストの設定が正しければ、監視データ⇒概要で
グループをホストを追加したグループに、タイプをデータに変更すると以下のようにSNMP trapsに何か値が表示されます。
(表示されない場合、しばらく待ってからもう1度トラップを送信するコマンドを実行してみてください)

zabbix_snmptraps_004.png

詳細は最新の値で確認できます。受信したログの内容が表示されると思います。

zabbix_snmptraps_005.png

受信はできているようなのでこれでひとまずOKなのかな?
あとはメール通知とかできると良さそうだけど、ログのタイムスタンプがUTCになってるのはダメそう。
まだMIBとかZabbixの設定方法がいまいちよくわからないのでまだまだ勉強が必要ですねー

次回は実際のネットワーク機器の監視を試してみたいと思います。