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)

以下のサイトをなぞって設定していきます!
https://changineer.info/server/monitoring/monitoring_snmpd.html#toc8

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をトラップしてみると

うまく拾えた

しま🏝️しま🏝️

気になったこと

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