# OpenVPN UserParameters for Zabbix Agent (Arthur's Gold Standard v5-FINAL) # Compatível com: Zabbix 7.0+ / pfSense 2.x / FreeBSD # Instalação: Copiar para /usr/local/etc/zabbix7/zabbix_agentd.conf.d/ # # IMPORTANTE: Usa Management Interface via sockets Unix # Testado em pfSense 2.8.0-RELEASE # Discovery de usuários conectados (via sockets) UserParameter=openvpn.discovery,/opt/zabbix/openvpn-discovery.sh # Versão do OpenVPN UserParameter=openvpn.version,openvpn --version 2>&1 | head -1 | awk '{print $2}' # Contagem total de usuários conectados (todos os servidores) UserParameter=openvpn.user.count.total,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; done | grep -c "^CLIENT_LIST," 2>/dev/null || echo 0 # Contagem de usuários por servidor # Uso: openvpn.user.count[server14] UserParameter=openvpn.user.count[*],[ -S "/var/etc/openvpn/$1/sock" ] && (echo "status 2"; sleep 0.2; echo "quit") | /usr/bin/nc -U "/var/etc/openvpn/$1/sock" 2>/dev/null | grep -c "^CLIENT_LIST," || echo 0 # Status do servidor OpenVPN (1=online, 0=offline) # Uso: openvpn.server.status[server14] UserParameter=openvpn.server.status[*],[ -S "/var/etc/openvpn/$1/sock" ] && (echo "status 2"; sleep 0.2; echo "quit") | /usr/bin/nc -U "/var/etc/openvpn/$1/sock" 2>/dev/null | grep -q "^TITLE" && echo 1 || echo 0 # Bytes recebidos pelo usuário (busca em todos os servidores) # Uso: openvpn.user.bytes_received[joao.silva] UserParameter=openvpn.user.bytes_received.total[*],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 "^CLIENT_LIST,$1,"; done | head -1 | cut -d, -f6 # Bytes enviados pelo usuário # Uso: openvpn.user.bytes_sent[joao.silva] UserParameter=openvpn.user.bytes_sent.total[*],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 "^CLIENT_LIST,$1,"; done | head -1 | cut -d, -f7 # Timestamp de conexão do usuário (epoch) # Uso: openvpn.user.connected_since[joao.silva] UserParameter=openvpn.user.connected_since[*],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 "^CLIENT_LIST,$1,"; done | head -1 | cut -d, -f9 # IP real do usuário # Uso: openvpn.user.real_address.new[joao.silva] UserParameter=openvpn.user.real_address.new[*],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 "^CLIENT_LIST,$1,"; done | head -1 | cut -d, -f3 | cut -d: -f1 # Status do usuário (1=conectado, 0=desconectado) # 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 # ============================================================================ # 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 ""