当前位置:首页>Linux>Linux netstat 命令深度解析:从网络连接到端口监控的完整实现

Linux netstat 命令深度解析:从网络连接到端口监控的完整实现

  • 2026-10-11 07:43:36
Linux netstat 命令深度解析:从网络连接到端口监控的完整实现

netstat 的核心价值

netstat 的本质是读取内核网络栈信息。在 Linux 系统中,所有网络连接信息都存储在 /proc 文件系统:

# TCP 连接信息/proc/net/tcp/proc/net/tcp6# UDP 连接信息/proc/net/udp/proc/net/udp6# Unix 域套接字/proc/net/unix# 路由表/proc/net/route# 网络接口统计/proc/net/dev

netstat 命令其实就是这些文件的格式化输出工具。了解了这一点,很多输出字段就很好理解了。

常用参数深度解析

1. -tunlp 参数组合

这是最常见的组合,每个字母都有特定含义:

netstat -tunlp
  • -t
    : 显示 TCP 连接
  • -u
    : 显示 UDP 连接
  • -n
    : 以数字形式显示地址和端口(不做 DNS 解析,快 10 倍以上)
  • -l
    : 只显示监听状态的套接字
  • -p
    : 显示进程 ID 和程序名(需要 root 权限)

输出示例:

Proto Recv-Q Send-Q Local Address   Foreign Address  State       PID/Program nametcp   0      0      0.0.0.0:80      0.0.0.0:*        LISTEN      1234/nginxtcp   0      0      127.0.0.1:3306  0.0.0.0:*        LISTEN      5678/mysqldtcp6  0      0      :::443          :::*             LISTEN      1234/nginx

2. -an 参数组合

显示所有连接(包括已建立的):

netstat -an | grep ESTABLISHED

输出字段详解:

Proto  Recv-Q  Send-Q  Local Address    Foreign Address   Statetcp    0       0       192.168.1.100:22  203.0.113.5:52341 ESTABLISHED
  • Recv-Q
    : 接收队列中等待应用读取的字节数(应该接近 0)
  • Send-Q
    : 发送队列中未收到 ACK 的字节数(高值可能是网络拥塞)
  • Local Address
    : 本地 IP:端口
  • Foreign Address
    : 远程 IP:端口
  • State
    : TCP 连接状态

3. TCP 状态详解

netstat 最强大的功能之一是查看 TCP 状态:

netstat -ant | awk '{print 4 ~ /:80805}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -10# 输出示例    125 192.168.1.100     45 10.0.0.5     12 203.0.113.10

可以快速发现异常 IP(可能是 DDoS 攻击)。

性能优化:netstat vs ss

netstat 读取 /proc 文件时会遍历所有 socket,在高并发服务器上性能较差:

# 性能对比(10万连接)time netstat -ant | wc -l   # 约 2-3 秒time ss -ant | wc -l        # 约 0.1 秒

ss 命令直接读取内核 netlink socket,速度快 20 倍以上。但 netstat 在低并发场景下足够用,且输出更易读。

高级技巧:持续监控

1. 实时监控连接变化

# 每秒刷新一次watch -n 1 'netstat -ant | grep ESTABLISHED | wc -l'

2. 监控特定端口

# 监控 80 端口的连接变化watch -n 1 'netstat -ant | grep ":80 "'

3. 导出网络统计到 CSV

netstat -i | awk 'NR>2 {print $1","$4","$5","$6","$7}' > network_stats.csv

Web 实现:浏览器端的"netstat"

浏览器无法直接访问系统网络栈,但可以通过 WebRTC 获取本地 IP:

async function getLocalIP(): Promise<string[]> {  return new Promise((resolve) => {    const ips: string[] = []    const pc = new RTCPeerConnection({ iceServers: [] })    pc.createDataChannel('')    pc.createOffer().then(offer => pc.setLocalDescription(offer))    pc.onicecandidate = (event) => {      if (!event?.candidate?.candidate) return      const match = event.candidate.candidate.match(/(\d+\.\d+\.\d+\.\d+)/)      if (match && !ips.includes(match[1])) {        ips.push(match[1])      }      if (pc.connectionState === 'closed') {        resolve(ips)      }    }    setTimeout(() => {      pc.close()      resolve(ips)    }, 1000)  })}// 使用const localIPs = await getLocalIP()console.log('Local IPs:', localIPs) // ['192.168.1.100', '10.0.0.5']

虽然功能有限,但展示了如何在前端获取网络信息。

常见陷阱

1. DNS 解析拖慢速度

# 慢:会做 DNS 反向解析netstat -a# 快:数字形式显示netstat -an

2. -p 参数需要 root 权限

# 普通用户运行,PID/Program name 显示为空netstat -tunlp# 需要 sudosudo netstat -tunlp

3. 容器环境中的网络命名空间

Docker 容器有独立的网络命名空间,宿主机的 netstat 看不到容器内的连接:

# 进入容器的网络命名空间docker exec <container_id> netstat -tunlp

netstat 在线工具

如果你想快速查看网络连接信息,可以试试 Linux netstat 命令查询,提供了命令详解和常用参数说明。

总结

netstat 是网络诊断的基础工具,掌握它可以快速定位大部分网络问题。核心要点:

  1. 理解 /proc 文件系统是数据源
  2. 掌握 -tunlp 和 -an 参数组合
  3. 熟悉 TCP 状态及其含义
  4. 高并发场景用 ss 替代
  5. 结合 watch 和管道实现持续监控

下次遇到网络连接问题时,不要只会 ping 和 telnet,试试 netstat,你会看到更多信息。


相关工具:端口检测器 | IP 地址查询

最新文章

随机文章