feat: Introduce a comprehensive Zabbix Gold Standard template for pfSense hybrid monitoring, including SNMP and detailed OpenVPN user metrics and scripts.
This commit is contained in:
parent
b4a56ed604
commit
be2867ecd6
|
|
@ -84,3 +84,28 @@ TROUBLESHOOTING
|
||||||
- Se zabbix_agentd -t retornar "Permission denied": Verifique se o usuário zabbix está no grupo wheel.
|
- Se zabbix_agentd -t retornar "Permission denied": Verifique se o usuário zabbix está no grupo wheel.
|
||||||
- Se retornar TIMEOUT: Verifique se você está usando o script DE LEITURA (openvpn-discovery.sh) no UserParameter e não o coletor.
|
- Se retornar TIMEOUT: Verifique se você está usando o script DE LEITURA (openvpn-discovery.sh) no UserParameter e não o coletor.
|
||||||
- Se retornar VAZIO { "data": [] }: Execute o coletor manualmente e veja se gera erros. Verifique se existem arquivos em /var/etc/openvpn/server*/sock
|
- Se retornar VAZIO { "data": [] }: Execute o coletor manualmente e veja se gera erros. Verifique se existem arquivos em /var/etc/openvpn/server*/sock
|
||||||
|
|
||||||
|
PASSO 6: INSTALAR O ACCESS TRACKER (REPLAY DE ACESSOS) [OPCIONAL]
|
||||||
|
------------------------------------------------------------------
|
||||||
|
O Access Tracker é um script adicional que correlaciona usuários VPN com a tabela de estados do firewall,
|
||||||
|
permitindo visualizar quais destinos cada usuário acessou (replay de sessão).
|
||||||
|
|
||||||
|
1. Copie o arquivo 'files/openvpn-access-tracker.sh' para '/opt/zabbix/':
|
||||||
|
chmod +x /opt/zabbix/openvpn-access-tracker.sh
|
||||||
|
|
||||||
|
2. Adicione ao cron (executa a cada minuto):
|
||||||
|
echo '* * * * * root /opt/zabbix/openvpn-access-tracker.sh' >> /etc/crontab
|
||||||
|
|
||||||
|
3. O script gerará logs em /var/log/openvpn_user_activity.log
|
||||||
|
Formato: TIMESTAMP|USER|VIRTUAL_IP|DESTINO:PORTA|PROTOCOLO|ESTADO
|
||||||
|
|
||||||
|
Nota: Este script requer que o openvpn-collector.sh esteja rodando (usa o cache de métricas).
|
||||||
|
|
||||||
|
NOVAS MÉTRICAS DISPONÍVEIS (v7)
|
||||||
|
-------------------------------
|
||||||
|
- openvpn.user.time_online[USER]: Tempo online em segundos
|
||||||
|
- openvpn.user.bytes_recv.cached[USER]: Bytes recebidos (cache)
|
||||||
|
- openvpn.user.bytes_sent.cached[USER]: Bytes enviados (cache)
|
||||||
|
- openvpn.access.destinations[USER]: Lista de destinos acessados
|
||||||
|
- openvpn.access.log.tail[N]: Últimas N linhas do log de replay
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -91,3 +91,44 @@ zabbix_agentd -t openvpn.discovery
|
||||||
# Saída esperada (imediata):
|
# Saída esperada (imediata):
|
||||||
# [t|{"data":[{"{#VPN.USER}":"joao.silva"...}]}]
|
# [t|{"data":[{"{#VPN.USER}":"joao.silva"...}]}]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Passo 6: Instalar Access Tracker (Replay de Acessos) [OPCIONAL]
|
||||||
|
|
||||||
|
O **Access Tracker** correlaciona usuários VPN com a tabela de estados do firewall (`pfctl`), gerando um log de atividade para replay.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Copie e dê permissão:
|
||||||
|
chmod +x /opt/zabbix/openvpn-access-tracker.sh
|
||||||
|
|
||||||
|
# Adicione ao cron:
|
||||||
|
echo '* * * * * root /opt/zabbix/openvpn-access-tracker.sh' >> /etc/crontab
|
||||||
|
```
|
||||||
|
|
||||||
|
**Log gerado:** `/var/log/openvpn_user_activity.log`
|
||||||
|
**Formato:** `TIMESTAMP|USER|VIRTUAL_IP|DESTINO:PORTA|PROTOCOLO|ESTADO`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Novas Métricas Disponíveis (v7)
|
||||||
|
|
||||||
|
| Chave | Descrição |
|
||||||
|
|-------|-----------|
|
||||||
|
| `openvpn.user.time_online[USER]` | Tempo online em segundos |
|
||||||
|
| `openvpn.user.bytes_recv.cached[USER]` | Bytes recebidos (via cache) |
|
||||||
|
| `openvpn.user.bytes_sent.cached[USER]` | Bytes enviados (via cache) |
|
||||||
|
| `openvpn.access.destinations[USER]` | Lista de destinos acessados |
|
||||||
|
| `openvpn.access.log.tail[N]` | Últimas N linhas do log de replay |
|
||||||
|
| `openvpn.access.count[USER]` | Contagem de conexões do usuário |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Retenção de Dados no Zabbix
|
||||||
|
|
||||||
|
| Tipo de Dado | Histórico | Tendência |
|
||||||
|
|--------------|-----------|-----------|
|
||||||
|
| Logs de Replay (texto) | 30 dias | N/A |
|
||||||
|
| Métricas (bytes, tempo) | 30 dias | 365 dias |
|
||||||
|
| Eventos/Alertas | 365 dias | N/A |
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,68 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# OpenVPN Access Tracker - Sampled Replay (Arthur's Gold Standard v1)
|
||||||
|
# Correlaciona usuários VPN com a tabela de estados do Packet Filter
|
||||||
|
# Compatível com: pfSense 2.x / FreeBSD
|
||||||
|
#
|
||||||
|
# Instalação:
|
||||||
|
# 1. Copie para /opt/zabbix/openvpn-access-tracker.sh
|
||||||
|
# 2. chmod +x /opt/zabbix/openvpn-access-tracker.sh
|
||||||
|
# 3. Adicione ao cron: */1 * * * * /opt/zabbix/openvpn-access-tracker.sh
|
||||||
|
#
|
||||||
|
# Output: /var/log/openvpn_user_activity.log
|
||||||
|
# Format: TIMESTAMP|USER|REAL_IP|DST_IP:PORT|PROTOCOL
|
||||||
|
|
||||||
|
METRICS_FILE="/tmp/openvpn_metrics.json"
|
||||||
|
LOG_FILE="/var/log/openvpn_user_activity.log"
|
||||||
|
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
|
||||||
|
|
||||||
|
# Verifica se temos dados de VPN
|
||||||
|
if [ ! -f "$METRICS_FILE" ]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Extrai lista de usuários e seus IPs virtuais
|
||||||
|
# Formato esperado: "user": { ... "virtual_ip": "10.0.8.5" ... }
|
||||||
|
user_ips=$(cat "$METRICS_FILE" | sed 's/},{/}\n{/g' | grep -oE '"[^"]+":{"bytes_recv"[^}]+' | \
|
||||||
|
sed 's/"//g' | awk -F: '{user=$1; for(i=2;i<=NF;i++) if($i ~ /virtual_ip/) {getline; print user":"$2}}' 2>/dev/null)
|
||||||
|
|
||||||
|
# Alternativa mais robusta: usar jq se disponível, senão parse manual
|
||||||
|
if command -v jq >/dev/null 2>&1; then
|
||||||
|
# jq disponível - parse limpo
|
||||||
|
user_list=$(jq -r 'to_entries[] | "\(.key):\(.value.virtual_ip)"' "$METRICS_FILE" 2>/dev/null)
|
||||||
|
else
|
||||||
|
# Parse manual simplificado
|
||||||
|
user_list=$(cat "$METRICS_FILE" | tr ',' '\n' | tr '{' '\n' | tr '}' '\n' | \
|
||||||
|
grep -E '^"[a-zA-Z0-9._-]+"|virtual_ip' | paste - - 2>/dev/null | \
|
||||||
|
sed 's/"//g;s/virtual_ip://g' | awk '{print $1":"$2}')
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Se não temos usuários, sai
|
||||||
|
[ -z "$user_list" ] && exit 0
|
||||||
|
|
||||||
|
# Captura tabela de estados
|
||||||
|
state_table=$(pfctl -ss 2>/dev/null)
|
||||||
|
[ -z "$state_table" ] && exit 0
|
||||||
|
|
||||||
|
# Para cada usuário VPN, busca conexões na state table
|
||||||
|
echo "$user_list" | while IFS=: read -r user vip; do
|
||||||
|
[ -z "$user" ] || [ -z "$vip" ] && continue
|
||||||
|
|
||||||
|
# Busca estados onde o IP virtual é a origem
|
||||||
|
# Formato pfctl -ss: all tcp 10.0.8.5:54321 -> 192.168.1.100:443 ESTABLISHED:ESTABLISHED
|
||||||
|
echo "$state_table" | grep " $vip:" | while read -r state_line; do
|
||||||
|
# Extrai protocolo, destino
|
||||||
|
proto=$(echo "$state_line" | awk '{print $2}')
|
||||||
|
dst=$(echo "$state_line" | awk '{print $4}' | sed 's/->//g')
|
||||||
|
state=$(echo "$state_line" | awk '{print $NF}')
|
||||||
|
|
||||||
|
[ -z "$dst" ] && continue
|
||||||
|
|
||||||
|
# Loga a atividade
|
||||||
|
printf "%s|%s|%s|%s|%s|%s\n" "$TIMESTAMP" "$user" "$vip" "$dst" "$proto" "$state" >> "$LOG_FILE"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
# Rotação simples: mantém só últimas 50000 linhas (~5MB)
|
||||||
|
if [ -f "$LOG_FILE" ] && [ $(wc -l < "$LOG_FILE") -gt 50000 ]; then
|
||||||
|
tail -40000 "$LOG_FILE" > "$LOG_FILE.tmp" && mv "$LOG_FILE.tmp" "$LOG_FILE"
|
||||||
|
fi
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# OpenVPN Discovery - COLETOR (Arthur's Gold Standard v6-CACHE)
|
# OpenVPN Discovery - COLETOR (Arthur's Gold Standard v7-METRICS)
|
||||||
# Este script roda via CRON e grava o resultado em cache
|
# Este script roda via CRON e grava o resultado em cache
|
||||||
# Compatível com: pfSense 2.x / FreeBSD
|
# Compatível com: pfSense 2.x / FreeBSD
|
||||||
#
|
#
|
||||||
|
|
@ -7,15 +7,24 @@
|
||||||
# 1. Copie para /opt/zabbix/openvpn-collector.sh
|
# 1. Copie para /opt/zabbix/openvpn-collector.sh
|
||||||
# 2. chmod +x /opt/zabbix/openvpn-collector.sh
|
# 2. chmod +x /opt/zabbix/openvpn-collector.sh
|
||||||
# 3. Adicione ao cron: */1 * * * * /opt/zabbix/openvpn-collector.sh
|
# 3. Adicione ao cron: */1 * * * * /opt/zabbix/openvpn-collector.sh
|
||||||
|
#
|
||||||
|
# v7 Changelog:
|
||||||
|
# - Adicionado métricas expandidas: Bytes Received, Bytes Sent, Connected Since
|
||||||
|
# - Novo cache secundário para métricas: /tmp/openvpn_metrics.json
|
||||||
|
|
||||||
SOCKET_DIR="/var/etc/openvpn"
|
SOCKET_DIR="/var/etc/openvpn"
|
||||||
CACHE_FILE="/tmp/openvpn_discovery.json"
|
CACHE_FILE="/tmp/openvpn_discovery.json"
|
||||||
CACHE_FILE_TMP="/tmp/openvpn_discovery.json.tmp"
|
CACHE_FILE_TMP="/tmp/openvpn_discovery.json.tmp"
|
||||||
|
METRICS_FILE="/tmp/openvpn_metrics.json"
|
||||||
|
METRICS_FILE_TMP="/tmp/openvpn_metrics.json.tmp"
|
||||||
|
|
||||||
# Inicia JSON
|
# Inicia JSON de discovery
|
||||||
printf '{"data":[' > "$CACHE_FILE_TMP"
|
printf '{"data":[' > "$CACHE_FILE_TMP"
|
||||||
|
# Inicia JSON de métricas
|
||||||
|
printf '{' > "$METRICS_FILE_TMP"
|
||||||
|
|
||||||
first=1
|
first_discovery=1
|
||||||
|
first_metrics=1
|
||||||
|
|
||||||
# Loop através de cada socket
|
# Loop através de cada socket
|
||||||
for sockdir in "$SOCKET_DIR"/server*/; do
|
for sockdir in "$SOCKET_DIR"/server*/; do
|
||||||
|
|
@ -27,27 +36,41 @@ for sockdir in "$SOCKET_DIR"/server*/; do
|
||||||
server_name=$(basename "$sockdir")
|
server_name=$(basename "$sockdir")
|
||||||
|
|
||||||
# Consulta o socket e processa linha por linha
|
# Consulta o socket e processa linha por linha
|
||||||
|
# CLIENT_LIST format: type, cn, realaddr, virtaddr, virtaddr6, bytes_received, bytes_sent, connected_since_human, connected_since_unix, username, clientid, peerid, cipher
|
||||||
(echo "status 2"; sleep 0.3; echo "quit") | /usr/bin/nc -U "$sockfile" 2>/dev/null | \
|
(echo "status 2"; sleep 0.3; echo "quit") | /usr/bin/nc -U "$sockfile" 2>/dev/null | \
|
||||||
grep "^CLIENT_LIST," | grep -v "Common Name" | \
|
grep "^CLIENT_LIST," | grep -v "Common Name" | \
|
||||||
while IFS=',' read -r type cn realaddr virtaddr rest; do
|
while IFS=',' read -r type cn realaddr virtaddr virtaddr6 bytes_recv bytes_sent conn_human conn_unix rest; do
|
||||||
[ -z "$cn" ] && continue
|
[ -z "$cn" ] && continue
|
||||||
|
|
||||||
real_ip=$(echo "$realaddr" | cut -d: -f1)
|
real_ip=$(echo "$realaddr" | cut -d: -f1)
|
||||||
virt_ip=$(echo "$virtaddr" | cut -d: -f1)
|
virt_ip=$(echo "$virtaddr" | cut -d: -f1)
|
||||||
|
|
||||||
if [ $first -eq 0 ]; then
|
# --- Discovery JSON ---
|
||||||
printf ','
|
if [ $first_discovery -eq 0 ]; then
|
||||||
|
printf ',' >> "$CACHE_FILE_TMP"
|
||||||
fi
|
fi
|
||||||
|
printf '{"{#VPN.USER}":"%s","{#VPN.SERVER}":"%s","{#VPN.REAL_IP}":"%s","{#VPN.VIRTUAL_IP}":"%s"}' "$cn" "$server_name" "$real_ip" "$virt_ip" >> "$CACHE_FILE_TMP"
|
||||||
|
first_discovery=0
|
||||||
|
|
||||||
printf '{"{#VPN.USER}":"%s","{#VPN.SERVER}":"%s","{#VPN.REAL_IP}":"%s","{#VPN.VIRTUAL_IP}":"%s"}' "$cn" "$server_name" "$real_ip" "$virt_ip"
|
# --- Metrics JSON ---
|
||||||
first=0
|
# Format: "username": { "bytes_recv": N, "bytes_sent": N, "connected_since": N, "real_ip": "x.x.x.x", "virtual_ip": "y.y.y.y" }
|
||||||
done >> "$CACHE_FILE_TMP"
|
if [ $first_metrics -eq 0 ]; then
|
||||||
|
printf ',' >> "$METRICS_FILE_TMP"
|
||||||
|
fi
|
||||||
|
printf '"%s":{"bytes_recv":%s,"bytes_sent":%s,"connected_since":%s,"real_ip":"%s","virtual_ip":"%s","server":"%s"}' \
|
||||||
|
"$cn" "${bytes_recv:-0}" "${bytes_sent:-0}" "${conn_unix:-0}" "$real_ip" "$virt_ip" "$server_name" >> "$METRICS_FILE_TMP"
|
||||||
|
first_metrics=0
|
||||||
|
done
|
||||||
|
|
||||||
first=0
|
first_discovery=0
|
||||||
|
first_metrics=0
|
||||||
done
|
done
|
||||||
|
|
||||||
printf ']}\n' >> "$CACHE_FILE_TMP"
|
printf ']}\n' >> "$CACHE_FILE_TMP"
|
||||||
|
printf '}\n' >> "$METRICS_FILE_TMP"
|
||||||
|
|
||||||
# Move atomicamente para evitar leitura parcial
|
# Move atomicamente para evitar leitura parcial
|
||||||
mv "$CACHE_FILE_TMP" "$CACHE_FILE"
|
mv "$CACHE_FILE_TMP" "$CACHE_FILE"
|
||||||
|
mv "$METRICS_FILE_TMP" "$METRICS_FILE"
|
||||||
chmod 644 "$CACHE_FILE"
|
chmod 644 "$CACHE_FILE"
|
||||||
|
chmod 644 "$METRICS_FILE"
|
||||||
|
|
|
||||||
|
|
@ -40,4 +40,39 @@ UserParameter=openvpn.user.real_address.new[*],for sock in /var/etc/openvpn/serv
|
||||||
|
|
||||||
# Status do usuário (1=conectado, 0=desconectado)
|
# Status do usuário (1=conectado, 0=desconectado)
|
||||||
# Uso: openvpn.user.status[joao.silva]
|
# Uso: openvpn.user.status[joao.silva]
|
||||||
UserParameter=openvpn.user.status[*],for sock in /var/etc/openvpn/server*/sock; do [ -S "$sock" ] && (echo "status 2"; sleep 0.2; echo "quit") | /usr/bin/nc -U "$sock" 2>/dev/null | grep -q "^CLIENT_LIST,$1," && echo 1 && exit; done; echo 0
|
UserParameter=openvpn.user.status[*],for sock in /var/etc/openvpn/server*/sock; do [ -S "$sock" ] && (echo "status 2"; sleep 0.2; echo "quit") | /usr/bin/nc -U "$sock" 2>/dev/null | grep -q "^CLIENT_LIST,$1," && echo 1 && exit; done; echo 0
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# MÉTRICAS AVANÇADAS v6 (Arthur's Gold Standard)
|
||||||
|
# Requer: openvpn-collector.sh rodando via cron (gera /tmp/openvpn_metrics.json)
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
# Tempo online em segundos (calculado a partir do connected_since)
|
||||||
|
# Uso: openvpn.user.time_online[joao.silva]
|
||||||
|
UserParameter=openvpn.user.time_online[*],conn=$(cat /tmp/openvpn_metrics.json 2>/dev/null | grep -oE '"$1":\{[^}]+' | grep -oE 'connected_since":[0-9]+' | cut -d: -f2); [ -n "$conn" ] && [ "$conn" -gt 0 ] && echo $(( $(date +%s) - $conn )) || echo 0
|
||||||
|
|
||||||
|
# Métricas via cache JSON (mais rápido que consultar socket)
|
||||||
|
# Bytes recebidos (via cache)
|
||||||
|
UserParameter=openvpn.user.bytes_recv.cached[*],cat /tmp/openvpn_metrics.json 2>/dev/null | grep -oE '"$1":\{[^}]+' | grep -oE 'bytes_recv":[0-9]+' | cut -d: -f2 || echo 0
|
||||||
|
|
||||||
|
# Bytes enviados (via cache)
|
||||||
|
UserParameter=openvpn.user.bytes_sent.cached[*],cat /tmp/openvpn_metrics.json 2>/dev/null | grep -oE '"$1":\{[^}]+' | grep -oE 'bytes_sent":[0-9]+' | cut -d: -f2 || echo 0
|
||||||
|
|
||||||
|
# IP Virtual do usuário (via cache)
|
||||||
|
UserParameter=openvpn.user.virtual_ip.cached[*],cat /tmp/openvpn_metrics.json 2>/dev/null | grep -oE '"$1":\{[^}]+virtual_ip":"[^"]+' | grep -oE 'virtual_ip":"[^"]+' | cut -d'"' -f3 || echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# LOG DE ACESSO (REPLAY) - Requer: openvpn-access-tracker.sh via cron
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
# Últimas N linhas do log de atividade (para widget de replay)
|
||||||
|
# Uso: openvpn.access.log.tail[100] -> últimas 100 linhas
|
||||||
|
UserParameter=openvpn.access.log.tail[*],tail -$1 /var/log/openvpn_user_activity.log 2>/dev/null || echo ""
|
||||||
|
|
||||||
|
# Contagem de conexões de um usuário específico (últimas 24h)
|
||||||
|
# Uso: openvpn.access.count[joao.silva]
|
||||||
|
UserParameter=openvpn.access.count[*],grep -c "|$1|" /var/log/openvpn_user_activity.log 2>/dev/null || echo 0
|
||||||
|
|
||||||
|
# Destinos únicos acessados por um usuário (lista)
|
||||||
|
# Uso: openvpn.access.destinations[joao.silva]
|
||||||
|
UserParameter=openvpn.access.destinations[*],grep "|$1|" /var/log/openvpn_user_activity.log 2>/dev/null | cut -d'|' -f4 | sort -u | head -50 | tr '\n' ',' | sed 's/,$//' || echo ""
|
||||||
|
|
@ -2755,6 +2755,123 @@ zabbix_export:
|
||||||
newvalue: Disponível
|
newvalue: Disponível
|
||||||
- value: '2'
|
- value: '2'
|
||||||
newvalue: Desconhecido
|
newvalue: Desconhecido
|
||||||
|
- uuid: 830106fa5d2a45f9897c9154431eef08
|
||||||
|
name: VPN User Status
|
||||||
|
mappings:
|
||||||
|
- value: '0'
|
||||||
|
newvalue: Desconectado
|
||||||
|
- value: '1'
|
||||||
|
newvalue: Conectado
|
||||||
|
discovery_rules_vpn:
|
||||||
|
- uuid: 34ed656ffcf845b0b5598870de258002
|
||||||
|
name: Descoberta de Usuários OpenVPN
|
||||||
|
type: ZABBIX_ACTIVE
|
||||||
|
key: openvpn.discovery
|
||||||
|
delay: 5m
|
||||||
|
description: |
|
||||||
|
Descobre usuários conectados ao OpenVPN através do script openvpn-discovery.sh.
|
||||||
|
Requisito: Zabbix Agent ativo com UserParameter configurado.
|
||||||
|
item_prototypes:
|
||||||
|
- uuid: a8a060a8e0494d3d99a71cd4f2b6a7c8
|
||||||
|
name: 'OpenVPN [{#VPN.USER}]: Download Total (Bytes)'
|
||||||
|
type: ZABBIX_ACTIVE
|
||||||
|
key: 'openvpn.user.bytes_recv.cached[{#VPN.USER}]'
|
||||||
|
delay: 1m
|
||||||
|
history: 30d
|
||||||
|
trends: 365d
|
||||||
|
units: B
|
||||||
|
description: Total de bytes recebidos (download) pelo usuário VPN.
|
||||||
|
tags:
|
||||||
|
- tag: component
|
||||||
|
value: vpn
|
||||||
|
- tag: vpn_user
|
||||||
|
value: '{#VPN.USER}'
|
||||||
|
- uuid: 36362e120e9445a1bbdc750afc0f6a1f
|
||||||
|
name: 'OpenVPN [{#VPN.USER}]: Upload Total (Bytes)'
|
||||||
|
type: ZABBIX_ACTIVE
|
||||||
|
key: 'openvpn.user.bytes_sent.cached[{#VPN.USER}]'
|
||||||
|
delay: 1m
|
||||||
|
history: 30d
|
||||||
|
trends: 365d
|
||||||
|
units: B
|
||||||
|
description: Total de bytes enviados (upload) pelo usuário VPN.
|
||||||
|
tags:
|
||||||
|
- tag: component
|
||||||
|
value: vpn
|
||||||
|
- tag: vpn_user
|
||||||
|
value: '{#VPN.USER}'
|
||||||
|
- uuid: 7eee5d914f0346c8a2b1c3d4e5f6a7b8
|
||||||
|
name: 'OpenVPN [{#VPN.USER}]: Tempo Online (Segundos)'
|
||||||
|
type: ZABBIX_ACTIVE
|
||||||
|
key: 'openvpn.user.time_online[{#VPN.USER}]'
|
||||||
|
delay: 1m
|
||||||
|
history: 30d
|
||||||
|
trends: 365d
|
||||||
|
units: s
|
||||||
|
description: Tempo de conexão do usuário VPN em segundos.
|
||||||
|
tags:
|
||||||
|
- tag: component
|
||||||
|
value: vpn
|
||||||
|
- tag: vpn_user
|
||||||
|
value: '{#VPN.USER}'
|
||||||
|
- uuid: c3a4b5c6d7e84f0991a2b3c4d5e6f7a8
|
||||||
|
name: 'OpenVPN [{#VPN.USER}]: Status'
|
||||||
|
type: ZABBIX_ACTIVE
|
||||||
|
key: 'openvpn.user.status[{#VPN.USER}]'
|
||||||
|
delay: 1m
|
||||||
|
history: 30d
|
||||||
|
trends: '0'
|
||||||
|
valuemap:
|
||||||
|
name: VPN User Status
|
||||||
|
description: Status de conexão do usuário VPN (1=conectado, 0=desconectado).
|
||||||
|
tags:
|
||||||
|
- tag: component
|
||||||
|
value: vpn
|
||||||
|
- tag: vpn_user
|
||||||
|
value: '{#VPN.USER}'
|
||||||
|
- uuid: 1f2a3b4c5d6e4f8a9b0c1d2e3f4a5b6c
|
||||||
|
name: 'OpenVPN [{#VPN.USER}]: IP Real'
|
||||||
|
type: ZABBIX_ACTIVE
|
||||||
|
key: 'openvpn.user.real_address.new[{#VPN.USER}]'
|
||||||
|
delay: 1m
|
||||||
|
history: 30d
|
||||||
|
trends: '0'
|
||||||
|
value_type: TEXT
|
||||||
|
description: Endereço IP real (público) do usuário VPN.
|
||||||
|
tags:
|
||||||
|
- tag: component
|
||||||
|
value: vpn
|
||||||
|
- tag: vpn_user
|
||||||
|
value: '{#VPN.USER}'
|
||||||
|
- uuid: 9e8d7c6b5a4941f2bccd1e2f3a4b5c6d
|
||||||
|
name: 'OpenVPN [{#VPN.USER}]: Destinos Acessados'
|
||||||
|
type: ZABBIX_ACTIVE
|
||||||
|
key: 'openvpn.access.destinations[{#VPN.USER}]'
|
||||||
|
delay: 5m
|
||||||
|
history: 30d
|
||||||
|
trends: '0'
|
||||||
|
value_type: TEXT
|
||||||
|
description: Lista de destinos únicos acessados pelo usuário VPN (para replay).
|
||||||
|
tags:
|
||||||
|
- tag: component
|
||||||
|
value: vpn
|
||||||
|
- tag: component
|
||||||
|
value: audit
|
||||||
|
- tag: vpn_user
|
||||||
|
value: '{#VPN.USER}'
|
||||||
|
graph_prototypes:
|
||||||
|
- uuid: 2b3c4d5e6f7a4892abcd1e2f3a4b5c6d
|
||||||
|
name: 'OpenVPN [{#VPN.USER}]: Tráfego'
|
||||||
|
graph_items:
|
||||||
|
- color: 199C0D
|
||||||
|
item:
|
||||||
|
host: 'PFSense by SNMP'
|
||||||
|
key: 'openvpn.user.bytes_recv.cached[{#VPN.USER}]'
|
||||||
|
- sortorder: '1'
|
||||||
|
color: F63100
|
||||||
|
item:
|
||||||
|
host: 'PFSense by SNMP'
|
||||||
|
key: 'openvpn.user.bytes_sent.cached[{#VPN.USER}]'
|
||||||
graphs:
|
graphs:
|
||||||
- uuid: 18b72f3eafe54206a574f431e7bb563a
|
- uuid: 18b72f3eafe54206a574f431e7bb563a
|
||||||
name: 'PFSense: Códigos de Motivo (Packet Filter)'
|
name: 'PFSense: Códigos de Motivo (Packet Filter)'
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,18 @@
|
||||||
# Documentação: PFSense Hybrid: SNMP + OpenVPN Agent
|
# Documentação: PFSense by SNMP
|
||||||
|
|
||||||
**Template:** PFSense Hybrid: SNMP + OpenVPN Agent
|
**Template:** PFSense by SNMP
|
||||||
**Descrição:**
|
**Descrição:**
|
||||||
Template Híbrido para monitoramento do pfSense.
|
Template para monitoramento do pfSense via SNMP
|
||||||
|
Configuração:
|
||||||
SNMP: Monitoramento de interfaces, firewall, serviços (DHCP, DNS, Nginx).
|
1. Habilite o daemon SNMP em Services na interface web do pfSense: https://docs.netgate.com/pfsense/en/latest/services/snmp.html
|
||||||
Agent: Monitoramento avançado de OpenVPN (usuários, túneis S2S, tráfego).
|
2. Configure a regra de firewall para permitir acesso do Zabbix Proxy/Server via SNMP: https://docs.netgate.com/pfsense/en/latest/firewall/index.html#managing-firewall-rules
|
||||||
|
|
||||||
Requisitos:
|
|
||||||
1. Habilite o daemon SNMP em Services na interface web do pfSense.
|
|
||||||
2. Instale o Zabbix Agent e configure os UserParameters OpenVPN (ver INSTRUCOES_AGENTE.txt).
|
|
||||||
3. Associe o template ao host.
|
3. Associe o template ao host.
|
||||||
|
|
||||||
MIBs: BEGEMOT-PF-MIB, HOST-RESOURCES-MIB
|
MIBs usadas:
|
||||||
Keys Agent: openvpn.*
|
BEGEMOT-PF-MIB
|
||||||
|
HOST-RESOURCES-MIB
|
||||||
|
|
||||||
Gerado pelo Padrão Gold (Arthur) - ITGuys
|
Gerado originalmente pela ferramenta oficial "Templator", Otimizado para Padrão Gold (Arthur)
|
||||||
|
|
||||||
## Itens Monitorados
|
## Itens Monitorados
|
||||||
|
|
||||||
|
|
@ -45,6 +42,36 @@ Gerado pelo Padrão Gold (Arthur) - ITGuys
|
||||||
|
|
||||||
### Regras de Descoberta (LLD)
|
### Regras de Descoberta (LLD)
|
||||||
|
|
||||||
|
#### Descoberta de interfaces de rede (`pfsense.net.if.discovery`)
|
||||||
|
- **Protótipos de Itens:**
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Tráfego IPv4 de entrada bloqueado (`net.if.in.block.v4.bps[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Pacotes IPv4 de entrada bloqueados (`net.if.in.block.v4.pps[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Tráfego IPv6 de entrada bloqueado (`net.if.in.block.v6.bps[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Pacotes IPv6 de entrada bloqueados (`net.if.in.block.v6.pps[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Pacotes de entrada descartados (`net.if.in.discards[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Pacotes de entrada com erros (`net.if.in.errors[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Tráfego IPv4 de entrada permitido (`net.if.in.pass.v4.bps[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Pacotes IPv4 de entrada permitidos (`net.if.in.pass.v4.pps[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Tráfego IPv6 de entrada permitido (`net.if.in.pass.v6.bps[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Pacotes IPv6 de entrada permitidos (`net.if.in.pass.v6.pps[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Bits recebidos (`net.if.in[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Tráfego IPv4 de saída bloqueado (`net.if.out.block.v4.bps[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Pacotes IPv4 de saída bloqueados (`net.if.out.block.v4.pps[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Tráfego IPv6 de saída bloqueado (`net.if.out.block.v6.bps[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Pacotes de saída descartados (`net.if.out.discards[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Pacotes de saída com erros (`net.if.out.errors[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Tráfego IPv4 de saída permitido (`net.if.out.pass.v4.bps[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Pacotes IPv4 de saída permitidos (`net.if.out.pass.v4.pps[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Tráfego IPv6 de saída permitido (`net.if.out.pass.v6.bps[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Pacotes IPv6 de saída permitidos (`net.if.out.pass.v6.pps[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Bits enviados (`net.if.out[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Contagem de referências de regras (`net.if.rules.refs[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Velocidade (`net.if.speed[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Status operacional (`net.if.status[{#SNMPINDEX}]`)
|
||||||
|
- Interface [{#IFNAME}({#IFALIAS})]: Tipo de interface (`net.if.type[{#SNMPINDEX}]`)
|
||||||
|
#### Descoberta de Processos DHCP (`pfsense.dhcp.discovery`)
|
||||||
|
- **Protótipos de Itens:**
|
||||||
|
- Processo DHCP [{#HR_SW_PARAMS}]: Status (`pfsense.dhcp.process.status[{#HR_SW_PARAMS}]`)
|
||||||
#### Descoberta de Usuários OpenVPN (`openvpn.discovery`)
|
#### Descoberta de Usuários OpenVPN (`openvpn.discovery`)
|
||||||
- **Protótipos de Itens:**
|
- **Protótipos de Itens:**
|
||||||
- OpenVPN [{#VPN.USER}]: Download Total (Bytes) (`openvpn.user.bytes_received.total[{#VPN.USER}]`)
|
- OpenVPN [{#VPN.USER}]: Download Total (Bytes) (`openvpn.user.bytes_received.total[{#VPN.USER}]`)
|
||||||
|
|
@ -70,4 +97,13 @@ Gerado pelo Padrão Gold (Arthur) - ITGuys
|
||||||
|
|
||||||
### Protótipos de Triggers (LLD)
|
### Protótipos de Triggers (LLD)
|
||||||
|
|
||||||
|
**Regra: Descoberta de interfaces de rede**
|
||||||
|
- [WARNING] **🐢 Congestionamento: Descartes na interface {#IFNAME}**
|
||||||
|
- [WARNING] **⚠️ PFSense: Interface [{#IFNAME}({#IFALIAS})]: Alta taxa de erros de entrada**
|
||||||
|
- [WARNING] **⚠️ PFSense: Interface [{#IFNAME}({#IFALIAS})]: Alta taxa de erros de saída**
|
||||||
|
- [AVERAGE] **🔌 PFSense: Interface [{#IFNAME}({#IFALIAS})]: Link indisponível**
|
||||||
|
|
||||||
|
**Regra: Descoberta de Processos DHCP**
|
||||||
|
- [HIGH] **🚨 DHCP Parado: Instância {#HR_SW_PARAMS} não está rodando**
|
||||||
|
|
||||||
**Regra: Descoberta de Usuários OpenVPN**
|
**Regra: Descoberta de Usuários OpenVPN**
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue