如何查看ocserv中每个用户的总流量使用情况
如何查看ocserv中每个用户的总流量使用情况
Hey there! Let me walk you through a few reliable ways to track per-user traffic on your ocserv server running Ubuntu—since you're using the ocpasswd user setup, these methods should work perfectly for you.
1. 用ocserv自带的occtl工具实时监控
Ocserv自带了一个名为occtl的控制工具,能帮你查看在线用户的实时流量,稍微调整配置还能让统计更稳定:
- 先打开你的ocserv配置文件(通常是
/etc/ocserv/ocserv.conf),找到stats-report-interval选项,把它设为60(单位是秒),确保流量统计会定期更新。保存文件后重启ocserv:systemctl restart ocserv。 - 在终端运行
occtl show users,就能看到所有当前在线用户,以及他们的实时接收(RX)和发送(TX)流量。不过要注意,这个只能展示活跃会话的流量,要是需要历史累计数据,就得结合日志解析来用了。
2. 解析ocserv日志统计历史流量
Ocserv默认会在用户断开连接时,把该会话的总流量记录到日志里,这正好用来计算用户的累计流量:
- 先确认日志存储位置,查看
ocserv.conf里的log-file配置,如果没设置的话,日志一般会存在/var/log/syslog或/var/log/auth.log里。 - 用下面的命令解析日志,算出每个用户的总流量:
这个命令会提取每条用户断开的日志条目,去掉多余的逗号,然后累加每个用户的接收和发送总流量。grep "disconnected, rx:" /var/log/syslog | awk '{ user=$2; rx=$5; tx=$7; gsub(/,/, "", rx); gsub(/,/, "", tx); total_rx[user]+=rx; total_tx[user]+=tx } END { for(u in total_rx) print u " - 总接收流量: " total_rx[u] " 字节, 总发送流量: " total_tx[u] " 字节" }'
3. 结合iptables做精细化流量统计
如果你想要更细致的统计(比如追踪用户访问特定端口或目标的流量),可以用iptables通过用户的VPN IP来统计流量:
- 先用
occtl show users获取用户和他们VPN IP的对应关系。 - 设置iptables规则来追踪这些IP的流量:
# 创建一个专门用于ocserv流量统计的自定义链 iptables -N OCSERV_USER_TRAFFIC # 把VPN接口的所有流量导向这个自定义链 iptables -A FORWARD -i tun0 -j OCSERV_USER_TRAFFIC iptables -A FORWARD -o tun0 -j OCSERV_USER_TRAFFIC # 为每个用户的IP添加规则(把192.168.1.10换成实际的用户IP) iptables -A OCSERV_USER_TRAFFIC -s 192.168.1.10 -j ACCEPT - 查看统计结果的话,运行
iptables -vnL OCSERV_USER_TRAFFIC,其中pkts和bytes列就是每个IP的总流量,再结合occtl的用户-IP映射就能得到每个用户的流量数据。 - 要是想重置计数器,执行
iptables -Z OCSERV_USER_TRAFFIC即可。
4. 自定义脚本自动化统计
如果需要长期追踪(比如按周或按月统计),你可以把日志解析命令封装成shell脚本,再用定时任务自动运行:
- 创建一个名为
ocserv_traffic_stats.sh的脚本:#!/bin/bash LOG_FILE="/var/log/syslog" OUTPUT_FILE="/var/log/ocserv_user_traffic.log" echo "=== $(date) ===" >> $OUTPUT_FILE grep "disconnected, rx:" $LOG_FILE | awk '{ user=$2; rx=$5; tx=$7; gsub(/,/, "", rx); gsub(/,/, "", tx); total_rx[user]+=rx; total_tx[user]+=tx } END { for(u in total_rx) print u " - 总接收流量: " total_rx[u] " 字节, 总发送流量: " total_tx[u] " 字节" }' >> $OUTPUT_FILE - 给脚本添加执行权限:
chmod +x ocserv_traffic_stats.sh,然后编辑定时任务(运行crontab -e),让它每天凌晨自动运行:0 0 * * * /path/to/ocserv_traffic_stats.sh
这些方法都适配你正在用的ocpasswd用户体系。如果需要历史累计数据,优先试试日志解析;要是看实时情况,用occtl就够啦!
备注:内容来源于stack exchange,提问作者Hamed Zargar
相关产品推荐
相关产品推荐

