netstat 命令详解

| 选择喜欢的代码风格  

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

netstat 命令安装:


-bash: netstat: command not found

#Debian
apt-get install net-tools

#Ubuntu
apt-get install net-tools

#Alpine
apk add net-tools

#Arch Linux
pacman -S net-tools

#Kali Linux
apt-get install net-tools

#CentOS
yum install net-tools

#Fedora
dnf install net-tools

#Raspbian
apt-get install net-tools

#Docker
docker run cmd.cat/netstat netstat

netstat 命令补充说明:


netstat 命令它用于查找网络中的问题并确定网络上的流量作为性能度量。用来打印 Linux 中网络系统的状态信息,可让你得知整个 Linux 系统的网络情况。

netstat 命令语法:


netstat [address_family_options] [--tcp|-t] [--udp|-u] [--raw|-w] 
        [--listening|-l] [--all|-a] [--numeric|-n] [--numeric-hosts] 
        [--numeric-ports] [--numeric-users] [--symbolic|-N] 
        [--extend|-e[--extend|-e]] [--timers|-o] [--program|-p] 
        [--verbose|-v] [--continuous|-c]

netstat {--route|-r} [address_family_options] [--extend|-e[--extend|-e]] 
        [--verbose|-v] [--numeric|-n] [--numeric-hosts] [--numeric-ports] 
        [--numeric-users] [--continuous|-c]

netstat {--interfaces|-i} [--all|-a] [--extend|-e[--extend|-e]] [--verbose|-v] 
        [--program|-p] [--numeric|-n] [--numeric-hosts] [--numeric-ports] 
        [--numeric-users] [--continuous|-c]

netstat {--groups|-g} [--numeric|-n] [--numeric-hosts] [--numeric-ports] 
        [--numeric-users] [--continuous|-c]

netstat {--masquerade|-M} [--extend|-e] [--numeric|-n] [--numeric-hosts] 
        [--numeric-ports] [--numeric-users] [--continuous|-c]

netstat {--statistics|-s} [--tcp|-t] [--udp|-u] [--raw|-w]

netstat {--version|-V}

netstat {--help|-h}

在上面的语法中,address_family_options 可以是以下选项的任意组合:

[-4] [-6] [--protocol={inet,unix,ipx,ax25,netrom,ddp}[,...]] [--unix|-x] 
[--inet|--ip] [--ax25] [--ipx] [--netrom] [--ddp]

netstat 命令选项:


-a或--all:显示所有连线中的Socket;
-A<网络类型>或--<网络类型>:列出该网络类型连线中的相关地址;
-c或--continuous:持续列出网络状态;
-C或--cache:显示路由器配置的快取信息;
-e或--extend:显示网络其他相关信息;
-F或--fib:显示FIB;
-g或--groups:显示多重广播功能群组组员名单;
-h或--help:在线帮助;
-i或--interfaces:显示网络界面信息表单;
-l或--listening:显示监控中的服务器的Socket;
-M或--masquerade:显示伪装的网络连线;
-n或--numeric:直接使用ip地址,而不通过域名服务器;
-N或--netlink或--symbolic:显示网络硬件外围设备的符号连接名称;
-o或--timers:显示计时器;
-p或--programs:显示正在使用Socket的程序识别码和程序名称;
-r或--route:显示Routing Table;
-s或--statistice:显示网络工作信息统计表;
-t或--tcp:显示TCP传输协议的连线状况;
-u或--udp:显示UDP传输协议的连线状况;
-v或--verbose:显示指令执行过程;
-V或--version:显示版本信息;
-w或--raw:显示RAW传输协议的连线状况;
-x或--unix:此参数的效果和指定"-A unix"参数相同;
--ip或--inet:此参数的效果和指定"-A inet"参数相同。

netstat 命令实例


#netstat 列出所有端口 (包括监听和未监听的)
netstat -a     #列出所有端口
netstat -at    #列出所有tcp端口
netstat -au    #列出所有udp端口 

#netstat 列出所有处于监听状态的 Sockets
netstat -l        #只显示监听端口
netstat -lt       #只列出所有监听 tcp 端口
netstat -lu       #只列出所有监听 udp 端口
netstat -lx       #只列出所有监听 UNIX 端口

#netstat 显示每个协议的统计信息
netstat -s    显示所有端口的统计信息
netstat -st   显示TCP端口的统计信息
netstat -su   显示UDP端口的统计信息
netstat -pt  

netstat -p 可以与其它开关一起使用,就可以添加 “PID/进程名称” 到 netstat 输出中,这样 debugging 的时候可以很方便的发现特定端口运行的程序。

在 netstat 输出中不显示主机,端口和用户名 (host, port or user),当你不想让主机,端口和用户名显示,使用 netstat -n。将会使用数字代替那些名称。同样可以加速输出,因为不用进行比对查询

netstat -an

#如果只是不想让这三个名称中的一个被显示,使用以下命令:
netstat -a --numeric-ports
netstat -a --numeric-hosts
netstat -a --numeric-users

持续输出 netstat 信息:

netstat -c        #每隔一秒输出网络信息
netstat --verbose #显示系统不支持的地址族(Address Families),如:
---------------
unix  2      [ ]         DGRAM                    14153    
netstat: no support for `AF IPX' on this system.
netstat: no support for `AF AX25' on this system.
netstat: no support for `AF X25' on this system.
netstat: no support for `AF NETROM' on this system.

netstat 命令详细说明


/[正则表达式]/   #匹配文本样式,比如/SERVER/,从第一行到包含SERVER的匹配行。
{*}              #表示根据匹配重复执行分割,直到文件尾停止,使用{整数}的形式指定分割执行的次数。
-s               #静默模式,不打印其他信息。
-n               #指定分割后的文件名后缀的数字个数。比如01、02、03等。
-f               #指定分割后的文件名前缀。
-b               #指定后缀格式。比如%02d.log,类似于C语言中的printf参数格式。
rm server00.log  #是删除第一个文件,因为分割后的的第一个文件没有内容,匹配的单词就位于文件的第一行中。

netstat 显示核心路由信息

$ netstat -r

Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         gateway         0.0.0.0         UG        0 0          0 eth0
169.254.169.0   gateway         255.255.255.0   UG        0 0          0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0

#使用 netstat -rn 显示数字格式,不查询主机名称。
$ netstat -rn

Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG        0 0          0 eth0
169.254.169.0   192.168.1.1     255.255.255.0   UG        0 0          0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0

netstat 找出程序运行的端口

#netstat 并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息。
(No info could be read for "-p": geteuid()=1004 but you should be root.)

netstat -ap | grep ssh

netstat 找出运行在指定端口的进程

netstat -an | grep ':80'

#netstat 分组查看各种连接状态
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

LAST_ACK 15 (正在等待处理的请求数) 
SYN_RECV 3  
ESTABLISHED 50 (正常数据传输状态) 
FIN_WAIT2 5
TIME_WAIT 3173 (处理完毕,等待超时结束的请求数)

#netstat 收集有关端口 80 上活动连接数的统计信息,并将此数据传递给 wc 命令,
#该命令通过计算原始 netstat 输出的行来显示连接数。
netstat -an |grep :80 | wc -l

#netstat 通过端口找进程 ID
netstat -anp|grep 8081 | grep LISTEN|awk '{printf $7}'|cut -d/ -f1

显示网络接口列表

netstat -i

#netstat 显示详细信息 ifconfig 使用 netstat -ie

netstat 命令 IP 和 TCP 分析:


netstat 查看连接某服务端口最多的的 IP 地址:

netstat -ntu | grep :80 | awk '{print $5}' | cut -d: -f1 | awk '{++ip[$1]} END {for(i in ip) print ip[i],"\t",i}' | sort -nr

netstat 查看 TCP 各种状态列表:

$ netstat -nt | grep -e 127.0.0.1 -e 0.0.0.0 -e ::: -v | awk '/^tcp/ {++state[$NF]} END {for(i in state) print i,"\t",state[i]}'
LAST_ACK         24
SYN_RECV         2
ESTABLISHED      59
FIN_WAIT1        7
FIN_WAIT2        13
TIME_WAIT        3292

netstat 查看 phpfpm 进程数,如果接近预设值,说明不够用,需要增加:

netstat -anpo | grep "php-fpm" | wc -l

在 Windows 下如何实现类似 Linux 汇总端口查询:


在 Windows 中,你可以使用类似于 Linux 下的 netstat 命令的方式来查看各端口的占用情况。具体做法是使用 PowerShell,并且结合 Select-Object 和 Group-Object 来实现端口的汇总显示。以下是一个示例:

Get-NetTCPConnection | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, State | Group-Object LocalPort | Format-Table Count, Name -AutoSize

这个命令使用 Get-NetTCPConnection 获取当前的 TCP 连接信息,然后通过 Select-Object 选择本地地址、本地端口、远程地址、远程端口和连接状态。接着使用 Group-Object 根据本地端口进行分组,最后通过 Format-Table 格式化输出,显示端口及其连接数量。

请注意,这个命令需要在管理员权限下运行,因为获取端口信息需要一定的权限。如果你发现没有获取到信息,可以尝试以管理员身份运行 PowerShell。

此外,你还可以使用 netstat 命令,但是需要使用一些参数来实现类似的效果。例如:

netstat -ano | Select-String 'LISTENING' | ForEach-Object { $_ -replace '\s+', ' ' } | Format-Table -AutoSize

============== Windows 下,将显示类似如下结果 =================
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1084
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:1080 0.0.0.0:0 LISTENING 7288
TCP 0.0.0.0:2179 0.0.0.0:0 LISTENING 3336
TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING 4440
TCP 0.0.0.0:7680 0.0.0.0:0 LISTENING 2056
TCP 0.0.0.0:33060 0.0.0.0:0 LISTENING 4440
TCP 0.0.0.0:49664 0.0.0.0:0 LISTENING 804
TCP 0.0.0.0:49665 0.0.0.0:0 LISTENING 1752
TCP 0.0.0.0:49666 0.0.0.0:0 LISTENING 1636
TCP 0.0.0.0:49668 0.0.0.0:0 LISTENING 948
TCP 0.0.0.0:49682 0.0.0.0:0 LISTENING 964
TCP 127.0.0.1:6379 0.0.0.0:0 LISTENING 8952
TCP 127.0.0.1:8680 0.0.0.0:0 LISTENING 4072
TCP 127.0.0.1:63169 0.0.0.0:0 LISTENING 7668
TCP 192.168.18.1:139 0.0.0.0:0 LISTENING 4
TCP 192.168.56.6:139 0.0.0.0:0 LISTENING 4
TCP [::]:80 [::]:0 LISTENING 4
TCP [::]:135 [::]:0 LISTENING 1084
TCP [::]:445 [::]:0 LISTENING 4
TCP [::]:1080 [::]:0 LISTENING 7288
TCP [::]:2179 [::]:0 LISTENING 3336
TCP [::]:3306 [::]:0 LISTENING 4440
TCP [::]:7680 [::]:0 LISTENING 2056
TCP [::]:33060 [::]:0 LISTENING 4440
TCP [::]:49664 [::]:0 LISTENING 804
TCP [::]:49665 [::]:0 LISTENING 1752
TCP [::]:49666 [::]:0 LISTENING 1636
TCP [::]:49668 [::]:0 LISTENING 948
TCP [::]:49682 [::]:0 LISTENING 964
TCP [::1]:49980 [::]:0 LISTENING 8212

这个命令使用 netstat -ano 获取所有网络连接和监听端口的信息,然后使用 Select-String 'LISTENING' 仅选择处于监听状态的端口。接着,ForEach-Object 用于将多个空格替换为单个空格,最后使用 Format-Table 格式化输出。同样,需要以管理员权限运行 PowerShell 才能获取完整信息。

在 Mac 下如何实现类似 Linux 汇总端口查询:


在 macOS 上,netstat 命令的使用方式略有不同,而 -nlpt 选项也需要进行一些调整。以下是在 macOS 上获取类似于 Linux netstat -nlpt 的端口占用信息的方法:

sudo lsof -i -P -n | grep LISTEN

这个命令使用 lsof(List Open Files)工具,通过 -i 选项查看网络连接信息,-P 禁用端口和服务名的解析,-n 禁止将网络地址转换为主机名,最后通过 grep LISTEN 筛选处于监听状态的端口。请注意,由于涉及到系统信息和网络连接,可能需要使用 sudo 获取足够的权限

此外,也可以使用 ss 命令来查看网络套接字信息,但请注意 macOS 并没有完全采用 Linux 版本的 ss 命令,因此具体选项可能有所不同

sudo ss -l -n -t -p

这个命令使用 -l 显示监听状态的套接字,-n 禁用名称解析,-t 仅显示 TCP 套接字,-p 显示进程信息。

扩展:Windows 下查看连接数的工具:


默认 Windows 下查看连接数不如 Linux 方便,微软官方出了一个小工具辅助查看:TCPViewer -> https://learn.microsoft.com/zh-tw/sysinternals/downloads/tcpview,如果是叫新版的 Win 下,可以使用 PowerShell 来获取服务器的并发连接数。如,使用 Get-NetTCPConnection | Measure-Object 来获取 TCP 连接数,或者使用 Get-NetTCPConnection -State Established | Measure-Object 来获取特定状态的连接数。

Get-NetTCPConnection -State Established | Measure-Object


Count    : 93
Average  :
Sum      :
Maximum  :
Minimum  :
Property :

netstat 命令扩展阅读:




netstat 命令评论