netstat命令详解

netstat网络连接分析工具

工具说明:

netstat 是一款命令行工具,主要是用于列出系统上所有的网络套接字连接情况,包括 tcp, udp 以及 unix 套接字,另外它还能列出处于监听状态(即等待接入请求)的套接字。除此之外,netstat 命令还可用于显示路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等。

一个正常的TCP连接,都会有三个阶段:1、TCP三次握手;2、数据传送;3、TCP四次挥手

如图:

python 复制代码
1:SYN:(同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手建立TCP连接时有效。表示一个新的TCP连接请求。
2:ACK:(确认编号,Acknowledgement Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收所有数据。
3:FIN:(结束标志,FINish)用来结束一个TCP回话.但对应端口仍处于开放状态,准备接收后续数据。
4:LISTEN:首先服务端需要打开一个socket进行监听,状态为LISTEN, The socket is listening for incoming connections. 侦听来自远方TCP端口的连接请求 。
5:SYN_SENT:客户端通过应用程序调用connect进行active open.于是客户端tcp发送一个SYN以请求建立一个连接,之后状态置为SYN_SENT,The socket is actively attempting to establish a connection. 在发送连接请求后等待匹配的连接请求。
6:SYN_RECV:服务端应发出ACK确认客户端的SYN,同时自己向客户端发送一个SYN, 之后状态置为SYN_RECV ,
A connection request has been received from the network. 在收到和发送一个连接请求后等待对连接请求的确认 。
7:ESTABLISHED:代表一个打开的连接,双方可以进行或已经在数据交互了, The socket has an established connection. 代表一个打开的连接,数据可以传送给用户。
8:FIN_WAIT1:主动关闭(active close)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,之后进入FIN_WAIT1状态。 The socket is closed, and the connection is shutting down. 等待远程TCP的连接中断请求,或先前的连接中断请求的确认。
9:CLOSE_WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT, The remote end has shut down, waiting for the socket to close. 等待从本地用户发来的连接中断请求 。
10:FIN_WAIT2:主动关闭端接到ACK后,就进入了FIN-WAIT-2 , Connection is closed, and the socket is waiting for a shutdown from the remote end. 从远程TCP等待连接中断请求。
11:LAST_ACK:被动关闭端一段时间后,接收到文件结束符的应用程序将调用CLOSE关闭连接。这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK , The remote end has shut down, and the socket is closed. Waiting for acknowledgement. 等待原来发向远程TCP的连接中断请求的确认。
12:TIME_WAIT:在主动关闭端接收到FIN后,TCP就发送ACK包,并进入TIME-WAIT状态。 The socket is waiting after close to handle packets still in the network.等待足够的时间以确保远程TCP接收到连接中断请求的确认。
13:CLOSING:比较少见, Both sockets are shut down but we still don't have all our data sent. 等待远程TCP对连接中断的确认。
14:CLOSED: 被动关闭端在接受到ACK包后,就进入了closed的状态。连接结束, The socket is not being used. 没有任何连接状态。

14:TIME_WAIT状态的形成只发生在主动关闭连接的一方。主动关闭方在接收到被动关闭方的FIN请求后,发送成功给对方一个ACK后,将自己的状态由FIN_WAIT2修改为TIME_WAIT,而必须再等2倍 的MSL(Maximum Segment Lifetime,MSL是一个数据报在internetwork中能存在的时间)时间之后双方才能把状态 都改为CLOSED以关闭连接。目前RHEL里保持TIME_WAIT状态的时间为60秒。

一:安装netstat命令

1:yum install net-tools -y

2:netstat参数

python 复制代码
-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"参数相同。

二:使用方法

1: Active Internet connections

有源TCP连接,UDP连接。

python 复制代码
======================== TCP CLIENT ===================================================
[root@localhost ~]# netstat -tnp | more
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 127.0.0.1:3050              127.0.0.1:32795             ESTABLISHED 3161/fbserver
tcp        0      0 10.228.90.11:22             10.41.166.94:58005          ESTABLISHED 13824/sshd
tcp        0      0 10.228.90.11:49168          10.41.103.97:443            TIME_WAIT   -
tcp        0  13032 10.228.90.11:8002           10.228.90.5:11111           ESTABLISHED 6738/./tcp_client
...
 
======================== TCP SERVER ===================================================
[root@localhost ~]# netstat -anplt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp    89768      0 10.228.90.5:11111           10.228.90.11:8002           ESTABLISHED 29561/./tcp_server
...

recv-Q:网络接收队列

表示收到的数据已经在本地接收缓冲,但是还有多少没有被进程取走,recv()如果接收队列Recv-Q一直处于阻塞状态,可能是遭受了拒绝服务 denial-of-service 攻击;

send-Q:网路发送队列

本地没有发生的数据,如果发送队列Send-Q不能很快的清零,可能是有应用向外发送数据包过快,或者是对方接收数据包不够快;

这两个值通常应该为0,如果不为0可能是有问题的。packets在两个队列里都不应该有堆积状态。可接受短暂的非0情况。如图上所示,TCP SERVER 没有读取 TCP CLIENT 发来的数据。因为

收到的数据Recv-Q一直处于阻塞状态,因此本地服务没有及时读取接收到的数据。

2 :Active UNIX domain sockets

有源Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。查看unix接口命令如下:

python 复制代码
Proto RefCnt Flags       Type       State         I-Node Path
unix  12     [ ]         DGRAM                    10269  /dev/log
unix  2      [ ]         DGRAM                    7917   @/org/kernel/udev/udevd
unix  2      [ ]         DGRAM                    10481  @/org/freedesktop/hal/udev_event
unix  2      [ ]         DGRAM                    6939979
unix  2      [ ]         DGRAM                    6478837
unix  3      [ ]         STREAM     CONNECTED     6354883 /var/run/dbus/system_bus_socket
unix  3      [ ]         STREAM     CONNECTED     6354882
unix  3      [ ]         STREAM     CONNECTED     6255685 /var/run/dbus/system_bus_socket
unix  3      [ ]         STREAM     CONNECTED     6255684
unix  2      [ ]         DGRAM                    6255683
unix  2      [ ]         DGRAM                    5633176
 
  • Proto 显示连接使用的协议
  • RefCnt 表示连接到本套接口上的进程号
  • Types 显示套接口的类型
  • State 显示套接口当前的状态
  • Path 表示连接到套接口的其它进程使用的路径名

三:常用方法

python 复制代码
1 列出所有端口 (包括监听和未监听的)
列出所有端口 netstat -a
列出所有 tcp 端口 netstat -at
列出所有 udp 端口 netstat -au

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

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

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

5 在 netstat 输出中不显示主机,端口和用户名 (host, port or user)
当你不想让主机,端口和用户名显示,使用 netstat -n。将会使用数字代替那些名称。
同样可以加速输出,因为不用进行比对查询。
# netstat -an
如果只是不想让这三个名称中的一个被显示,使用以下命令
# netsat -a --numeric-ports
# netsat -a --numeric-hosts
# netsat -a --numeric-users

6 持续输出 netstat 信息
netstat 将每隔一秒输出网络信息。
# netstat -c

7 显示系统不支持的地址族 (Address Families)
netstat --verbose

8 显示核心路由信息 netstat -r
# netstat -r
注意: 使用 netstat -rn 显示数字格式,不查询主机名称。

[root@localhost ~]# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
80.80.80.0      0.0.0.0         255.255.255.0   U         0 0          0 eth8
10.228.90.0     0.0.0.0         255.255.255.0   U         0 0          0 eth9
1.1.0.0         0.0.0.0         255.255.255.0   U         0 0          0 tap0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth8
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth9
10.0.0.0        10.228.90.1     255.0.0.0       UG        0 0          0 eth9
0.0.0.0         1.1.0.3         0.0.0.0         UG        0 0          0 tap0


表头说明:

Destination:目标网络或者主机。
Gateway:网关地址,如果没有设置则为*。
Genmask:目标网络掩码;如果默认路由则用"0.0.0.0"。
Flags标志说明:
U Up表示此路由当前为启动状态
H Host,表示此网关为一主机
G Gateway,表示此网关为一路由器
R Reinstate Route,使用动态路由重新初始化的路由
D Dynamically,此路由是动态性地写入
M Modified,此路由是由路由守护程序或导向器动态修改! 表示此路由当前为关闭状态
Iface:对于这个路由,数据包将要发送到那个接口(网卡)。
3.9 找出程序运行的端口
并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息。
# netstat -ap | grep ssh
 
找出运行在指定端口的进程
# netstat -an | grep ':80'
3.10 显示网络接口列表
# netstat -i
显示详细信息,像是ifconfig 使用 netstat-ie
 
[root@localhost ~]# netstat -i
Kernel Interface table
Iface       MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth8       1500   0  9150807      0      0      0      128      0      0      0 BMRU
eth9       1500   0  9297220      0      0      0   144187      0      0      0 BMRU
eth12      1500   0   294871      0      0      0        6      0      0      0 BMRU
eth13      1500   0        0      0      0      0        6      0      0      0 BMRU
lo        16436   0 95290843      0      0      0 95290843      0      0      0 LRU
tap0       1500   0        0      0      0      0       48      0      0      0 BRU
tap0:1     1500   0      - no statistics available -                            BRU

说明:
    MTU和Met字段表示的是接口的MTU和度量值值;RX和TX这两列表示的是已经准确无误地收发了多少数据包( RX - OK / TX - OK)、产生了多少错误( RX-ERR/TX-ERR)、丢弃了多少包(RX-DRP/TX-DRP),由于误差而遗失了多少包(RX-OVR/TX-OVR);最后一列展示的是为这个接口设置的标记,在利用ifconfig显示接口配置时,这些标记都采用一个字母。它们的说明如下:

B 已经设置了一个广播地址。
L 该接口是一个回送设备。
M 接收所有数据包(混乱模式)。
N 避免跟踪。
O 在该接口上,禁用A R P。
P 这是一个点到点链接。
R 接口正在运行。
U 接口处于"活动"状态。

推荐参数:

1:查看tcp连接

netstat -nlpt

2:查看udp连接

netstat -alupn

3:TCP的11种主要状态:

python 复制代码
1:LISTEN(监听) : 服务器处于监听状态,等待客户端的连接请求。

2:SYN-SENT(同步已发送) : 客户端已发送一个连接请求(SYN,同步序列编号),正在等待服务器的响应。

3:SYN-RECEIVED(同步已接收) : 服务器已接收到客户端的连接请求,并发送了一个响应(SYN-ACK,同步和确认),正在等待客户端的最终确认。

4:ESTABLISHED(已建立) : 客户端和服务器之间的连接已成功建立,可以开始数据传输。

5:FIN-WAIT-1(终止等待1) : 发送方(客户端或服务器)已发送一个终止连接的请求(FIN,结束),但还在等待对方的确认。

6:FIN-WAIT-2(终止等待2) : 在FIN-WAIT-1之后,发送方收到了对方的确认,但还在等待对方发送的终止连接请求。

7:CLOSE-WAIT(关闭等待) : 接收方(客户端或服务器)已接收到对方的终止连接请求,但还没有发送自己的终止请求。

8:CLOSING(正在关闭) : 双方都已发送了终止连接的请求,但还没有完全关闭连接。

9:LAST-ACK(最后确认) : 发送方在收到对方的终止请求后,已发送了最终的确认,正在等待对方的连接完全关闭。

10:TIME-WAIT(时间等待) : 在发送方发送了最终的确认之后,会进入TIME-WAIT状态,等待一段时间(通常是2个最大段生命周期MSL),以确保对方能够接收到这个确认。

11:CLOSED(已关闭) : 连接已经完全关闭,没有任何数据传输正在进行。

四:统计tcp各种状态信息

  1. 找出程序运行的端口 #netstat -ap | grep ':80'

  2. 查看连接某服务端口最多的的IP地址(前20个)

    #netstat -nat | grep "10.1.62.23:443" |awk '{print 5}'|awk -F: '{print 1}'|sort|uniq -c|sort -nr|head -20

3.TCP各种状态列表

复制代码
#netstat -nat |awk '{print $6}'

4.统计数量

复制代码
#netstat -nat |awk '{print $6}'|sort|uniq -c

5.排序

复制代码
#netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn
#netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

6.直接统计tcp数量监听的数量

复制代码
#netstat -ant | wc -l
相关推荐
陈希1233 分钟前
Linux 防火墙配置实战:firewalld、iptables 与云安全组
linux·运维·服务器
女神下凡37 分钟前
芯参谋(95):嵌入式文件系统_开发指南
linux·服务器·arm开发·驱动开发·设计规范
@兽血沸腾1 小时前
Windows系统安装Jenkins部署应用至远程Windows服务器操作指南
运维·服务器·jenkins
承渊政道5 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
讯捷蓝达6 小时前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
数字新视界9 小时前
动环监控信创适配在智能机房管理中的应用价值与未来展望
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
爱和冰阔落9 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
lisanmengmeng10 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
严肃小白兔10 小时前
Cloudflare 更新 API Token 管理:从最小权限到自动化凭据安全
网络·安全·自动化
Android系统攻城狮10 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频