如何在 Linux 上使用 netstat如何在 Linux 上使用 netstat如何在 Linux 上使用 netstat如何在 Linux 上使用 netstat
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 Linux 上使用 netstat

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

端口、进程和协议

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

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

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

侦听套接字称为服务器,请求与侦听套接字连接的套接字称为客户端。这些名称与硬件或计算机角色无关。它们只是简单地定义了每个套接字在连接两端的作用。

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

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

以下是如何使用它,并附有示例命令。

列出所有套接字

-a(全部)选项使 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

“Active Internet”部分列出了已连接的外部连接和侦听远程连接请求的本地套接字。也就是说,它列出了(或将要)与外部设备建立的网络连接。

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

“活动互联网”列是:

  • Proto:此套接字使用的协议(例如,TCP 或 UDP)。
  • Recv-Q:接收队列。这些是已接收并缓冲的传入字节,等待使用此连接的本地进程读取和使用它们。
  • Send-Q:发送队列。这显示了已准备好从发送队列发送的字节数。
  • Local address:连接本地端的详细地址。 netstat 默认显示地址的本地主机名和端口的服务名称。
  • 外部地址:连接远端的地址和端口号。
  • State: 本地套接字的状态。对于 UDP 套接字,这通常是空白的。请参阅下面的状态表。

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

  • LISTEN: 仅限服务器端。套接字正在等待连接请求。
  • SYN-SENT: 仅限客户端。此套接字已发出连接请求,正在等待是否被接受。
  • SYN-RECEIVED: 仅限服务器端。此套接字在接受连接请求后正在等待连接确认。
  • ESTABLISHED: 服务器和客户端。服务器和客户端之间已建立工作连接,允许在两者之间传输数据。
  • FIN-WAIT-1: 服务器和客户端。此套接字正在等待来自远程套接字的连接终止请求,或等待先前从该套接字发送的连接终止请求的确认。
  • FIN-WAIT-2: 服务器和客户端。此套接字正在等待来自远程套接字的连接终止请求。
  • CLOSE-WAIT: 服务器和客户端。此套接字正在等待来自本地用户的连接终止请求。
  • 结束:服务器和客户端。此套接字正在等待来自远程套接字的连接终止请求确认。
  • LAST-ACK: 服务器和客户端。此套接字正在等待对它发送到远程套接字的连接终止请求的确认。
  • TIME-WAIT: 服务器和客户端。这个套接字向远程套接字发送一个确认,让它知道它收到了远程套接字的终止请求。现在正在等待确认收到确认。
  • CLOSED:没有连接,因此套接字已终止。

“Unix 域”列是:

  • Proto: 这个套接字使用的协议。它将是“unix”。
  • RefCnt: 引用计数。连接到此套接字的附加进程数。
  • Flags:这通常设置为ACC,表示SO_ACCEPTON,表示套接字正在等待连接请求。 SO_WAITDATA,显示为W,表示有数据等待读取。 SO_NOSPACE,显示为N,表示没有空间可以向套接字写入数据(即发送缓冲区已满)。
  • 类型:套接字类型。请参阅下面的类型表。
  • 状态:套接字的状态。请参阅下面的状态表。
  • I-Node:与此套接字关联的文件系统 inode。
  • 路径:套接字的文件系统路径。

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

  • DGRAM:套接字正在数据报模式下使用,使用固定长度的消息。数据报既不能保证可靠、有序,也不能保证不重复。
  • STREAM: 这个套接字是一个流套接字。这是常见的“正常”类型的套接字连接。这些套接字旨在提供可靠的有序(按顺序)数据包交付。
  • RAW: 这个套接字被用作原始套接字。原始套接字在 OSI 模型的网络级别运行,不从传输级别引用 TCP 和 UDP 标头。
  • RDM:此套接字位于可靠传送的消息连接的一端。
  • SEQPACKET:此套接字作为顺序数据包套接字运行,这是提供可靠、有序且无重复的数据包传输的另一种方式。
  • PACKET: 原始接口访问套接字。数据包套接字用于在 OSI 模型的设备驱动程序(即数据链路层)级别接收或发送原始数据包。

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

  • FREE:此套接字未分配。
  • LISTENING:此套接字正在侦听传入的连接请求。
  • CONNECTING:此套接字正在连接。
  • CONNECTED:连接已经建立,套接字可以接收和发送数据。
  • DISCONNECTING:连接正在终止。

哇,这是很多信息!许多 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

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

显示进程名称和 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:这是安全外壳 (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:通过此路由发送数据包的网络接口。

flags 值可以是以下之一:

  • U: 路线已上。
  • H:目标是一个主机,也是这条路由上唯一可能的目的地。
  • G:使用网关。
  • R:恢复动态路由的路由。
  • D: 由路由守护进程动态安装。
  • M:路由守护程序在收到 Internet 控制消息协议 (ICMP) 数据包时修改。
  • A:由自动 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:引用计数,即附加到套接字的进程数。
  • 组:多播组的名称或标识符。

街区的新孩子

route、ip、ifconfig 和 ss 命令可以提供很多 netstat 能够向您展示的内容。它们都是很棒的命令,值得一试。

我们专注于 netstat,因为它是普遍可用的,无论您使用的是哪种类 Unix 操作系统,即使是不知名的操作系统。

Linux Commands
Files tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc
Processes alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap
Networking netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld

RELATED: Best Linux Laptops for Developers and Enthusiasts

©2015-2025 艾丽卡 support@alaica.com