Linux中netstat详细使用指南

目录

[1. 安装包](#1. 安装包)

[2. 基本语法](#2. 基本语法)

[3. 核心选项](#3. 核心选项)

[4. 输出字段说明](#4. 输出字段说明)

[5. 应用案例](#5. 应用案例)

[5.1 统计连接状态(分析负载)](#5.1 统计连接状态(分析负载))

[5.2 查看路由表信息](#5.2 查看路由表信息)

[5.3 显示网络接口统计(错误包统计)](#5.3 显示网络接口统计(错误包统计))

[5.4 服务器连接数暴涨?](#5.4 服务器连接数暴涨?)

[5.5 识别异常网络连接模式](#5.5 识别异常网络连接模式)

[5.6 持续监控网络状态变化](#5.6 持续监控网络状态变化)

[5.7 审计远程登录来源](#5.7 审计远程登录来源)

[5.8 自动化采集历史数据](#5.8 自动化采集历史数据)

[5.9 实时监控特定端口的连接变化](#5.9 实时监控特定端口的连接变化)

[5.10 提取远程 IP 地址](#5.10 提取远程 IP 地址)

[5.11 组合过滤​](#5.11 组合过滤)

[5.12 统计各协议的连接数​](#5.12 统计各协议的连接数)

[5.13 定位高并发监听端口​](#5.13 定位高并发监听端口)

[5.14 实时状态告警脚本](#5.14 实时状态告警脚本)

[5.15 网络拓扑可视化](#5.15 网络拓扑可视化)


netstat(Network Statistics)是 Linux 系统中经典的网络统计工具,用于查看网络连接、路由表、网络接口统计等信息。尽管现代 Linux 系统(如 CentOS 7+)更推荐使用 ss命令(性能更优),但 netstat仍因功能全面、输出直观被广泛使用。以下是 netstat的详细使用指南:

1. 安装包

CentOS 7 及以上系统默认未预装 netstat(属于 net-tools包),需手动安装:

复制代码
# 安装 net-tools
sudo yum install -y net-tools

2. 基本语法

复制代码
netstat    [选项]

3. 核心选项

选项 说明
-a/--all 显示​​所有​ ​网络连接(包括监听 LISTEN和非监听 ESTABLISHED等状态)。
-t/--tcp 仅显示 ​​TCP​​ 连接(默认不区分协议,需显式指定)。
-u/--udp 仅显示 ​​UDP​​ 连接。
-n/--numeric 以​​数字形式​​显示 IP 地址和端口号(而非解析为域名或服务名,加快输出)。
-p/--program 显示连接对应的​​进程 PID 和程序名​ ​(需 root权限)。
-l/--listening 仅显示​​监听状态​ ​的端口(即服务正在等待连接的端口,如 LISTEN)。
-i/--interface 显示​​网络接口统计信息​​(如网卡流量、错误包等)。
-s/--statistics 显示​​网络协议统计​​(如 TCP/UDP/ICMP 的收发数据包数量)。
-r/--route 显示​​路由表​ ​信息(类似 route -n)。
-c/--continuous 持续刷新输出(每秒刷新一次,按 Ctrl+C终止)。

4. 输出字段说明

查看所有活动的网络连接(TCP/UDP)

复制代码
netstat   -an

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 0 0 0.0.0.0:30081 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN

tcp 0 0 192.168.100.99:80 1.1.1.1:65432 LISTEN

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN

tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN

输出字段说明:

  • Proto:协议(此处为 tcp)。

  • Recv-Q:接收队列中未被进程读取的字节数(TIME_WAIT 状态下通常为 0)。

  • Send-Q:发送队列中未被确认的字节数(TIME_WAIT 状态下通常为 0)。

  • Local Address :本地主机的 IP 地址和端口(如 192.168.100.99:80)。

  • Foreign Address :对端主机的 IP 地址和端口(如 1.1.1.1:65432)。如果Foreign Address 固定为 0.0.0.0:*,表示服务处于等待连接状态。

  • State:连接状态(此处为LISTEN)

  • 切勿将 Local Address0.0.0.0Foreign Address0.0.0.0:* 混淆:前者表示绑定所有本地接口,后者仅表示未建立连接。

5. 应用案例

5.1 统计连接状态(分析负载)

复制代码
netstat -tan | awk '{print $6}' | sort | uniq -c | sort -nr

123 ESTABLISHED # 已建立的连接

45 TIME_WAIT # 等待关闭的连接

8 LISTEN # 监听状态

3 SYN_SENT # 正在发起连接

  • TIME_WAIT 过多:端口资源耗尽风险,需内核调优(如 net.ipv4.tcp_tw_reuse)。

  • SYN_RECV 激增:可能遭受SYN洪水攻击。

  • CLOSE_WAIT 堆积:应用未正确关闭连接(代码缺陷)

备注:内核调优解决TIME_WAIT过多

复制代码
net.ipv4.tcp_tw_reuse = 1                  # 允许重用TIME_WAIT端口
net.ipv4.tcp_fin_timeout = 30              # 缩短FIN等待时间
net.ipv4.ip_local_port_range = 1024 65000  # 扩大端口范围
net.ipv4.tcp_max_tw_buckets = 5000         # 限制TIME_WAIT总数
# 注意:tcp_tw_recycle在NAT环境中禁用(可能导致连接失败) 

生效命令:sysctl -p

5.2 查看路由表信息

复制代码
netstat -rn      # Linux (等效于 route -n)
netstat -r       # Windows

  • -r:显示路由表。

  • -n:数字形式显示 IP(避免 DNS 解析延迟)。

  • 输出关键列:

    • Destination:目标网络。

    • Gateway:网关地址(0.0.0.0表示直连)。

    • Genmask:子网掩码。

    • MSS:最大传输单元(MTU)。

    • Window:接收窗口大小。

    • irtt初始往返时间(RTT)。

5.3 显示网络接口统计(错误包统计)

复制代码
netstat -i       # Linux (接口列表)
netstat -e       # Windows (以太网统计)

# watch 实时监控
watch -n 2 "netstat -i | awk '{print $1, $3, $4, $7, $8}'"

查看 RX-ERR/TX-ERR 排查物理层故障。

5.4 服务器连接数暴涨?

复制代码
netstat -an | awk '/^tcp/ {print $6}' | sort | uniq -c

根据状态分布判断是攻击(大量SYN_RECV)还是程序异常(大量CLOSE_WAIT)。

5.5 识别异常网络连接模式

复制代码
netstat -antp | awk '{print $5}' | grep -v 'Foreign' | sort | uniq -c | sort -nr | head -n 20

5.6 持续监控网络状态变化

复制代码
netstat -c --interval=2
# 输出每隔2秒刷新一次,显示新建/关闭的连接

解析-c 参数启用连续监控模式,配合 --interval 设置刷新间隔,适合观察短时间内的网络波动2。若需长期记录,可结合脚本将输出写入日志文件。

5.7 审计远程登录来源

场景:怀疑非法SSH登录尝试,需追溯所有非本地SSH连接来源。

复制代码
netstat -antp | grep ':22' | grep -v '127.0.0.1'

解析 :通过排除本地回环地址(127.0.0.1),筛选出所有外部IP对SSH端口(22)的访问记录,用于安全审计

5.8 自动化采集历史数据

场景:需分析高峰期网络负载趋势,搭建定时任务记录连接快照。

复制代码
#!/bin/bash
while true; do
    netstat -an > /var/log/netstat_$(date +%Y%m%d_%H%M%S).txt
    sleep 60  # 每60s记录一次
done

5.9 实时监控特定端口的连接变化

复制代码
watch -n 1 "netstat -tunp | grep :443"
  • -n 1:每秒刷新一次
  • 可替换 :443为目标端口(如 :6379、``:3306),快速发现异常连接。

5.10 提取远程 IP 地址

复制代码
netstat -antp | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 |  sort  -nr  |  uniq  -c

5.11 组合过滤​

需求​ ​:查看 TCP 协议、状态为 ESTABLISHED、本地端口为 6379、且远程 IP 为 1.1.1.1的连接。

复制代码
netstat -antp | grep -E 'tcp.*:6379.*1.1.1.1.*ESTABLISHED'

5.12 统计各协议的连接数​

复制代码
netstat -an | awk '/^tcp/ {++tcp} /^udp/ {++udp} END {print "TCP连接数:", tcp, "UDP连接数:", udp}'

5.13 定位高并发监听端口​

需求​​:找出监听端口中连接数最多的前 5 个服务。

复制代码
netstat -ltn | awk '/^tcp.*LISTEN/ {split($4, addr, ":"); port=addr[length(addr)]; count[port]++} END {for (p in count) print p, count[p]}' | sort -nrk2 | head -n5

5.14 实时状态告警脚本

复制代码
#!/bin/bash
TIME_WAIT_COUNT=$(netstat -ant | grep TIME_WAIT | wc -l)
if [ $TIME_WAIT_COUNT -gt 3000 ]; then
  echo "警告: TIME_WAIT连接数($TIME_WAIT_COUNT)过高,请注意 " | mail -s "网络出现异常" admin@example.com
fi

5.15 网络拓扑可视化

实践方案 :将 netstat 输出导入绘图工具(如Graphviz),生成实时网络拓扑图。