每天一个 Linux 命令(10)—— netstat

895 阅读5分钟

这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战

命令简介

netstat 命令 用于显示网络连接、内核路由表和网络接口等各种网络统计数据与状态信息等,一般用于检验本机各端口的网络连接情况。  netstat 是在内核中访问网络及相关信息的程序,它能提供 TCP 连接,TCP 和 UDP 监听,进程内存管理的相关报告。

netstat 命令在日常工作中有哪些应用场景呢?一个简单的例子是:突然有大量的请求失败,无法建立 TCP 连接,我们就可以查看某个端口上,比如 8080 上有多个 TCP 连接,这些连接都是什么状态,等等。然后判断系统异常的原因。

命令格式

netstat [-acCeFghilMnNoprstuvVwx][-A<网络类型>][--ip]

命令参数

参数解释
-g,--groups显示 IPv4 与 IPv6 的广播组成员信息。
-i,-I=iface,--interfaces=iface显示指定或所有网络接口的统计数据及状态信息等。
-r,--route显示内核路由表。
-s,--statistics按照协议分类显示每个协议的汇总统计数据。
-a,--all显示所有套接字(包括正在监听和未监听的套接字)的状态信息。
-c,--continuous每秒一次,连续显示指定的信息。
-e,--extend显示附加的信息。连续指定 -e 选项两次将会显示更多的内容。
-l,--listening仅显示监听的套接字。
-n,--numeric只需显示 IP 地址或端口号即可,不必把 IP 地址解析成相应的主机名或端口名等。
-o,--timers显示时增加网络时钟方面的信息。
-p,--program表示显示每个套接字所属程序的名字与进程 ID。
-v,--verbose显示命令的处理过程与动作。
-t,--tcp仅显示 TCP 套接字的状态信息。
-u,--udp仅显示 UDP 套接字的状态信息。
-w,--raw仅显示原始套接字的状态信息。
-x,--unix仅显示 UNIX 域套接字的状态信息。
--inet,--ip显示 TCP、UDP 及原始套接字的状态信息。

输出字段

Active Internet connections
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)

tcp4       0      0  localhost.54676        10.225.138.92.9575     ESTABLISHED
tcp4       0      0  localhost.54673        10.225.133.153.9717    ESTABLISHED

Active Internet connections

字段解释
Proto套接字采用的协议,如 tcp、udp 或 raw。
Recv-Q本地主机当前套接字接收队列中网络应用程序尚未读取的数据字节计数。
Send-Q本地主机当前套接字发送队列中尚未确认远程主机是否已读取的数据字节计数。
Local Address活动套接字的本地主机地址与端口号,其表示形式为 主机:端口号,“主机”是主机名或 IP 地址。“端口号”是一个网络服务,可以是 /etc/services 文件定义的端口号,也可以是相应的服务名(如 telnet)。除非指定了 -n 选项,本地主机地址字段通常是主机名(或规范域名)与服务名的组合。
Foreign Address活动套接字的远程主机地址与端口号。表示方法同上。
State表示网络连接(套接字)的状态。即常见的 TCP 状态,例如 ESTABLISHEDSYN_SENT 等。(注意,raw 模式与 UDP 协议不提供网络连接状态信息,故其状态列通常为空)。
User套接字文件属主的用户名或用户 ID。
PID/Program name打开或使用套接字的进程的 PID 与进程名字。注意,仅当指定了 -p 选项后才会输出此项,而且只有超级用户才能看到完整的信息。

Active UNIX domain Sockets

字段解释
Proto套接字采用的协议(通常为 unix)。
RefCnt引用计数,表示加接到相应套接字的进程数量。
Flags标志字段。其中 ACC(SO_ACCEPTON)W(SO_WAITDATA) 或 N(SO_NOSPACE) 是可能出现的标志之一。ACC 标志表示一个套接字尚未连接,其相应的进程正在等待网络连接请求。
Type套接字访问类型。
PID/Program name打开套接字的进程的 PID 与进程名字。注意,仅当指定了 -p 选项后才输出此项,而且只有超级用户才能看到完整的信息。
Path套接字的文件路径名。

Kernel Interface table(“netstat -i”命令)

netstat -i
Name       Mtu   Network       Address            Ipkts Ierrs    Opkts Oerrs  Coll
lo0   16384 <Link#1>                      20089910     0 20089910     0     0
lo0   16384 127           localhost       20089910     - 20089910     -     -
lo0   16384 localhost   ::1               20089910     - 20089910     -     -
字段解释
Iface网络接口的名字。
MTU网络接口当前支持的最大传输单位。MTU 是 IP 模块的设备驱动程序一次收发时能够处理的最大字节数量。对于常规的以太网络接口、回环网络接口(loopback)和 IEEE 802.3 网络接口,MTU 的默认值分别为 1500、8232 和 1492。
Met网络接口当前支持的路由度量值。
RX-OK正确无误地接收分组数据的数量。
RX-ERR接收的分组数据本身有误的分组数据数量。

应用实例

  1. 列出所有端口
netstat -a
  1. 显示当前 UDP 连接状况
netstat -nu
  1. 显示 UDP 端口号的使用情况
netstat -apu
  1. 显示网卡列表
netstat -i
  1. 显示组播组的关系
netstat -g
  1. 显示网络统计信息
netstat -s
  1. 显示监听的套接口
netstat -l
  1. 显示所有已建立的有效连接
netstat -n
  1. 显示关于以太网的统计数据
netstat -e
  1. 显示关于路由表的信息
netstat -r
  1. 列出所有 tcp 端口
netstat -at
  1. 统计机器中网络连接各个状态个数
netstat -a | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
  1. 把状态全都取出来后使用 uniq -c 统计后再进行排序
netstat -nat |awk '{print $6}'|sort|uniq -c
  1. 找出程序运行的端口
netstat -ap | grep ssh

参考文档

  • netstat命令
  • 《Linux 常用命令简明手册》—— 邢国庆编著