柴少的官方网站 技术在学习中进步,水平在分享中升华

linux网络监控之netstat详解

一、介绍

1.1 简介

       netstat 是一款命令行工具,可用于列出系统上所有的网络套接字连接情况,包括 tcp, udp 以及 unix 套接字,另外它还能列出处于监听状态(即等待接入请求)的套接字。如果你想确认系统上的 Web 服务有没有起来,你可以查看80端口有没有打开。以上功能使 netstat 成为网管和系统管理员的必备利器。

       如果没有此工具就#yum install net-tools -y


1.2 格式

netstat [-vWeenNcCF] [<Af>] -r        

netstat {-V|--version|-h|--help}
netstat [-vWnNcaeol] [<Socket> ...]
netstat { [-vWeenNac] -I[<Iface>] | [-veenNac] -i | [-cnNe] -M | -s [-6tuw] } [delay]

地址组的选项:

       <Socket>={-t|--tcp} {-u|--udp} {-U|--udplite} {-w|--raw} {-x|--unix}--ax25 --ipx --netrom

        <AF> =使用'-6 | -4'或'-A <af>'或' - <af>';默认值:inet

      可能的地址族列表(支持路由):

      inet(DARPA Internet)inet6(IPv6)ax25(AMPR AX.25)netrom(AMPR NET / ROM)ipx(Novell IPX)ddp(Appletalk DDP)x25(CCITT X.25)

      [-4|--inet]  [-6|--inet6]  [--protocol={inet,inet6,unix,ipx,ax25,netrom,ddp,  ...  }  ]  [--unix|-x]  [--inet|--ip|--tcpip]  [--ax25]  [--x25]  [--rose]  [--ash]  [--ipx]  [--netrom]  [--ddp|--appletalk] [--econet|--ec]
虽然man里面说:这个程序已经过时了。 netstat的替换是ss。 netstat -r的替换是ip route。 netstat -i的替换是ip -s link。 netstat -g的替换是ip maddr。但是netstat还是常用的工具之一。

Netstat打印有关Linux网络子系统的信息。 打印的信息类型由第一个参数控制,如下所示:

(none): 默认情况下,netstat显示打开的套接字列表。 如果不指定任何地址族,则会打印所有已配置地址族的活动套接字。

--route , -r:显示内核路由表。  netstat -r和route -e产生相同的输出。

--groups , -g:显示IPv4和IPv6的组播组成员关系信息。

 --interfaces=iface , -I=iface , -i:显示所有网络接口或指定的iface的表。

--masquerade , -M:显示伪装连接的列表。

--statistics , -s:显示每个协议的摘要统计信息。


1.3 选项:

--verbose , -v:告诉用户发生的事情是冗长的。 特别打印一些有关未配置地址族的有用信息。

--wide , -W: 不要使用根据需要的宽度来截断IP地址。 这是现在不可破坏现有脚本的可选项。

--numeric , -n: 显示数字地址,而不是尝试确定符号主机,端口或用户名。

--numeric-hosts:显示数字主机地址,但不影响端口或用户名称的解析。

--numeric-ports:显示数字端口号,但不影响主机或用户名称的分辨率。

--numeric-users:显示数字用户ID,但不影响主机或端口名称的解析。

--protocol=family , -A: 指定要显示连接的地址族(可能更好地描述为低级协议)。家庭是一个逗号(',')分隔的地址家族关键字列表,如inet,inet6,unix,ipx,ax25,netrom,econet和ddp。这与使用--inet | -4,--inet6 | -6,--unix | -x,--ipx,--ax25,--netrom和--ddp选项的效果相同。地址族inet(Iv4)包括raw,udp,udplite和tcp协议套接字。
-c, --continuous:这将导致netstat每秒连续打印所选信息。

-e, --extend:显示其他信息。使用此选项两次以获得最大的细节。

-o, - timers: 包括与网络计时器相关的信息。

-p, --program: 显示每个套接字所属程序的PID和名称。

 -l, --listening:仅显示侦听套接字。 (默认情况下省略)

 -a, --all: 显示监听和非监听(对于TCP这意味着已建立的连接)套接字。使用--interfaces选项,显示未启动的接口。

-F:从FIB打印路由信息。 (这是默认值。)

-C:从路由缓存打印路由信息。

-N,-symbolic : 解析硬件名称

-Z,--context : 显示套接字的SELinux安全上下文

delay: Netstat将每秒钟延迟一次统计数据。


1.4 涉及到的文件:

       /etc/services - 服务翻译文件
       /proc - proc文件系统的安装点,它通过以下文件访问内核状态信息。
       /proc/net/dev - 设备信息
       /proc/net/ raw - 原始套接字信息
       /proc/net/tcp-TCP套接字信息
       /proc/net/udp - UDP套接字信息
       /proc/net/udplite - UDPLite套接字信息
       /proc/net/igmp - IGMP组播信息
       /proc/net/unix - Unix域套接字信息
       /proc/net/ipx - IPX套接字信息
       /proc/net/ax25 - AX25套接字信息
       /proc/net/appletalk - DDP(appletalk)套接字信息
       /proc/net/nr - NET / ROM套接字信息
       /proc/net/route - IP路由信息
       /proc/net/ax25_route - AX25路由信息
       /proc/net/ipx_route - IPX路由信息
       /proc/net/nr_nodes - NET / ROM nodelist
        /proc/net/nr_neigh - NET / ROM邻居
       /proc/net/ip_masquerade - 伪装的连接
       /proc/net/snmp - 统计


博文来自:www.51niux.com

二、示例

2.1 默认选项

# netstat
Active Internet connections (w/o servers)   #这里是TCP和UDP的连接
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0     52 localhost.localdoma:ssh 192.168.1.107:50007     ESTABLISHED
udp        0      0 localhost.localdo:34545 marla.ludost.net:ntp    ESTABLISHED
Active UNIX domain sockets (w/o servers)  
#活动UNIX域套接字

Proto RefCnt Flags       Type       State         I-Node   Path   #Proto:套接字使用的协议(通常为unix)。

unix  2      [ ]         DGRAM                    10248    /run/systemd/notify
unix  2      [ ]         DGRAM                    10250    /run/systemd/cgroups-agent
unix  6      [ ]         DGRAM                    10271    /run/systemd/journal/socket

#Proto:显示套接字使用的协议(tcp,udp,udpl,raw)。

#Recv-Q:接受队列。

#Send-Q:发送队列。

#Local Address:套接字的本端的地址和端口号。 除非指定了--numeric(-n)选项,否则套接字地址被解析为其规范主机名(FQDN),端口号被翻译进入相应的服务名称。

#Foreign Address:套接字远端的地址和端口号。 类似于“本地地址”。

#State:套接字的状态。 由于在原始模式下没有状态,并且通常在UDP和UDPLite中不使用状态,因此该列可能留空。

#State:显示套接口当前的状态,状态如下:

             ESTABLISHED:套接字已经建立。

             SYN_SENT:套接字正在尝试建立连接。

             SYN_RECV: 已从网络接收到连接请求。

             FIN_WAIT1:等待远程TCP连接中断请求,或先前的连接中断请求的确认。

             FIN_WAIT2:连接已关闭,并且套接字正在等待从远端关闭。

             TIME_WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认。

             CLOSE:没有任何连接状态。

             CLOSE_WAIT:远程端已关闭,等待套接字关闭。

             LAST_ACK:等待原来的发向远程TCP的连接中断请求的确认。

             LISTEN:侦听来自远方的TCP端口的连接请求。

             CLOSING:等待远程TCP对连接中断的确认。

             UNKNOWN:套接字的状态是未知的。

#RefCnt:引用计数(即通过此套接字连接的进程)。

#Type : 类型。有几种类型的套接字访问:

              SOCK_DGRAM: 套接字用于Datagram(无连接)模式。
              SOCK_STREAM:这是一个流(连接)套接字。

              SOCK_RAW:  套接字用作原始套接字。

              SOCK_RDM:这一个提供可靠地传递的消息。

              SOCK_SEQPACKET:这是一个顺序包套接字。

              SOCK_PACKET:原始接口访问套接字。

              SOCK_PACKET:未知。

#State:状态。此字段将包含以下关键字:

              FREE : 套接字未分配.

              LISTENING : 套接字正在侦听连接请求。 如果指定--listening(-l)或--all(-a)选项,则这些套接字仅包含在输出中。
              CONNECTING: 套接字即将建立连接。

              CONNECTED:套接字已连接。

              DISCONNECTING:套接字正在断开连接。

              空:套接字没有连接。

              UNKNOWN:未知状态,这个状态永远不会发送。    

#Path:这是连接到套接字的对应进程的路径名。


2.2 显示主机路由表

# netstat  -r n    #和netstat --route -n 一样。加上-n就是让其是IP的形式协议而不进行解析。
图片.png
#Destination:指定作为路由目标端点的主机。

#Gateway:指定用于转发包的网关。

#Genmask:网络掩码

#Flags:标志。可能的标志包括:

               U(路线上)
               H(目标是主机)
               G(使用网关)
               R(恢复动态路由路由)
               D(由守护进程或重定向动态安装)
               M(从路由守护进程或重定向修改)
               A(由addrconf安装)
               C(缓存条目)
               ! (拒绝路线)

#MSS:此路由上的TCP连接的默认最大段大小。

#Window:此路由上的TCP连接的默认窗口大小。

#irtt:初始RTT(往返时间)。 内核使用它来猜测最佳的TCP协议参数,而无需等待(可能很慢)的答案。

#Iface:将为此路由发送数据包的接口。


博文来自:www.51niux.com     

2.3 显示UP状态的网络接口的网络信息

# netstat  --interfaces=p5p1    #跟netstat  -I=p5p1 效果一样,显示p5p1网卡接口的网络信息。
Kernel Interface table
Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
p5p1      1500  1011831      0      0 0       3685700      0      0      0 BMsRU

#Iface:网络接口名称

#MTU:可在网络上发送的最大数据包的大小,称为 最大传输单元(MTU)。同一物理或逻辑(VLAN)网络中的所有设备,应使用同一个 MTU 大小。链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值。以太网的MTU是1500。如果IP层有数据包要传,而且数据包的长度超过了MTU,那么IP层就要对数据包进行分片(fragmentation)操作,使每一片的长度都小于或等于MTU。我们假设要传输一个UDP数据包,以太网的MTU为1500字节,一般IP首部为20字节,UDP首部为8字节,数据的净荷(payload)部分预留是1500-20-8=1472字节。如果数据部分大于1472字节,就会出现分片现象。

#RX-OK:接收时,正确的数据包数。

#RX-ERR:接收时,产生错误的数据包数。

#RX-DRP:接收时,丢弃的数据包数。

#RX-OVR:接收时,由于过速(在数据传输中,由于接收设备不能接收按照发送速率传送来的数据而使数据丢失)而丢失的数据包数。

#TX-OK: 发送时,正确的数据包数。

#TX-ERR:发送时,产生错误的数据包数。

#TX-DRP:发送时,丢弃的数据包数。

#TX-OVR:发送时,由于过速而丢失的数据包数。

#Flg:标志。下面是标志描述符的:

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

# netstat  -i  #可以查看所有UP状态的的网络接口信息。
图片.png


2.3 显示每个协议的统计信息

#netstat -s  #显示所有端口的统计信息
Ip:
    51855492106 total packets received     #收到的总数据包是51855492106   

    0 forwarded  #转发包数是0
    0 incoming packets discarded   #丢失传入数据包是0
    51851543262 incoming packets delivered  #传入数据包是51851543262

    464123804154 requests sent out     #发出464123804154个请求

    3 outgoing packets dropped              #3个传出数据包丢失
    238042 fragments dropped after timeout    #超时后238042个碎片掉落

    296170 reassemblies required                 #296170个包需要重装

    296170 packet reassembles failed           #296170包重新组装失败

Icmp:
    2706819 ICMP messages received             #收到ICMP消息2706819

    0 input ICMP message failed.                        #ICMP消息失败0次
    ICMP input histogram:                                     # ICMP输入直方图:

        destination unreachable: 11138                 #目的地不可达:11138

        echo requests: 2685816                               #回应请求:2685816

        echo replies: 9865                                           #回应回复:9865

    2882592 ICMP messages sent                           #发送ICMP消息2882592

    0 ICMP messages failed                                      #0 ICMP消息失败

    ICMP output histogram:                                      # ICMP输出直方图:

        destination unreachable: 168790                    #目的地不可达:168790

        time exceeded: 16718                                         #时间超过:16718

        echo request: 9865                                                #回应请求:9865

        echo replies: 2685816                                          #回复回复:2685816

IcmpMsg:  #这就相当于上面的报告
        InType0: 9865
        InType3: 11138
        InType8: 2685816
        OutType0: 2685816
        OutType3: 168790
        OutType8: 9865
        OutType11: 16718
        OutType69: 1403
Tcp:
    789371 active connections openings                     # 789371个有效连接

    2030525 passive connection openings                   #2030525个被动连接

    16 failed connection attempts                                   #16次失败的连接尝试

    28934 connection resets received                             #接收到28934个连接重置

    2 connections established                                            #建立了2个连接

    1691315341 segments received                                  #收到段数1691315341

    1320552798 segments send out                                  # 1320552798段发送出去

    547382 segments retransmited                                     #547382段重新发送

    204 bad segments received.                                           #收到204个不良部分。

    869174 resets sent                                                             # 869174个重置发送

Udp:
    50082276572 packets received                                        #收到50082276572封包

    176677 packets to unknown port received.                    # 收到176677个未知端口的数据包。

    73978308 packet receive errors                                         # 73978308个数据包接收错误

    462854721865 packets sent                                                 #462854721865个包发送

    7171424 receive buffer errors                                              #收到缓冲区错误包7171424个

    0 send buffer errors                                                                 #发送缓冲区错误0

    InCsumErrors: 72151                                                                 #
UdpLite:
TcpExt:
    450 SYN cookies sent                                                                 #发送450个SYN Cookie

    568 SYN cookies received                                                          # 收到568 SYN Cookie

    15057 invalid SYN cookies received                                          #收到15057个无效的SYN Cookie

    1106384 TCP sockets finished time wait in fast timer              # 1106384个TCP套接字完成时间等待快速定时器

    14 packets rejects in established connections because of timestamp   #由于时间戳,14个数据包在建立的连接中被拒绝

    163066557 delayed acks sent                                                               # 163066557个包延迟发送

    3819 delayed acks further delayed because of locked socket          #3819个包由于锁定socker延迟了进一步延迟

    Quick ack mode was activated 476247 times                                       #快速确认模式已激活476247次

    1748 times the listen queue of a socket overflowed                            #1748次套接字的监听队列溢出

    2198 SYNs to LISTEN sockets dropped                                                        #2198个SYNs 去LISTEN套接字掉线

    4251157 packets directly queued to recvmsg prequeue.                         # 4251157数据包直接排队到recvmsg prequeue。

    134974966 bytes directly in process context from backlog                      # 134974966字节直接在进程上下文中从积压

   1126261750 bytes directly received in process context from prequeue  #直接从进程上下文中接收到的1126261750个字节

    350279770 packet headers predicted                                                                 #350279770包头预测

    1026793 packets header predicted and directly queued to user                     #1026793数据包报头预测并直接排队给用户

    48559022 acknowledgments not containing data payload received                 # 48559022个包不包含接收到数据有效载荷的确认

    755883503 predicted acknowledgments                                                                 #
    7566 times recovered from packet loss by selective acknowledgements          #通过选择性确认从包丢失中恢复7566次

    Detected reordering 6 times using FACK                                                                     #使用FACK检测重新排序6次

    Detected reordering 5 times using SACK                                                                    # 使用SACK检测重新排序5次

    Detected reordering 9 times using time stamp                                                           #使用时间戳检测重新排序9次

    66 congestion windows fully recovered without slow start                                      # 66个拥塞窗口完全恢复,没有启动缓慢

    14 congestion windows partially recovered using Hoe heuristic                                #  使用Hoe heuristic启发式部分恢复了14个拥塞窗口

    71 congestion windows recovered without slow start by DSACK                              #71个拥塞窗口恢复,而DSACK没有缓慢启动

    1832 congestion windows recovered without slow start after partial ack                #1832个拥塞窗口在部分确认后没有缓慢启动

    TCPLostRetransmit: 1160                                                                                                #TCPLostRetransmit:1160

    982 timeouts after SACK recovery                                                                                 #SACK恢复后982次超时

    1150 timeouts in loss state                                                                                               #1150次超时处于丢失状态

    15912 fast retransmits                                                                                                         #15912次快速重传

    344 forward retransmits                                                                                                     # 344次前转重发

    3570 retransmits in slow start                                                                                            #  3570次因为缓慢的速度重新发送

    1597 other TCP timeouts                                                                                                       #1597次其他TCP超时

    TCPLossProbes: 542068                                                                                                              #
    TCPLossProbeRecovery: 45266
    1780 SACK retransmits failed                                                                                                 #1780次SACK重传失败

    476260 DSACKs sent for old packets                                                                                  # 476260次发送旧数据包的DSACK   

   519730 DSACKs received                                                                                                                

    3 DSACKs for out of order packets received                                                                       # 3个DSACK接收到无序数据包

    4355 connections reset due to unexpected data                                                               #4355次连接由于意外的数据复位

    127 connections reset due to early user close                                                                    #由于早期用户关闭,127个连接复位

    6 connections aborted due to timeout                                                                                 #6个连接由于超时而中止

    TCPDSACKIgnoredOld: 1
    TCPDSACKIgnoredNoUndo: 518929
    TCPSpuriousRTOs: 1751
    TCPSackShifted: 5329
    TCPSackMerged: 31875
    TCPSackShiftFallback: 88373
    TCPReqQFullDoCookies: 517
    TCPRcvCoalesce: 23173796
    TCPOFOQueue: 23740
    TCPChallengeACK: 336
    TCPSYNChallenge: 204
    TCPSpuriousRtxHostQueues: 9
    TCPAutoCorking: 4775177
    TCPFromZeroWindowAdv: 404852
    TCPToZeroWindowAdv: 404852
    TCPWantZeroWindowAdv: 302540
    TCPSynRetrans: 1074
    TCPOrigDataSent: 891646881
    TCPHystartTrainDetect: 25
    TCPHystartTrainCwnd: 1152
    TCPHystartDelayDetect: 3
    TCPHystartDelayCwnd: 58
    TCPACKSkippedPAWS: 2
    TCPACKSkippedSeq: 1
IpExt:
    InMcastPkts: 1120606308
    OutMcastPkts: 72278428
    InBcastPkts: 1117966
    InOctets: 11795631112853
    OutOctets: 216136828729149
    InMcastOctets: 127253180512
    OutMcastOctets: 8005557248
    InBcastOctets: 643676613
    InNoECTPkts: 51850057617
    InECT1Pkts: 1353
    InECT0Pkts: 5433137

# netstat -st   #只显示tcp的信息
# netstat -us   #只显示udp的信息

博文来自:www.51niux.com

2.4   指定协议显示

# netstat  -ln --inet 4 --u  #-l是只显示监听套接字,--inet 4  --u是只显示ipv4协议并且是ucp的监听,不按CTRL+C是一直刷新的。

图片.png

下面的图是两种形式,第一种就是一种条件,就刷新一次就完事了,第二种就是两种条件会一直刷新,但是你也想刷新一次就完事你就加空格随便加个数字,也就刷新一次了。

图片.png


2.5 -p和-a的用法

-p是我们常用的一个用法,显示每个套接字所属程序的PID和名称。

-a呢显示监听和非监听套接字,并且可以将未启动的网卡的信息显示出来。(上面我们用netstat不是不显示关闭网卡接口的信息嘛。)

#netstat  --interfaces=p1p2    #我光纤网卡p1p2是不插网线down的状态,默认是显示不出来的。
Kernel Interface table
Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg

#netstat  -a --interfaces=p1p2  #用-a指定端口的形式就可以显示出来
Kernel Interface table
Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
p1p2      1500   349973      0      0 0             0      0      0      0 BM


# netstat  -lntup  #这个命令是我们常用的命令,我们用来查看本地启动了哪些监听端口,并且显示他们的PID和服务名称。

# netstat  -lntupa  #多了一个a,就会将非LISTEN之外的状态也显示出来。


2.6 不断刷新的方法

# netstat  -lntup 10  #后面的数字10表示10秒刷新一次。

# netstat  -lntp -c 10  #-c的作用就是指定秒数连续打印信息。不加数字默认是每隔1秒。


三、 可能用到的常用用法:

# netstat  -lntup  #最常用到的就是这个了,查看现在对外开放的监听端口以及运行的服务或者命令及PID。

# netstat  -at  #列出所有的tcp端口

# netstat  -au  #列出所有的udp端口
# netstat  -lx  #列出所有处于监听端口状态的套接字文件。

#netstat  -i  #如果不是宿主机的话,可以用这个命令查看我们哪些网卡是UP状态

# netstat -ie  #-e是显示更详细的额外信息嘛,这个操作跟#ip addr获得的信息是一致的。

# netstat --verbose  #显示不支持的地址族,在结果的末尾会有信息。

# netstat  -rn  #也可以用这个命令查看主机路由信息,比如网络不通啊可以查看是不是路由指向有问题啊。不过我们一般会使用:# route -n。

剩下的就是加管道跟别的命令配合了:

# netstat  -lntup|grep ssh   #如查看ssh的监听状态信息啊

#netstat -nat|grep TIME_WAIT|wc -l    #如查看TIME_WAIT连接的数量啊

#netstat -n |awk '/^tcp/{++state[$NF]}END{for(key in state)print key"\t"state[key]}' #如连接状态统计计数啊


作者:忙碌的柴少 分类:linux网络检测工具 浏览:9741 评论:0
留言列表
发表评论
来宾的头像