Open8
ZabbixでSNMPトラップを受け取ってみる

ZabbixをDocker環境で構築する+SNMPで監視するまでを試してみました。
作業メモのような感じです。

↓のような環境を用意済み(10分クオリティ)
Hyper-Vの上にVMが4個(1個はおかしくなって放置)建ってます。
内部ネットワークを192.168.100.0/24で切っていて、それぞれにIPアドレスを振ってます。

①ZabbixサーバをDockerで建てる(VM1)
DockerとDocker Composeはさっくりインストール済み
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf -y install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
sudo systemctl status docker
sudo usermod -aG docker {ユーザ名}
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose.ymlはClaude 3.7 sonnet と作成。
docker-compose.yml
services:
postgres-server:
image: postgres:latest
container_name: postgres-server
environment:
- POSTGRES_USER=zabbix
- POSTGRES_PASSWORD=zabbix_pwd
- POSTGRES_DB=zabbix
volumes:
- postgres-data:/var/lib/postgresql/data
networks:
- zabbix-net
restart: unless-stopped
zabbix-snmptraps:
image: zabbix/zabbix-snmptraps:alpine-7.0-latest
container_name: zabbix-snmptraps
volumes:
- snmptraps-data:/var/lib/zabbix/snmptraps:rw
- mibs-data:/usr/share/snmp/mibs:ro
ports:
- "162:1162/udp"
networks:
- zabbix-net
restart: unless-stopped
zabbix-server-pgsql:
image: zabbix/zabbix-server-pgsql:alpine-7.0-latest
container_name: zabbix-server-pgsql
environment:
- DB_SERVER_HOST=postgres-server
- POSTGRES_USER=zabbix
- POSTGRES_PASSWORD=zabbix_pwd
- POSTGRES_DB=zabbix
- ZBX_ENABLE_SNMP_TRAPS=true
ports:
- "10051:10051"
volumes:
- zabbix-server-data:/var/lib/zabbix
- zabbix-server-modules:/usr/lib/zabbix/modules
- zabbix-server-externalscripts:/usr/lib/zabbix/externalscripts
- zabbix-server-alertscripts:/usr/lib/zabbix/alertscripts
volumes_from:
- zabbix-snmptraps
depends_on:
- postgres-server
- zabbix-snmptraps
networks:
- zabbix-net
restart: unless-stopped
zabbix-web-nginx-pgsql:
image: zabbix/zabbix-web-nginx-pgsql:alpine-7.0-latest
container_name: zabbix-web-nginx-pgsql
environment:
- ZBX_SERVER_HOST=zabbix-server-pgsql
- DB_SERVER_HOST=postgres-server
- POSTGRES_USER=zabbix
- POSTGRES_PASSWORD=zabbix_pwd
- POSTGRES_DB=zabbix
ports:
- "80:8080"
- "443:8443"
volumes:
- /etc/ssl/nginx:/etc/ssl/nginx:ro
depends_on:
- postgres-server
- zabbix-server-pgsql
networks:
- zabbix-net
restart: unless-stopped
networks:
zabbix-net:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
ip_range: 172.20.240.0/20
volumes:
postgres-data:
snmptraps-data:
mibs-data:
zabbix-server-data:
zabbix-server-modules:
zabbix-server-externalscripts:
zabbix-server-alertscripts:
zabbix-web-data:
これを
docker compose up -d
で立ち上げてます。

②SNMP関係の設定(VM2)
以下のサイトをなぞって設定していきます!
1. NET-SNMPをインストール
# インストール
$ sudo dnf install net-snmp net-snmp-utils -y
$ sudo systemctl enable snmpd.service --now
# 確認
$ sudo systemctl status snmpd.service
2. snmpd.confを設定
/etc/snmp/snmpd.conf
(一部抜粋)
####
# First, map the community name "public" into a "security name"
# sec.name source community
com2sec notConfigUser 192.168.100.11 public
com2sec notConfigUser localhost public
####
# Second, map the security name into a group name:
# groupName securityModel securityName
group notConfigGroup v1 notConfigUser
group notConfigGroup v2c notConfigUser
####
# Third, create a view for us to let the group have rights to:
# Make at least snmpwalk -v 1 localhost -c public system fast again.
# name incl/excl subtree mask(optional)
view systemview included .1
####
# Finally, grant the group read-only access to the systemview view.
# group context sec.model sec.level prefix read write notif
access notConfigGroup "" any noauth exact all none none
※お試しなので設定は緩めです
3. snmpwalk
VM2から(localhost)とVM1からで疎通確認。
(VM2) $ snmpwalk -v 2c -c public localhost
(VM1) $ snmpwalk -v 2c -c public 192.168.100.12

③Zabbixの設定(ホスト)
このような設定で追加。
少し待つと、SNMPが緑になる
この状態で一発LinkDownをトラップしてみると
(VM2) $ snmptrap -v 2c -c public 192.168.100.11 '' .1.3.6.1.6.3.1.1.5.3 test i
10
fallbackにしっかり記録される
なお、Zabbix-Sever(コンテナ)のログは
(VM1) $ docker compose exec zabbix-server-pgsql /bin/sh
(コンテナ) $ cd /var/lib/zabbix/snmptraps
(コンテナ) $ ls
snmptraps.log
のように、/var/lib/zabbix/snmptraps/snmptraps.logに記録される

④Zabbixの設定(簡単なトリガー)
簡単なトリガーを設定してみる。
この状態で一発LinkDownをトラップしてみると
うまく拾えた

気になったこと
- 障害の画面表示をリアルタイム更新ってできないのか?
- トリガーの条件式の作り方が難しい

参考