Ten dokument opisuje krok po kroku wdrożenie SNMP w labie na MikroTikach (MT1/MT3) oraz integrację z snmp_exporter i Prometheusem działającymi na Raspberry Pi 5 (RPi5).
Celem jest:
snmp_exporter,10.10.20.0/2410.10.20.1 (MT1)10.10.20.1010.10.20.1/2410.10.20.x/24 (dowolny adres z tej sieci, ustalony na MT3)snmp_exporter (9116/tcp),Poniższe kroki wykonujemy na każdym MikroTiku, który chcemy monitorować (MT1, później MT3).
CLI (RouterOS):
/snmp set enabled=yes
Opcjonalnie możesz ustawić podstawowe informacje (nie wymagane do działania, ale przydatne w monitoringu):
Copy
/snmp set contact="admin@lab" location="HOMELAB-RACK"
Na potrzeby monitoringu używamy SNMPv2c z community public.
Możliwe są dwa warianty bezpieczeństwa:
Wariant A – szybki (pełny dostęp z labu)
Community public dostępne z całej podsieci VLAN20 (10.10.20.0/24):
/snmp community
add name=public addresses=10.10.20.0/24 security=none
Wariant B – bardziej restrykcyjny (tylko RPi5)
Community public-lab dostępne wyłącznie z adresu RPi5 (10.10.20.10):
/snmp community
add name=public-lab addresses=10.10.20.10/32 security=none
W konfiguracji Prometheusa i
snmp_exporterprzyjęliśmy użyciepublic.
Jeśli chcesz, możesz później przejść napublic-lab– wymaga to tylko zmiany community wauthwsnmp.yml.
Jeżeli masz domyślnie restrykcyjne reguły firewall, dodaj regułę akceptującą SNMP z VLAN20:
/ip firewall filter
add chain=input action=accept protocol=udp dst-port=161 \
src-address=10.10.20.0/24 comment="Allow SNMP from LAB-SRV (VLAN20)"
Na MT3 – analogicznie, jeśli ma firewall na input.
Na RPi5 zainstaluj klienta SNMP:
sudo apt update
sudo apt install -y snmp
Przetestuj SNMP do MT1:
snmpwalk -v2c -c public 10.10.20.1
Jeśli widzisz odpowiedzi (iso.3.6.1.2.1...), SNMP działa.
Analogicznie dla MT3 (po włączeniu SNMP):
snmpwalk -v2c -c public <IP_MT3_VLAN20>
snmp_exporter na RPi5Na RPi5 (użytkownik marcin):
~/monitoring
├── docker-compose.yml
└── snmp_exporter
└── snmp.yml
Używamy obrazu prom/snmp-exporter:latest (v0.29.0, format „auth-split”).
cd ~/monitoring
# Kontener tymczasowy
docker run --name snmp_exporter_debug -d prom/snmp-exporter:latest
# Skopiowanie domyślnego pliku konfiguracyjnego
docker cp snmp_exporter_debug:/etc/snmp_exporter/snmp.yml snmp_exporter/snmp.yml
# Usunięcie kontenera tymczasowego
docker rm -f snmp_exporter_debug
Plik snmp_exporter/snmp.yml zawiera m.in.:
auths: – różne definicje uwierzytelnienia, w tym public_v2:auths:
public_v2:
community: public
version: 2
# ...
modules: – w tym moduł if_mib (standardowy MIB interfejsów):modules:
if_mib:
walk:
- 1.3.6.1.2.1.2 # interfaces
- 1.3.6.1.2.1.31.1.1 # ifXTable
# ...
Nie trzeba zmieniać struktury – wystarczy użyć istniejącego modułu if_mib i auth public_v2.
Fragment docker-compose.yml:
services:
snmp_exporter:
image: prom/snmp-exporter:latest
container_name: snmp_exporter
restart: unless-stopped
volumes:
- ./snmp_exporter/snmp.yml:/etc/snmp_exporter/snmp.yml:ro
command:
- "--config.file=/etc/snmp_exporter/snmp.yml"
ports:
- "9116:9116"
networks:
- mon_net
``
Start usługi:
```bash
cd ~/monitoring
docker compose up -d snmp_exporter
docker compose logs snmp_exporter | tail
Sprawdzenie, czy exporter działa:
curl "http://localhost:9116/metrics" | head
Test SNMP przez exporter do MT1:
curl "http://localhost:9116/snmp?target=10.10.20.1&module=if_mib&auth=public_v2" | head
Oczekiwany wynik (przykład):
# HELP ifAdminStatus The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
# TYPE ifAdminStatus gauge
ifAdminStatus{ifDescr="bridge-lab",ifName="bridge-lab",...} 1
ifAdminStatus{ifDescr="ether1",ifName="ether1",...} 1
...
~/monitoring
├── docker-compose.yml
└── prometheus
└── prometheus.yml
W docker-compose.yml usługa Prometheus:
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus_data:/prometheus
command:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus"
- "--storage.tsdb.retention.time=15d"
- "--web.enable-lifecycle"
ports:
- "9090:9090"
networks:
- mon_net
Przykładowa minimalna konfiguracja:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
# Self-scrape Prometheusa
- job_name: "prometheus"
static_configs:
- targets: ["prometheus:9090"]
# SNMP – MikroTiki
- job_name: "snmp_mikrotik"
metrics_path: /snmp
params:
module: [if_mib]
auth: [public_v2]
static_configs:
- targets:
- "10.10.20.1" # MT1
# - "<IP_MT3_VLAN20>" # MT3 – po włączeniu SNMP
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: "snmp_exporter:9116"
Restart Prometheusa:
cd ~/monitoring
docker compose restart prometheus
Sprawdzenie statusu targetów:
http://10.10.20.10:9090/targets
Oczekiwany stan:
job snmp_mikrotik → UP
target 10.10.20.1 (oraz IP MT3, jeśli dodany) → UP
Kilka przydatnych zapytań opartych o if_mib:
Sumaryczny ruch IN (bps) per router:
sum by (instance) (rate(ifHCInOctets{job="snmp_mikrotik"}[$__rate_interval])) * 8
Sumaryczny ruch OUT (bps) per router:
sum by (instance) (rate(ifHCOutOctets{job="snmp_mikrotik"}[$__rate_interval])) * 8
Ruch na konkretnym porcie (np. ether2 na MT1):
rate(ifHCInOctets{job="snmp_mikrotik", instance="10.10.20.1", ifName="ether2"}[5m]) * 8
Top 10 interfejsów wg ruchu IN:
topk(10, rate(ifHCInOctets{job="snmp_mikrotik"}[5m]) * 8)
¶ Uwaga o ostrzeżeniu PromQL:
Prometheus może pokazywać:
metric might not be a counter, name does not end in _total/_sum/_count/_bucket: "ifHCInOctets"
Metryki SNMPifHCInOctets / ifHCOutOctetssą licznikami rosnącymi, ale ich nazwy nie trzymają się konwencji Prometheusa (_total).
Użycierate(ifHCInOctets[5m])/rate(ifHCOutOctets[5m])jest poprawne – to tylko informacja, którą można zignorować.
/snmp set enabled=yespublic (lub public-lab z adresem 10.10.20.10/32).10.10.20.0/24 (jeśli firewall jest restrykcyjny).snmpwalk -v2c -c public 10.10.20.1 działa.snmp_exporter uruchomiony (docker compose up -d snmp_exporter).curl "http://localhost:9116/snmp?target=10.10.20.1&module=if_mib&auth=public_v2" zwraca metryki.snmp_mikrotik.http://10.10.20.10:9090/targets target 10.10.20.1 jest UP.