如何在Linux上使用netstat

时间:2020-01-09 10:39:52  来源:igfitidea点击:

Linux的netstat命令可为我们提供有关网络连接,正在使用的端口以及使用它们的进程的信息宝库。了解如何使用它。

端口,进程和协议

网络套接字可以连接,也可以等待连接。这些连接使用网络协议,例如传输控制协议(TCP)或者用户数据报协议UDP。他们使用Internet协议地址和网络端口建立连接。

套接字一词可以让人联想到导线或者电缆的物理连接点,但是在这种情况下,套接字是一种用于处理网络数据连接一端的软件结构。

套接字有两种主要状态:它们已连接并促进正在进行的网络通信,或者它们正在等待传入连接以连接到它们。还有其他状态,例如套接字在远程设备上建立连接的过程中途的状态,但是暂时状态暂且不考虑,我们可以将套接字视为已连接或者正在等待(通常称为侦听)。

侦听套接字称为服务器,而请求与侦听套接字建立连接的套接字称为客户端。这些名称与硬件或者计算机角色无关。它们仅定义连接两端的每个套接字的角色。

netstat命令可让我们发现连接了哪些套接字以及正在侦听哪些套接字。意思是,它告诉我们正在使用哪些端口以及正在使用哪些进程。它可以显示有关网络接口和多播连接的路由表和统计信息。

随着时间的推移,netstat的功能已在不同的Linux实用程序(例如ip和ss)中复制。仍然值得了解所有网络分析命令的祖父,因为它适用于所有Linux和Unix操作系统,甚至Windows和Mac。

这是使用方法,并附有示例命令。

列出所有套接字

-a(all)选项使netstat显示所有已连接和正在等待的套接字。该命令很容易产生长列表,因此我们将其通过管道传递给less

netstat -a | less

列表包括TCP(IP),TCP6(IPv6)和UDP套接字。

终端窗口中的回绕使得很难看到发生了什么。这是该列表中的几个部分:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address     Foreign Address State 
tcp        0      0 localhost:domain  0.0.0.0:*       LISTEN 
tcp        0      0 0.0.0.0:ssh       0.0.0.0:*       LISTEN 
tcp        0      0 localhost:ipp     0.0.0.0:*       LISTEN 
tcp        0      0 localhost:smtp    0.0.0.0:*       LISTEN 
tcp6       0      0 [::]:ssh          [::]:*          LISTEN 
tcp6       0      0 ip6-localhost:ipp [::]:*          LISTEN 
.
.
.
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags   Type     State       I-Node  Path
unix  24     [ ]     DGRAM                12831   /run/systemd/journal/dev-log
unix  2      [ ACC ] STREAM    LISTENING  24747   @/tmp/dbus-zH6clYmvw8
unix  2      [ ]     DGRAM                26372   /run/user/1000/systemd/notify
unix  2      [ ]     DGRAM                23382   /run/user/121/systemd/notify
unix  2      [ ACC ] SEQPACKET LISTENING  12839   /run/udev/control

"活动Internet"部分列出了已连接的外部连接和本地套接字,用于侦听远程连接请求。也就是说,它列出了(或者将要)建立到外部设备的网络连接。

UNIX域部分列出了已连接的和正在侦听的内部连接。换句话说,它列出了计算机内不同应用程序,进程和操作系统元素之间已建立的连接。

"活动的Internet"列为:

  • Proto:此套接字使用的协议(例如,TCP或者UDP)。

  • Recv-Q:接收队列。这些是已接收并已缓冲的传入字节,等待使用此连接的本地进程读取和使用它们。

  • Send-Q:发送队列。这显示了准备从发送队列发送的字节。

  • 本地地址:连接本地端的地址详细信息。缺省值为netstat,以显示地址的本地主机名以及端口的服务名称。

  • 外部地址:连接远端的地址和端口号。

  • 状态:本地套接字的状态。对于UDP套接字,通常为空白。请参阅下面的状态表。

对于TCP连接,状态值可以是以下之一:

  • LISTEN:仅服务器端。套接字正在等待连接请求。

  • SYN-SENT:仅客户端。该套接字已发出连接请求,正在等待是否接受它。

  • SYN-RECEIVED:仅服务器端。该套接字在接受连接请求后正在等待连接确认。

  • 成立:服务器和客户端。服务器和客户端之间已建立工作连接,从而允许在两者之间传输数据。

  • FIN-WAIT-1:服务器和客户端。该套接字正在等待来自远程套接字的连接终止请求,或者正在等待先前从该套接字发送的连接终止请求的确认。

  • FIN-WAIT-2:服务器和客户端。该套接字正在等待来自远程套接字的连接终止请求。

  • CLOSE-WAIT:服务器和客户端。该套接字正在等待本地用户的连接终止请求。

  • 关闭:服务器和客户端。该套接字正在等待远程套接字的连接终止请求确认。

  • LAST-ACK:服务器和客户端。该套接字正在等待对发送到远程套接字的连接终止请求的确认。

  • TIME-WAIT:服务器和客户端。该套接字向远程套接字发送了一个确认,以使其知道已收到远程套接字的终止请求。现在正在等待确保已收到确认。

  • CLOSED:没有连接,因此套接字已终止。

Unix域列是:

  • Proto:此套接字使用的协议。这将是Unix。

  • RefCnt:参考计数。连接到此套接字的添加进程数。

  • 标志:通常设置为" ACC",代表" SO_ACCEPTON",表示套接字正在等待连接请求。显示为W的SO_WAITDATA表示有等待读取的数据。显示为N的SO_NOSPACE表示没有空间向套接字写入数据(即发送缓冲区已满)。

  • 类型:插座类型。请参阅下面的类型表。

  • 状态:套接字的状态。请参阅下面的状态表。

  • 节点:与此套接字关联的文件系统索引节点。

  • 路径:套接字的文件系统路径。

Unix域套接字类型可以是以下之一:

  • DGRAM:套接字在数据报模式下使用,使用固定长度的消息。数据报既不能保证可靠,无序又无重复。

  • 流:此套接字是流套接字。这是普通的套接字连接类型。这些套接字旨在提供可靠的数据包顺序(按顺序)传递。

  • RAW:此套接字被用作原始套接字。原始套接字在OSI模型的网络级别运行,并且不从传输级别引用TCP和UDP标头。

  • RDM:此套接字位于可靠传递的消息连接的一端。

  • SEQPACKET:此套接字用作顺序数据包套接字,这是提供可靠,有序且无重复的数据包传递的另一种方法。

  • 数据包:原始接口访问套接字。数据包套接字用于在OSI模型的设备驱动程序级别(即数据链路层)接收或者发送原始数据包。

Unix域套接字状态可以是以下之一:

  • FREE:未分配此套接字。

  • 注意:此套接字正在侦听传入的连接请求。

  • CONNECTING:此套接字正在连接过程中。

  • 已连接:已建立连接,并且套接字能够接收和传输数据。

  • 断开连接:连接正在终止中。

哇,有很多信息!许多netstat选项以一种或者另一种方式优化结果,但是它们并没有改变太多内容。让我们来看看。

按类型列出套接字

netstat -a命令可以提供比我们需要看到的更多的信息。如果只希望或者需要查看TCP套接字,则可以使用-t(TCP)选项将显示限制为仅显示TCP套接字。

netstat -at | less

显示量大大减少。列出的几个套接字都是TCP套接字。

-u(UDP)和-x(UNIX)选项的行为类似,将结果限制为在命令行上指定的套接字类型。这是正在使用的-u(UDP)选项:

netstat -au | less

仅列出了UDP套接字。

按状态列出套接字

要查看处于侦听或者等待状态的套接字,请使用-l(侦听)选项。

netstat -l | less

列出的套接字是处于侦听状态的套接字。

可以将其与-t(TCP,-u(UDP)和-x(UNIX)选项结合使用,以进一步置入感兴趣的套接字中。让我们寻找侦听TCP套接字:

netstat -lt | less

现在,我们仅看到TCP侦听套接字。

协议网络统计

要查看协议的统计信息,请使用-s(统计信息)选项,并传入-t(TCP),-u(UDP)或者-x(UNIX)选项。如果仅使用-s选项(统计信息),则会看到所有协议的统计信息。让我们检查一下TCP协议的统计信息。

netstat -st | less

TCP连接的统计信息集合以less显示。

显示进程名称和PID

使用套接字查看进程的进程ID(PID)以及该进程的名称可能会很有用。 -p(程序)选项就是这样做的。让我们看看使用处于侦听状态的TCP套接字的进程的PID和进程名是什么。我们使用sudo来确保我们收到所有可用的信息,包括通常需要root权限的所有信息。

sudo netstat -p -at

这是格式化表格中的输出:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address       Foreign Address   State    PID/Program name 
tcp      0        0 localhost:domain    0.0.0.0:*         LISTEN   6927/systemd-resolv 
tcp      0        0 0.0.0.0:ssh         0.0.0.0:*         LISTEN   751/sshd 
tcp      0        0 localhost:ipp       0.0.0.0:*         LISTEN   7687/cupsd 
tcp      0        0 localhost:smtp      0.0.0.0:*         LISTEN   1176/master 
tcp6     0        0 [::]:ssh            [::]:*            LISTEN   751/sshd 
tcp6     0        0 ip6-localhost:ipp   [::]:*            LISTEN   7687/cupsd 
tcp6     0        0 ip6-localhost:smtp  [::]:*            LISTEN   1176/master

我们还有一个名为PID /程序名称的列。此列列出了使用每个套接字的PID和进程名称。

列出数字地址

我们可以消除歧义的另一步骤是将本地和远程地址显示为IP地址,而不是其解析的域和主机名。如果我们使用-n(数字)选项,则IPv4地址以点分十进制格式显示:

sudo netstat -an | less

IP地址显示为数值。还显示了端口号,与IP地址之间用冒号":"分隔。

IP地址127.0.0.1表明套接字已绑定到本地计算机的环回地址。我们可以将IP地址0.0.0.0视为本地地址的默认路由,以及外部地址的任何IP地址。显示为::的IPv6地址也都是零地址。

可以轻松检查列出的端口,以了解其通常的用途:

  • 22:这是安全shell(SSH)侦听端口。

  • 25:这是简单邮件传输协议(SMTP)侦听端口。

  • 53:这是域名系统(DNS)侦听端口。

  • 68:这是动态主机配置协议(DHCP)侦听端口。

  • 631:这是通用UNIX打印系统(CUPS)侦听端口。

显示路由表

-r(路由)选项显示内核路由表。

sudo netstat -r

这是一个整洁的表中的输出:

Kernel IP routing table
Destination   Gateway       Genmask        Flags  MSS  Window  irtt  Iface
default       Vigor.router  0.0.0.0        UG       0  0          0  enp0s3
link-local    0.0.0.0       255.255.0.0    U        0  0          0  enp0s3
192.168.4.0   0.0.0.0       255.255.255.0  U        0  0          0  enp0s3

并且,这是各列的含义:

  • 目标:目标网络或者目标主机设备(如果目标不是网络)。

  • 网关:网关地址。如果未设置网关地址,则在此处显示星号" *"。

  • Genmask:路由的子网掩码。

  • 标志:请参见下面的标志表。

  • MSS:此路由上TCP连接的默认最大段大小,这是一个TCP段中可以接收的最大数据量。

  • 窗口:此路由上TCP连接的默认窗口大小,指示在接收缓冲区已满之前可以传输和接收的数据包数量。实际上,数据包由接收应用程序使用。

  • irtt:初始往返时间。内核引用该值以对响应较慢的远程连接的TCP参数进行动态调整。

  • Iface:通过该路由发送的数据包从其传输的网络接口。

标志值可以是以下之一:

  • U:路线已上。

  • H:目标是主机,并且是此路由上可能的唯一目的地。

  • G:使用网关。

  • R:恢复动态路由。

  • D:由路由守护程序动态安装。

  • M:由路由守护程序在收到Internet控制消息协议(ICMP)数据包时进行修改。

  • 答:由自动DNS和DHCP配置文件生成器" addrconf"安装。

  • C:缓存条目。

  • !:拒绝路线。

查找进程使用的端口

如果我们通过grep传递netstat的输出,我们可以按名称搜索一个进程并确定它正在使用的端口。我们使用先前使用的-a(全部),-n(数字)和-p(程序)选项,并搜索sshd。

sudo netstat -anp | grep "sshd"

grep查找目标字符串,我们看到sshd守护进程正在使用端口22.

当然,我们也可以相反地这样做。如果我们搜索:22,我们可以找出哪个进程正在使用该端口(如果有)。

sudo netstat -anp | grep ":22"

这次grep找到目标字符串:22,我们看到使用该端口的进程是sshd守护进程,进程ID 751.

列出网络接口

-i(接口)选项将显示netstat可以发现的网络接口表。

sudo netstat -i

这是更清晰易懂的输出:

Kernel Interface table
Iface     MTU   RX-OK  RX-ERR  RX-DRP  RX-OVR    TX-OK   TX-ERR   TX-DRP   TX-OVR Flg
enp0s3   1500 4520671       0       0  0       4779773        0        0        0 BMRU
lo      65536   30175       0       0  0         30175        0        0        0 LRU

这是列的含义:

  • Iface:接口的名称。 enp0s3接口是通往外界的网络接口,lo接口是环回接口。使用环回接口,即使计算机未连接到网络,进程也可以使用网络协议在计算机内进行相互通信。

  • MTU:最大传输单位(MTU)。这是可以发送的最大数据包。它由包含路由和协议标志的标头以及其他元数据以及实际传输的数据组成。

  • RX-OK:接收的数据包数量,无错误。

  • RX-ERR:收到的有错误的数据包数。我们希望它尽可能低。

  • RX-DRP:丢弃(即丢失)的数据包数。我们还希望该值尽可能低。

  • RX-OVR:接收时由于溢出而丢失的数据包数。这通常意味着接收缓冲区已满,无法再接收任何数据,但是接收到更多数据,必须将其丢弃。该数字越低越好,零是完美的。

  • TX-OK:传输的数据包数量,无错误。

  • RX-ERR:传输的有错误的数据包数。我们希望它为零。

  • RX-DRP:传输时丢弃的数据包数。理想情况下,该值为零。

  • RX-OVR:传输时由于溢出而丢失的数据包数。这通常意味着发送缓冲区已满,无法再接受任何数据,但是更多数据已准备好发送,必须丢弃。

  • Flg:旗帜。请参阅下面的标志表。

这些标志表示以下内容:

  • B:正在使用广播地址。

  • L:此接口是回送设备。

  • M:正在接收所有分组(即,处于混杂模式)。没有任何内容被过滤或者丢弃。

  • O:此接口的地址解析协议(ARP)已关闭。

  • P:这是点对点(PPP)连接。

  • R:接口正在运行。

  • U:接口打开。

列出多播组成员资格

简而言之,无论接收者有多少,多播传输都使数据包只能发送一次。例如,对于视频流之类的服务,从发送者的角度来看,这极大地提高了效率。

-g(组)选项使netstat列出每个接口上套接字的多播组成员身份。

sudo netstat -g

列非常简单:

  • 接口:套接字传输所经过的接口的名称。

  • RefCnt:引用计数,它是添加到套接字的进程数。

  • 组:组播组的名称或者标识符。