netstat 命令常用操作
netstat 命令作用
netstat
是一个网络管理命令行工具,用于监控和排查网络连接状态及统计信息,可以显示网络连接、路由表、接口统计等数据。
常用方法
本文代码运行环境:
$ cat /etc/os-release
# 输出如下
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
...
1. 显示所有连接和监听端口
输出当前主机上所有的网络连接和监听端口。
$ netstat -a
# 输出如下
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:900 0.0.0.0:* LISTEN
tcp 0 0 localhost:ssh localhost:57876 ESTABLISHED
tcp 0 0 cs-100667547897-d:41352 sf-in-f101.1e100.:https ESTABLISHED
tcp 0 0 cs-100667547897-d:55234 metadata.googl:http-alt TIME_WAIT
tcp 0 0 localhost:3000 localhost:49822 ESTABLISHED
tcp 0 0 localhost:57878 localhost:ssh TIME_WAIT
tcp 0 0 localhost:900 cs-100667547897-d:45530 TIME_WAIT
tcp 0 0 localhost:55890 localhost:970 ESTABLISHED
tcp 0 0 cs-100667547897-d:55302 sl-in-f95.1e100.n:https ESTABLISHED
...
显示 IP 地址和端口号:
$ netstat -n
2. 显示 TCP 连接
$ netstat -t
# 输出如下
tcp 0 0 localhost:ssh localhost:57876 ESTABLISHED
tcp 0 0 localhost:3000 localhost:49822 ESTABLISHED
tcp 0 0 localhost:48078 localhost:970 ESTABLISHED
tcp 0 0 localhost:48888 localhost:ssh TIME_WAIT
tcp6 0 0 10.88.0.4:980 10.95.150.2:57362 ESTABLISHED
3. 显示 UDP 连接
$ netstat -u
# 输出省略 ...
4. 显示监听的服务及其进程 PID
$ netstat -lp
# 输出如下
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 384/node
tcp 0 0 0.0.0.0:900 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN 61/sshd: /usr/sbin/
tcp 0 0 localhost:8998 0.0.0.0:* LISTEN -
tcp 0 0 localhost:45439 0.0.0.0:* LISTEN 385/sshd: codean_ne
...
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 21343 193/dockerd /var/run/docker.sock
...
5. 显示网络接口统计信息
输出每个网络接口的统计信息,包括本地环回网络和虚拟/容器网络,通过输出结果可以查看网卡的丢包记录。
$ netstat -i
# 输出如下
# RX-OK、RX-ERR、RX-DRP、RX-OVR 分别表示
# 接收时的总包数、总错误数、进入 Ring Buffer 后因其他原因(如内存不足)导致的丢包数、 Ring Buffer 溢出导致的丢包数
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
docker0 1460 0 0 0 0 0 0 0 0 BMU
eth0 1500 7678 0 0 0 5705 0 0 0 BMRU
lo 65536 6585 0 0 0 6585 0 0 0 LRU
6. 显示路由表
$ netstat -r
# 输出如下
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default 10.88.0.1 0.0.0.0 UG 0 0 0 eth0
10.88.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
7. 显示详细的统计信息
输出详细的网络协议统计信息。
$ netstat -s
# 输出如下
# 不同的协议之间使用空行进行分割
Ip:
Forwarding: 1 # 开启转发
31 total packets received # 总收包数
0 forwarded # 转发包数
0 incoming packets discarded # 接收丢包数
25 incoming packets delivered # 接收的数据包数
15 requests sent out # 发出的数据包数
Icmp:
0 ICMP messages received # 收到的ICMP包数
0 input ICMP message failed # 收到ICMP失败数
ICMP input histogram:
0 ICMP messages sent # ICMP 发送数
0 ICMP messages failed # ICMP 失败数
ICMP output histogram:
Tcp:
57 active connection openings # 主动连接数
165 passive connection openings # 被动连接数
1 failed connection attempts # 失败连接尝试数
28 connection resets received # 接收的连接重置数
16 connections established # 建立连接数
16660 segments received # 已接收报文数
25630 segments sent out # 已发送报文数
25 segments retransmitted # 重传报文数
0 bad segments received # 错误报文数
35 resets sent # 发出的连接重置数
407 SYNs to LISTEN sockets dropped # 半连接队列溢出次数
14 times the listen queue of a socket overflow # 全连接队列溢出次数
Udp:
65 packets received
0 packets to unknown port received
0 packet receive errors
65 packets sent
0 receive buffer errors
0 send buffer errors
...
TcpExt:
11 resets received for embryonic SYN_RECV sockets # 半连接重置数
0 packet headers predicted
TCPTimeouts: 7 # 超时数
TCPSynRetrans: 4 # SYN 重传数
...
如果希望输出指定协议的结果,可以使用指定协议名称的简称作为参数即可 (例如 {-t|–tcp} {-u|–udp} )。
# 指定输出 TCP 协议统计数据
$ netstat -s -t
8. 持续显示网络状态
结合 watch
命令可以实时监控网络状态:
# 监听 TCP 链接状态变化
# 每秒刷新 1 次
$ watch -n 1 netstat -ant
# 输出省略 ...
9. 查看网络协议栈中的套接字信息
$ netstat -nltp
# 输出展示了套接字的状态、接收队列、发送队列、本地地址、远端地址、进程 PID 和进程名称
# -l 表示只显示监听套接字
# -n 表示显示 IP 地址和端口
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:9061 0.0.0.0:* LISTEN 1414/java
tcp 0 0 0.0.0.0:9062 0.0.0.0:* LISTEN 1413/java
tcp 0 0 0.0.0.0:9191 0.0.0.0:* LISTEN 11357/WorkerMan: wo
...
结合其他命令使用
1. 显示与某个端口相关的连接
使用 netstat + grep
筛选出符合条件的连接:
# 查找所有 80 端口的连接
$ netstat -an | grep :80
# 输出省略 ...
# 查找所有 TIME_WAIT 状态的连接
$ netstat -an | grep TIME_WAIT
# 输出省略 ...
2. 查看某个进程的网络连接
# 查看 Docker 进程 ID
$ pidof dockerd
8275
# 查看进程 ID 为 Docker 的网络连接
$ netstat -anp | grep 8275
# 输出如下
tcp 0 0 127.0.0.1:47976 127.0.0.1:1514 ESTABLISHED 8275/dockerd
unix 2 [ ] DGRAM 1372463816 8275/dockerd
...
3. 统计 TCP 连接各类状态的数量
# 在 netstat 命令的输出基础上,使用 awk 进行统计
$ netstat -t | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
# 输出如下
ESTABLISHED 8
FIN_WAIT2 3
TIME_WAIT 14
在统计结果的基础上再进行排序。
$ netstat -nat | awk '{print $6}' | sort | uniq -c | sort -n
# MySQL 数据库的连接数暴涨,想查到连接来源
$ netstat -tpn|grep 3306|grep -i estab|awk '{print $4}'|cut -d ':' -f 1|awk '{a[0]=a[0]=a[0] + 1} END {for (i in a) print i " " a[i]}'
替代工具
需要注意的是,在一些较新的 Linux 发行版中,netstat 已经不再是默认安装了,用户可以使用 ss
和 ip
命令进行替代。
1. ss (Socket Statistics)
# 显示所有 TCP 连接
$ ss -t
# 显示所有 UDP 连接
$ ss -u
# 显示所有监听端口
$ ss -l
# 显示监听端口及其进程信息
$ ss -lp
2. ip (iproute2 工具集的一个子命令)
# 显示路由表
$ ip route
# 显示接口信息
$ ip addr
# 显示链路信息
$ ip link