netstat -s 在现代 Linux 上基本不可靠,优先用 ss -s 或 /proc/net/snmp;因其依赖过时的 proc 接口解析,而新内核已将计数移至底层,导致 SyncookiesSent 等字段为 0、UDP/ICMPv6 统计缺失,且不支持 eBPF 增强指标。

netstat -s 在现代 Linux 上基本不可靠,优先用 ss -s 或 /proc/net/snmp
为什么 netstat -s 显示的统计值经常为 0 或明显不准
因为 netstat 读取的是内核旧式 proc 接口(如 /proc/net/snmp、/proc/net/netstat),而很多新内核(尤其是 4.15+)已将部分协议栈计数逻辑移至更底层,netstat 的解析器没同步更新。常见现象包括:TcpExt: 下的 SyncookiesSent 恒为 0,UdpLite: 段全空,ICMPv6 统计缺失。
- 它不支持 eBPF 增强后的 TCP 指标(如重传原因细分)
- 多路径或 BPF socket filter 启用时,计数可能被绕过
-
netstat已被标记为废弃,主流发行版(如 RHEL 9、Ubuntu 22.04)默认不预装
ss -s 是更轻量且准确的替代方案
ss -s 直接调用内核的 NETLINK_INET_DIAG 接口,返回的是实时聚合值,不依赖文本解析,延迟低、一致性高。它默认只显示概要,加 -i 可看 TCP 内部状态细节(如 retransmits、fastretransmits)。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
ss -s输出中total:行是当前 ESTABLISHED 连接总数,TCP:行含 synrecv、orphan 等关键状态数 - 想看每 CPU 的中断分布?
ss -s不提供,得查/proc/net/snmp或用perf stat -e 'net:*' - 注意:
ss -s不显示 UDP 错误包(如 no port)、ICMP 类型分布,这些仍需/proc/net/snmp
直接读 /proc/net/snmp 和 /proc/net/netstat 最灵活
这两个文件是内核暴露协议栈统计的权威来源。/proc/net/snmp 是 RFC 1213 定义的标准 MIB,字段稳定;/proc/net/netstat 包含 Linux 特有扩展(如 TcpExt),但格式是键值对+空格分隔,需小心字段对齐。
- 查 TCP 重传率:
awk '/^Tcp:/ {t=$2} /^TcpExt:/ {r=$22; print r/t*100 "%"}' /proc/net/snmp /proc/net/netstat -
/proc/net/snmp中的Udp:行第 4 列是InErrors,对应 “no port” 或校验失败包 - 某些字段(如
TcpExt:SyncookiesRecv)在开启net.ipv4.tcp_syncookies=2时才会计数,仅设为 1 不触发统计
真正要注意的是:协议栈统计本身有采样开销,高频轮询 /proc/net/* 文件可能轻微抬升 softirq 负载;生产环境若需长期采集,建议用 sysctl -w net.netstat_interval=5(如果内核支持)或走 eBPF(如 bpftrace -e 'kprobe:tcp_rcv_established { @retrans[comm] = count(); }')——但这就超出 netstat -s 的原始范畴了。

















