netstat是一个控制台命令,可用于监控本机的TCP/IP网络,获得路由表、网络连接以及所有网络接口设备的状态信息。一般情况下,我们主要使用netstat命令显示与IP、TCP、UDP和ICMP协议相关的统计数据,检验本机各端口的网络连接情况。

比如说,在日常使用电脑时,如果连接到了网络,或多或少的会因接收到的数据包导致出错数据或故障,在正常量的情况下,TCP/IP可以容许这些类型的错误,并且能够自动重新发送数据包。但是如果累计的出错情况数占所接收IP数据报的百分比过大,而且数目还在不断增加,那么我们就要进入控制台,使用netstat命令查看一下出现问题的连接端口。

netstat结果详解

[root@honey-master ~] netstat
------------------------------------------------------------------------------------|
Active Internet connections (w/o servers)                                           |
Proto Recv-Q Send-Q Local Address           Foreign Address         State           |
tcp        0      0 honey-ma:xmltec-xmlmail honey-master:44714      ESTABLISHED     |
tcp        0      0 honey-master:postgres   honey-master:46680      ESTABLISHED     |
tcp        0      0 honey-master:41756      honey-master:redis      ESTABLISHED     |
tcp        0      0 honey-master:42726      honey-master:redis      ESTABLISHED     | 
tcp        0      0 localhost:39230         localhost:redis         ESTABLISHED     |
..                                                                                  |
tcp6       0      0 honey-master:mysql      honey-master:58232      ESTABLISHED     |
tcp6       0      0 localhost:mysql         localhost:53266         ESTABLISHED     |
tcp6       0      0 honey-master:mysql      honey-master:58446      ESTABLISHED     |
udp        0      0 honey-master:bootpc     _gateway:bootps         ESTABLISHED     |
udp        0      0 localhost:55920         localhost:55920         ESTABLISHED     |
------------------------------------------------------------------------------------|---------------|
Active UNIX domain sockets (w/o servers)                                                            |
Proto RefCnt Flags       Type       State         I-Node   Path                                     |
unix  3      [ ]         DGRAM                    1703     /run/systemd/notify                      |
unix  2      [ ]         DGRAM                    1705     /run/systemd/cgroups-agent               |
...                                                                                                 |
unix  3      [ ]         STREAM     CONNECTED     29975    /run/systemd/journal/stdout              |
unix  3      [ ]         STREAM     CONNECTED     1543565  /var/run/docker.sock                     |
unix  3      [ ]         STREAM     CONNECTED     323733                                            |
unix  3      [ ]         STREAM     CONNECTED     189654                                            |
----------------------------------------------------------------------------------------------------|
Active Bluetooth connections (w/o servers)
Proto  Destination       Source            State         PSM DCID   SCID      IMTU    OMTU Security
Proto  Destination       Source            State     Channel

从整体上看,netstat的输出结果可以分为两个部分:

一个是Active Internet connections,称为有源TCP连接,其中"Recv-Q"和"Send-Q"指的是接收队列和发送队列。这些数字一般都应该是0。如果不是则表示软件包正在队列中堆积。这种情况只能在非常少的情况见到。

另一个是Active UNIX domain sockets,称为有源Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。
Proto显示连接使用的协议,RefCnt表示连接到本套接口上的进程号,Types显示套接口的类型,State显示套接口当前的状态,Path表示连接到套接口的其它进程使用的路径名。

列出所有的tcp和udp端口:

image-20220522180200247

字段 含义
proto 协议名称:tcp/udp
Recv-Q 网络接收队列:表示收到的数据已经在本地接收缓冲,但是还有多少没有被进程取走,recv()如果接收队列Recv-Q一直处于阻塞状态,可能是遭受了拒绝服务 denial-of-service 攻击。
Send-Q 网络发送队列:对方没有收到的数据或者说没有Ack的,还是本地缓冲区,如果发送队列Send-Q不能很快的清零,可能是有应用向外发送数据包过快,或者是对方接收数据包不够快。这两个值通常应该为0,如果不为0可能是有问题的。packets在两个队列里都不应该有堆积状态。可接受短暂的非0情况。从步骤一的结果可以看到22端口对应的链路的send-Q中堆积了大量的数据包,可以判定是发送数据给目的地址的时候出现了阻塞的问题,导致了包堆积在本地缓存中,不能成功发出去。
Local-address 表格下分析
Foreign Address 与本机端口通信的外部socket。显示规则与Local Address相同
State 表格下分析
PID/program PID即进程id,Program即使用该socket的应用程序。其中0.0.0.0:1234——本地IP/Port信息。
1、0.0.0.0代表本机上可用的任意地址。比如0.0.0.0:1234表示本机上所有地址的1234端口,这样ip计算机就不用重复显示了。
2、0.0.0.0为默认路由,即要达到不在路由表里面的网段的包都走0.0.0.0这条规则。气死,我们可以"通用"理解为代表"本机地址",1234在程序中体现为绑定的1234端口号 0.0.0.0: *——目的地址IP/Port信息。

Local Address

  1. 部分0.0.0.0:22表示监听服务器上所有的ip地址上的22端口

  2. :::22 这个也表示监听本地所有ip的22端口,跟上面的区别是这里表示的是IPv6地址,上面的0.0.0.0表示的是本地所有IPv4地址NOTE “:::”这三个:的前两个"::",是"0:0:0:0:0:0:0"的缩写,相当于IPv6的"0.0.0.0",就是本机的所有IPv6地址,第三个:是IP和端口的分隔符

  3. 127.0.0.1:3310 这个表示监听本机的loopback地址的3310端口(如果某个服务只监听了回环地址,那么只能在本机进行访问,无法通过tcp/ip 协议进行远程访问)

  4. ::1:323 这个表示监听IPv6的回环地址的323端口,::1表示IPv6的loopback地址

State 列共有12中可能的状态,前面11种是按照TCP连接建立的三次握手和TCP连接断开的四次挥手过程来描述的。

符号 状态解释
LISTEN 首先服务器要打开一个socket进行监听,状态为LISTEN
the socket is listening for incoming connections
SYN_SENT 客户端通过应用程序调用connect进行active open,于是客户端tcp发送一个SYN以请求建立一个链接,之后状态设置为SYN_SENT
socket is actively attempting to establish a connection
SYN_RECV 服务端发出ACk确认包给客户端,状态变为SYN_RECV
a connection request has been received from the network
ESTABLISHED 代表打开一个连接,双方可以进行或者已经在数据交互了
the socket has an established connection
FIN_WAIT1 主动关闭服务端应用程序,tcp发送FIN请求关闭连接,之后进入FIN_WAIT1状态
the socket is closed, and the connection is shutting down.
CLOSE_WAIT 被动关闭,服务端接收到FIN请求后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT状态
the remote end has shut down, waiting for the socket to close
FIN_WAIT2 主动关闭接收到ACK后,就进入了FIN_WAIT2状态
connection is closed, and the socket is waitng for a shut down from the remote end.
LAST_ACK 服务端关闭一段时间后,接收到文件结束符的应用程序将调用CLOSE关闭连接,这导致发送一个等待原来向服务端发送连接中断请求的确认FIN,死后进入LAST_ACK
the remote end has shut down, and the socket is closed. Waiting for anknowledgement.
TIME_WAIT 在主动关闭端接收到FIN后,就会向对方发送ACk确认包,并进入TIME_WAIT状态。
the socket is waiting after close to handle packets still in the networks.
CLOSING both sockets are shutting down but we still don't have all our data sent
CLOSED 连接结束
UNKNOWN 未知的状态

参数

-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"参数相同。
  • 列出所有端口情况

    [root@xiesshavip002 ~] netstat -a      # 列出所有端口
    [root@xiesshavip002 ~] netstat -at     # 列出所有TCP端口
    [root@xiesshavip002 ~] netstat -au     # 列出所有UDP端口
    
  • 列出所有处于监听状态的 Sockets

    [root@xiesshavip002 ~] netstat -l   # 只显示监听端口
    [root@xiesshavip002 ~] netstat -lt  # 显示监听TCP端口
    [root@xiesshavip002 ~] netstat -lu  # 显示监听UDP端口
    [root@xiesshavip002 ~] netstat -lx  # 显示监听UNIX端口
    
  • 显示每个协议的统计信息 -s

    [root@xiesshavip002 ~] netstat -s     # 显示所有端口的统计信息
    [root@xiesshavip002 ~] netstat -st    # 显示所有TCP的统计信息
    [root@xiesshavip002 ~] netstat -su    # 显示所有UDP的统计信息
    IcmpMsg:
        InType3: 8623
        OutType3: 791533
    Udp:
        2478625 packets received
        1946 packets to unknown port received
        0 packet receive errors
        2482843 packets sent
        0 receive buffer errors
        0 send buffer errors
        IgnoredMulti: 21772
    UdpLite:
    IpExt:
        InBcastPkts: 48838
        InOctets: 36060130596
        OutOctets: 17220772176
        InBcastOctets: 6912337
        InNoECTPkts: 99499687
        InECT0Pkts: 14447
    
  • 显示 PID 和进程名称 -p

    [root@honey-master ~]# netstat -p
    Active Internet connections (w/o servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 honey-ma:xmltec-xmlmail honey-master:44714      ESTABLISHED 173272/java         
    tcp        0      0 honey-master:postgres   honey-master:46680      ESTABLISHED 211809/postgres: po 
    tcp        0      0 honey-master:41756      honey-master:redis      ESTABLISHED 207937/python3      
    tcp        0      0 honey-master:42726      honey-master:redis      ESTABLISHED 357854/python3      
    
    
  • 显示核心路由信息 -r

    [root@honey-master ~]# netstat -r
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
    default         _gateway        0.0.0.0         UG        0 0          0 ens33
    10.0.0.0        0.0.0.0         255.255.255.248 U         0 0          0 br-9dff81edda62
    10.0.106.0      0.0.0.0         255.255.255.0   U         0 0          0 ens33
    172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 docker0
    [root@honey-master ~]# netstat -rn #显示数字格式,不查询主机域名
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
    0.0.0.0         10.0.106.1      0.0.0.0         UG        0 0          0 ens33
    10.0.0.0        0.0.0.0         255.255.255.248 U         0 0          0 br-9dff81edda62
    10.0.106.0      0.0.0.0         255.255.255.0   U         0 0          0 ens33
    172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 docker0
    172.18.0.0      0.0.0.0         255.255.0.0     U         0 0          0 br-b570432f3378
    
    
  • 查看端口和服务 -antp

    [root@honey-master ~] netstat -antp | grep ssh
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      141882/sshd         
    tcp        0    156 10.0.106.19:22          10.0.91.13:65533        ESTABLISHED 447311/sshd: root [ 
    tcp6       0      0 :::22                   :::*                    LISTEN      141882/sshd         
    [root@honey-master ~]# netstat -antp | grep 5432
    tcp        0      0 0.0.0.0:5432            0.0.0.0:*               LISTEN      132952/postmaster   
    tcp        0      0 10.0.106.19:5432        10.0.106.19:46680       ESTABLISHED 211809/postgres: po 
    tcp        0      0 10.0.106.19:5432        172.17.0.2:53512        ESTABLISHED 342190/postgres: po 
    
  • 打印网络接口 -i

    [root@honey-master ~] netstat -i
    Kernel Interface table
    Iface             MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
    br-9dff81edda62  1500 14994174      0      0 0      11310667      0      0      0 BMU
    br-b570432f3378  1500 52444002      0      0 0      52444002      0      0      0 BMRU
    docker0          1500 14994174      0      0 0      11310667      0      0      0 BMRU
    ens33            1500 32370072      0      0 0      18948958      0      0      0 BMRU
    

    上面输出的信息比较原始。我们将 -e 选项和 -i 选项搭配使用,可以输出用户友好的信息。输出效果等同于ifconfig。

  • 显示多播组信息 -g

    [root@honey-master ~]# netstat -g
    IPv6/IPv4 Group Memberships
    Interface       RefCnt Group
    --------------- ------ ---------------------
    lo              1      all-systems.mcast.net
    ens33           1      all-systems.mcast.net
    docker0         1      all-systems.mcast.net
    lo              1      ff01::1
    ens33           1      ff02::1
    ens33           1      ff01::1
    docker0         1      ff02::1
    
  • 打印active状态的连接:active 状态的套接字连接用 "ESTABLISHED" 字段表示,所以我们可以使用 grep 命令获得 active 状态的连接:

    image-20220522184725502

    配合 watch 命令监视 active 状态的连接:`watch -d -n0 ""

    image-20220522184824406

  • 查看服务是否在运行

    [root@honeypot ~]# netstat -aple | grep nginx
    tcp        0      0 0.0.0.0:http            0.0.0.0:*               LISTEN      root       42158      3359/nginx: master  
    tcp        0      0 0.0.0.0:81              0.0.0.0:*               LISTEN      root       42160      3359/nginx: master  
    tcp        0      0 0.0.0.0:https           0.0.0.0:*               LISTEN      root       42159      3359/nginx: master  
    tcp        0      0 honeypot:https          10.0.80.6:46770         ESTABLISHED nginx      1406865    3360/nginx: worker  
    

    说明nginx正在运行,但如果关闭掉redis服务,状态都变成了关闭或者等待关闭

    [root@honeypot ~] netstat -aple | grep redis
    tcp        1      0 honeypot:41338          honeypot:redis          CLOSE_WAIT  root       73035      8683/python3        
    tcp        1      0 honeypot:32926          honeypot:redis          CLOSE_WAIT  root       1467648    159493/python3      
    tcp        0      0 honeypot:redis          honeypot:41332          FIN_WAIT2   root       0          -                   
    tcp        1      0 honeypot:41376          honeypot:redis          CLOSE_WAIT  root       73107      8822/python3        
    tcp        0      0 localhost:redis         localhost:47240         TIME_WAIT   root       0          -                   
    

组合命令

  • 查看TCP连接状态

    [root@honeypot ~]# netstat -nat |awk '{print $6}' |sort|uniq -c|sort -rn
        174 ESTABLISHED
         35 TIME_WAIT
         31 LISTEN
         26 CLOSE_WAIT
          1 established)
          1 Foreign
    
  • 查找请求数请20个IP

    [root@honeypot ~]# netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20
    先把状态全都取出来,然后使用uniq -c统计,之后再进行排序。
         15 127.0.0.1
          4 10.0.81.29
          3 10.0.81.35
          3 10.0.80.6
          2 0.0.0.0
          1 
    
  • 查看连接某服务端口最多的的IP地址

    [root@honeypot ~]# netstat -nat | grep "10.0.81.29:22" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20
          1 10.0.91.13
    
内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/ivanlee717/p/16298654.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!