银河麒麟操作系统支持五种命令行网络流量监控工具:ifstat实时刷新吞吐量,nload提供ASCII动态图,iftop定位IP端口级连接,vnstat记录长期历史数据,cat /proc/net/dev获取原始累计字节数。

Linux 本身不提供“计费”功能,也没有内置的流量报表生成机制;所谓“计费级报表”必须靠外部策略(如运营商网关、防火墙策略、或应用层日志)+ 后期聚合实现。你真正能直接拿到的,只有内核暴露的原始流量数据(/proc/net/dev)、实时连接快照(ss、netstat)、或工具采样的带宽估算值。别指望 iftop 或 nethogs 输出 Excel 表格——它们只负责“看”,不负责“记账”。
查单个连接的实时流量:用 ss + /proc/net/nf_conntrack(非 root 会丢数据)
ss 能列出 ESTABLISHED 连接及其 socket 统计,但默认不显示已传输字节数;要拿到近似“连接级流量”,得结合 conntrack 或 /proc/
- 先用
sudo ss -tunap获取 PID 和 inode,再查对应进程的收发字节(但很多场景下 inode 不对应实时流量) - 更可靠的做法是:用
sudo cat /proc/net/nf_conntrack | grep "dst=192.168.1.100"找目标 IP 的连接条目,里面含bytes字段(仅对启用了 conntrack 的连接有效) -
ss -i可显示 TCP 滑动窗口和重传信息,但不输出累计字节数;ss -s只给全局摘要,没法下钻到单连接 - 注意:
nf_conntrack默认只跟踪 NAT/防火墙经过的连接,纯本地 loopback 或未启用 conntrack 模块的系统里为空
按进程汇总流量并导出文本:nethogs -t 是唯一能直接输出表格的方案
nethogs 的文本模式(-t)可被管道捕获,适合写入日志或后续处理。但它不是“计费精度”,而是基于 libpcap 抓包的速率估算,且每秒只刷新一次:
- 运行
sudo nethogs -t -c 1 eth0输出一行当前活跃进程的速率(KB/s),-c 1表示只采样 1 次就退出 - 想做简单累加?用
watch -n 5 'sudo nethogs -t -c 1 eth0 2>/dev/null | tail -n +3 | awk '\''{print $1,$2,$5,$6}'\'' >> /tmp/nethogs.log'—— 但注意:它不记录时间戳,也不区分 TCP/UDP,且静默进程(没发包)完全不出现 - 容器环境里,
nethogs通常只能看到宿主机视角的进程名(比如dockerd),看不到容器内具体命令;cgroups v2 下可能根本拿不到 PID - 别试图用它算“本月总流量”:它的数值是瞬时速率,不是累计量;累计需自己积分,误差随采样间隔增大而放大
生成带时间戳的历史报表:必须依赖 vnstat + 自定义脚本
vnstat 是唯一能长期稳定存档的工具,但它只存接口级总量(eth0 收/发字节数),不拆解连接或进程。要生成“类计费报表”,你得自己补逻辑:
- 先确保已初始化:
sudo vnstat -u -i eth0,否则数据库为空,vnstat -d什么也查不到 -
vnstat -h --json输出 JSON 格式小时级数据,可被 Python/awk 解析;但字段只有rx(接收)、tx(发送),无来源 IP、端口、用户等维度 - 若需按 IP 或端口分摊费用,得另起一个
iptables计数器:sudo iptables -A OUTPUT -d 1.1.1.1 -j ACCEPT -m comment --comment "cloudflare-dns",再用sudo iptables -L -v -n -x提取 bytes 字段 - 常见坑:
vnstat的小时数据默认只保留最近 24 小时,vnstat -h查不到昨天的小时明细;想保留更久,得改配置文件/etc/vnstat.conf中的Hours值
真正的“计费报表”从来不是靠单机命令拼出来的——它需要流量镜像、NetFlow/sFlow 采集、或在入口网关(如 Nginx、HAProxy)开启 access_log 并用 logrotate + ELK/ClickHouse 做聚合。Linux 命令行工具只解决“此刻谁在跑流量”和“这网卡今天总共走了多少”,再多就要架构介入了。


















