【运维实战】利用 nftables 实现端口范围流量统计与瞬时带宽计算

【运维实战】利用 nftables 实现端口范围流量统计与瞬时带宽计算

一、 概述

在 Linux 服务器运维中,有时我们需要对特定端口(如游戏服务器、内网穿透、代理服务等)进行独立的流量监控。相比于传统的 iptablesnftables 提供了更现代、更高性能的计数器(Counter)机制。

通过在 nftables 中设置特定端口范围的匹配规则,我们可以轻松获取累计流量,并以此为基础计算出瞬时带宽(Mbps)


二、 规则配置:创建流量统计表

我们将创建一个名为 portstats 的表,分别对 11000-19000 端口范围的 TCP 和 UDP 流量(入站与出站)进行统计。

1. 初始化表与链

Bash

# 创建 inet 表(支持 IPv4 和 IPv6)
nft add table inet portstats

# 创建入站(input)和出站(output)钩子链
nft add chain inet portstats input_chain { type filter hook input priority 0 \; }
nft add chain inet portstats output_chain { type filter hook output priority 0 \; }

 

2. 定义命名计数器 (Named Counters)

使用命名计数器可以方便地单独调用和查看数据:

Bash

# 创建 TCP 和 UDP 的入站/出站计数器
nft add counter inet portstats input_tcp_range
nft add counter inet portstats output_tcp_range
nft add counter inet portstats input_udp_range
nft add counter inet portstats output_udp_range

 

3. 绑定端口匹配规则

注意:入站流量匹配 Destination Port (dport),出站流量匹配 Source Port (sport)

Bash

# 入站规则绑定
nft add rule inet portstats input_chain tcp dport 11000-19000 counter name input_tcp_range
nft add rule inet portstats input_chain udp dport 11000-19000 counter name input_udp_range

# 出站规则绑定
nft add rule inet portstats output_chain tcp sport 11000-19000 counter name output_tcp_range
nft add rule inet portstats output_chain udp sport 11000-19000 counter name output_udp_range

 


三、 数据查看与分析

执行以下命令即可实时查看所有计数器的当前值:

Bash

nft list table inet portstats

 

输出示例:

packets 代表包数量,bytes 代表累计总字节数。

Plaintext

table inet portstats {
    counter input_tcp_range {
        packets 3646743 bytes 234844099
    }
    counter output_tcp_range {
        packets 2718337 bytes 7699060368
    }
    ...
}

 


四、 流量单位转换与瞬时带宽计算

1. 累计流量转换 (Bytes -> MB)

如果你想知道累计跑了多少流量,可以使用 bc 命令进行换算:

Bash

# 将字节数除以 1024^2 (1048576) 得到 MB
echo 'scale=2; 7699060368 / 1048576' | bc
# 结果:7342.39 MB

 

2. 计算瞬时带宽 (Mbps)

瞬时带宽的逻辑是:在固定时间间隔内,计算流量的差值

实操步骤:

  1. 获取当前 bytes 值(记为 $T_1$)。

  2. 等待 10 秒 (sleep 10)。

  3. 再次获取 bytes 值(记为 $T_2$)。

  4. 计算:

Bash

# 假设 10 秒内流量从 234MB 增长到了 4346MB
echo 'scale=2; (4346338221 - 234844099) / 1048576 / 10' | bc
# 结果:392.10 Mb/s

 


五、 清理规则

如果你不再需要监控,只需删除整个表,系统会自动清理关联的所有链、规则和计数器,不会留下冗余配置。

Bash

nft delete table inet portstats

 


© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容