VPN 日志记录和监控对于安全审计、故障排除和合规性至关重要。以下是完整的日志管理和监控方案:
日志类型
1. 连接日志
记录内容:
- 用户身份(用户名、证书 DN)
- 连接时间(开始/结束时间戳)
- 源 IP 地址和端口
- 目标服务器 IP
- 协议和加密算法
- 连接持续时间
- 数据传输量(上传/下载)
示例格式:
shell2024-01-15 10:30:45 [INFO] User john.doe connected from 192.168.1.100:54321 2024-01-15 10:30:46 [INFO] Assigned IP 10.8.0.2 to john.doe 2024-01-15 10:35:22 [INFO] User john.doe disconnected, duration: 4m 37s, tx: 5.2MB, rx: 12.8MB
2. 认证日志
记录内容:
- 认证尝试(成功/失败)
- 认证方法(密码、证书、MFA)
- 失败原因
- 异常登录尝试
示例格式:
shell2024-01-15 10:30:45 [AUTH] SUCCESS: john.doe authenticated via certificate 2024-01-15 10:31:00 [AUTH] FAILED: invalid credentials from 192.168.1.200 2024-01-15 10:31:05 [AUTH] WARNING: Multiple failed attempts from 192.168.1.200
3. 错误日志
记录内容:
- 连接失败
- 超时错误
- 配置错误
- 系统错误
示例格式:
shell2024-01-15 10:32:00 [ERROR] Connection timeout for user alice.smith 2024-01-15 10:33:15 [ERROR] TLS handshake failed: certificate expired 2024-01-15 10:34:00 [ERROR] Unable to assign IP address: pool exhausted
4. 性能日志
记录内容:
- 带宽使用情况
- 并发连接数
- CPU 和内存使用率
- 延迟和丢包率
示例格式:
shell2024-01-15 10:35:00 [PERF] Bandwidth: 125Mbps up, 450Mbps down 2024-01-15 10:35:00 [PERF] Active connections: 45, Peak: 52 2024-01-15 10:35:00 [PERF] CPU: 45%, Memory: 2.1GB/4GB
日志配置
OpenVPN 日志配置
服务器配置:
conf# 日志级别 verb 3 mute 10 # 日志文件 log /var/log/openvpn.log log-append /var/log/openvpn.log # 状态文件 status /var/log/openvpn-status.log 10 # 客户端连接脚本 script-security 2 client-connect /etc/openvpn/connect-script.sh client-disconnect /etc/openvpn/disconnect-script.sh
连接脚本示例(connect-script.sh):
bash#!/bin/bash LOG_FILE="/var/log/vpn-connections.log" TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') echo "$TIMESTAMP CONNECT $common_name $trusted_ip $ifconfig_pool_remote_ip" >> $LOG_FILE
WireGuard 日志配置
系统日志配置:
bash# 启用 WireGuard 日志 echo "module wireguard +p" | sudo tee /sys/kernel/debug/dynamic_debug/control # 查看日志 sudo journalctl -u wg-quick@wg0 -f
自定义日志脚本:
bash#!/bin/bash # /etc/wireguard/log-connections.sh LOG_FILE="/var/log/wireguard-connections.log" while read line; do if [[ $line == *"AllowedIPs"* ]]; then echo "$(date '+%Y-%m-%d %H:%M:%S') $line" >> $LOG_FILE fi done < <(sudo wg show)
日志管理
1. 日志轮转
Logrotate 配置(/etc/logrotate.d/openvpn):
shell/var/log/openvpn*.log { daily rotate 30 compress delaycompress missingok notifempty create 640 root adm sharedscripts postrotate systemctl reload openvpn > /dev/null 2>&1 || true endscript }
2. 日志归档
归档脚本:
bash#!/bin/bash # /usr/local/bin/archive-vpn-logs.sh ARCHIVE_DIR="/backup/vpn-logs" DATE=$(date +%Y%m) mkdir -p $ARCHIVE_DIR # 压缩上个月的日志 find /var/log -name "openvpn-*.log.*" -mtime +30 -exec gzip {} \; mv /var/log/openvpn-*.log.gz $ARCHIVE_DIR/ 2>/dev/null
3. 日志保留策略
推荐保留期:
- 实时日志:7 天
- 压缩日志:90 天
- 归档日志:1-3 年(根据合规要求)
- 审计日志:永久保留(关键事件)
监控方案
1. 实时监控
使用 journalctl:
bash# 实时查看 OpenVPN 日志 sudo journalctl -u openvpn -f # 查看错误日志 sudo journalctl -u openvpn -p err # 查看今天的日志 sudo journalctl -u openvpn --since today
2. 性能监控
自定义监控脚本:
bash#!/bin/bash # /usr/local/bin/monitor-vpn.sh LOG_FILE="/var/log/vpn-performance.log" while true; do TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') # 获取连接数 CONNECTIONS=$(netstat -an | grep :1194 | grep ESTABLISHED | wc -l) # 获取带宽 BANDWIDTH=$(iftop -t -s 1 -n -i eth0 2>/dev/null | tail -n 3) # 获取 CPU 和内存 CPU=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}') MEMORY=$(free -m | awk '/Mem:/ {print $3}') echo "$TIMESTAMP Connections: $CONNECTIONS, CPU: $CPU%, Memory: ${MEMORY}MB" >> $LOG_FILE sleep 60 done
3. 告警系统
使用 Nagios 监控:
bash#!/bin/bash # /usr/local/nagios/libexec/check_vpn.sh WARNING=40 CRITICAL=50 CONNECTIONS=$(netstat -an | grep :1194 | grep ESTABLISHED | wc -l) if [ $CONNECTIONS -ge $CRITICAL ]; then echo "CRITICAL: $CONNECTIONS active VPN connections" exit 2 elif [ $CONNECTIONS -ge $WARNING ]; then echo "WARNING: $CONNECTIONS active VPN connections" exit 1 else echo "OK: $CONNECTIONS active VPN connections" exit 0 fi
4. 集中式日志管理
使用 ELK Stack:
yaml# Filebeat 配置 filebeat.inputs: - type: log enabled: true paths: - /var/log/openvpn.log fields: service: vpn environment: production output.elasticsearch: hosts: ["elasticsearch:9200"] index: "vpn-logs-%{+yyyy.MM.dd}"
安全和合规
1. 日志保护
访问控制:
bash# 设置日志文件权限 chmod 640 /var/log/openvpn.log chown root:adm /var/log/openvpn.log # 加密敏感日志 gpg --encrypt --recipient admin@company.com /var/log/vpn-connections.log
2. 审计追踪
关键事件记录:
- 用户登录/登出
- 权限变更
- 配置修改
- 异常访问模式
3. 合规性要求
GDPR:
- 最小化日志数据
- 限制保留期限
- 提供数据删除机制
HIPAA:
- 完整的访问日志
- 审计追踪
- 安全存储
分析和报告
1. 使用 awk 分析日志
bash# 统计每日连接数 awk '/CONNECT/ {print $1}' /var/log/vpn-connections.log | sort | uniq -c # 查找最活跃用户 awk '/CONNECT/ {print $4}' /var/log/vpn-connections.log | sort | uniq -c | sort -nr # 查找异常连接 awk '/CONNECT/ && $6 !~ /^10\.8\.0\./' /var/log/vpn-connections.log
2. 使用 GoAccess 可视化
bash# 安装 GoAccess sudo apt install goaccess # 生成实时报告 goaccess /var/log/openvpn.log -o /var/www/html/vpn-stats.html --log-format='%t %h %^[%^] %^ %^ %^ %s %b' --real-time-html
最佳实践
- 日志级别:使用适当的日志级别(生产环境使用 INFO 或 WARN)
- 定期审查:定期审查日志以发现异常模式
- 自动化:自动化日志收集、分析和告警
- 备份:定期备份日志文件
- 测试:测试日志恢复和分析流程
- 文档化:记录日志格式和分析方法
- 隐私保护:遵守隐私法规,最小化个人数据