You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查看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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 15:44:34