努力
加油

CentOS或Ubuntu系统下,如何实时查看已用公网出方向流量?

在云服务器(ECS/CVM)内部直接查看“实时公网出方向流量”,其实是一个伪命题,或者说是一个容易混淆的概念。

核心结论先行:
操作系统内核层面的 ifconfig 或 ip -s link 统计的是网卡总流量,它无法区分哪些是“公网”、哪些是“内网”,也无法精确区分“入”和“出”的绝对物理边界(尤其是在有 NAT、VPC 路由、负载均衡等场景下)。

因此,要获得准确、合规、可审计的“公网出方向流量”,必须依赖云平台控制台或云监控服务。如果你非要在服务器内部看个大概,只能看网卡总出口速率,但这不代表公网流出量。

下面分三个层面来解答:


一、最准确方案:使用云平台监控(推荐)

这是唯一能真实反映“公网出方向”流量的方式,因为流量是否经过公网网关、是否被 Nginx/CDN 缓存、是否走XX,只有云平台底层网络设备知道。

1. 阿里云 ECS

  • 路径:控制台 -> 实例 -> 监控图表 -> 网络监控。
  • 关键指标:IntranetOut(内网出)、InternetOut(公网出)。
  • 注意:默认监控粒度通常是 5 分钟。如果需要秒级实时监控,需开启“云监控高级版”或使用自定义脚本上报。

2. 腾讯云 CVM

  • 路径:控制台 -> 云服务器 -> 实例列表 -> 点击实例 ID -> “监控数据”。
  • 关键指标:NetworkOut(出方向总流量),但腾讯云通常不直接提供“公网出”与“内网出”的分离视图,除非你使用了 CLB/SLB 且查看的是 CLB 的监控。对于普通 CVM,NetworkOut 包含了所有从该实例发出的流量。
  • 技巧:如果实例绑定了弹性公网 IP(EIP),可以查看 EIP 的监控面板,那里更精准地反映了经过该 IP 的公网流量。

3. 华为云 / AWS / Azure

  • 逻辑类似:找到对应的 VPC 网关、EIP 或 ENI 的监控项。AWS 中看 NetworkOut 在 EC2 监控里,但同样包含内网;更精确的是看 CloudWatch 中的 BytesOut 结合 VPC Flow Logs。

为什么强调这个?
很多用户误以为服务器里的 eth0 就是公网,其实现在主流架构都是 VPC + NAT 网关。你的服务器可能通过私网地址访问互联网,流量先经过 NAT 网关再出去。此时,服务器内部的网卡统计只是“私网出流量”,而 NAT 网关才是真正产生公网出费用的地方。以云厂商账单为准,永远是最安全的。


二、服务器内部近似方案(仅限调试/估算)

如果你必须在终端里看一个“实时出口速率”,用于排查本地应用是否疯狂发包,可以使用以下工具。请注意:这 ≠ 公网出流量,而是“本机所有网卡出方向总速率”。

1. 使用 sar(sysstat 包,最经典)

# 安装
sudo yum install sysstat  # CentOS
sudo apt install sysstat  # Ubuntu

# 实时每秒刷新网络收发
sar -n DEV 1
  • 关注列:rxkB/s(接收)、txkB/s(发送)。
  • 局限:显示的是所有网卡(包括 lo, docker0, veth 等)的总和。如果有多块网卡,需要手动累加感兴趣的接口。

2. 使用 nload 或 iftop(更直观)

# 安装
sudo yum install nload      # CentOS
sudo apt install nload      # Ubuntu

# 运行
nload eth0   # 指定具体网卡,如 eth0 或 ens3
  • 优点:图形化界面,清晰显示当前瞬时速率和历史峰值。
  • 缺点:依然无法区分公网/内网。

3. 使用 ss 或 netstat 看连接数(间接判断)

如果你怀疑某个进程在大量上传数据:

# 按 PID 排序查看网络连接
ss -tnp | awk '{print $7}' | sort | uniq -c | sort -nr | head -10

结合 iotop 或 pidstat -d 可以定位是哪个进程在写磁盘/发网络包。


三、高级方案:VPC Flow Logs(流日志)—— 最接近真相的内部视角

如果你确实需要在服务器层面做精细分析,且不想完全依赖云控制台,可以启用 VPC 流日志(VPC Flow Logs)。

  • 原理:记录 VPC 内所有 ENI(弹性网卡)的 IP 数据包元数据(源 IP、目的 IP、协议、字节数、动作等)。
  • 优势:你可以过滤出 DestinationIp 为公网 IP 的记录,从而计算出真正的“公网出流量”。
  • 实施步骤(以阿里云为例):
    1. 进入 VPC 控制台 -> 流日志。
    2. 创建流日志,关联到你的 VPC 或特定交换机。
    3. 将日志投递到 SLS(日志服务)或 OSS。
    4. 在日志服务中编写 SQL 查询:
      SELECT sum(bytes) FROM log WHERE dest_ip NOT IN ('10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16') AND action = 'ACCEPT'

      (注:排除私有网段即视为公网流量)

注意:此方法有延迟(通常几分钟),不适合“秒级实时”监控,但适合对账和分析。


四、常见误区与避坑指南

  1. 误区:top 命令里的 KiB/s 是网络流量?
    错。top 默认显示的是 CPU 和内存。按 1 键才会显示每个 CPU 核心的详细情况,也不含网络。

  2. 误区:ping 外部地址的速度代表带宽?
    不能。Ping 包很小,受限于 ICMP 优先级和 MTU,无法测速。测带宽请用 iperf3,但那是测内网带宽的。

  3. 误区:Nginx/Apache 的 access.log 能算出公网流量?
    可以粗略估算。$body_bytes_sent 字段记录了响应给客户端的字节数。

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                   '$status $body_bytes_sent "$http_referer" '
                   '"$http_user_agent"';

    定期汇总 $body_bytes_sent 可以得到 Web 服务产生的公网出流量。但不包括 SSH 登录、后台同步、API 调用等非 HTTP 流量。

  4. 敏感词提醒:
    在国内云计算环境下,讨论流量时务必注意内容安全。如果你的公网出流量异常高,首先要排查是否被植入XX木马、DDoS 攻击反弹、或违规内容分发。云厂商会对异常流量进行告警甚至限制,这不是技术问题,而是合规问题。


总结建议

需求场景 推荐方案 准确性 实时性
计费对账、合规审计 云控制台网络监控 / 账单详情 ⭐⭐⭐⭐⭐ T+1 或 5 分钟级
秒级实时监控报警 云监控 API + 自定义脚本 ⭐⭐⭐⭐ 秒级
服务器内部调试 nload eth0 或 sar -n DEV 1 ⭐⭐(仅总出口) 实时
精细化流量分析 VPC Flow Logs + 日志服务 ⭐⭐⭐⭐⭐ 分钟级延迟

最终忠告:不要试图在 Linux 系统内部用纯软件手段去“精确”计算公网出方向流量。虚拟化环境下的网络栈复杂,NAT、SNAT、DNAT、负载均衡都会让主机视角失效。相信云平台的监控数据,它是唯一权威来源。