果冻想
认真玩技术的地方

Linux netstat命令详解

前言

对于netstat命令,我还是非常熟悉的,最开始使用这个命令时,我主要用它来查看端口的占用情况,自从知道了netstat命令的这个功能后,在后续的工作中,我基本都是使用这个命令来查看端口的占用情况,后来知道使用lsof命令也可以,不清楚的伙计可以看下这篇《Linux lsof命令详解》,但是也就知道这个命令的这个功能而已,其它功能基本上都是一无所知,后来说要了解网络的性能,讲到也可以使用这个命令来玩,哎呦,出乎我的意料,使用了快三年的命令,居然还不知道这货还有这个功能,索性就借着这个机会,好好的把这个netstat命令好好的整理一番。

命令简介

netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,同时还可用于检验本机各端口的网络连接情况。服务器有时候接收到的数据包导致数据出错或故障,不必感到奇怪,TCP/IP可以容许这些类型的错误,并能够自动重发数据报。但如果累计的出错情况数目占到所接收的IP数据报相当大的百分比,或者它的数目正迅速增加,那么我们就应该使用netstat查一查为什么会出现这些情况了。

命令详解

该工具对Linux网络管理员以及系统管理员非常有用,而且使用起来也是非常简单的,虽然选项比较多,但是常用的就那么几个。

netstat常用命令格式如下:

netstat <选项>

常用选项说明如下:

  • -a:显示所有选项,默认不显示LISTEN相关
  • -t:仅显示tcp相关选项
  • -u:仅显示udp相关选项
  • -n:拒绝显示别名,能显示数字的全部转化成数字
  • -l:仅列出有在Listen(监听)的服务状态
  • -p:显示建立相关连接的程序名
  • -r:显示路由信息,路由表
  • -e:显示扩展信息,例如uid等
  • -s:按各个协议进行统计
  • -c:每隔一个固定时间,执行该netstat命令
  • -i:显示网卡接口信息

LISTEN和LISTENING的状态只有用-a或者-l才能看到

下面就对我们常用的使用方式进行详细的总结。

使用实例

  • 命令:netstat -a
    说明:列出所有连接
    输出:

        Active Internet connections (servers and established)
        Proto Recv-Q Send-Q Local Address           Foreign Address         State      
        tcp        0      0 0.0.0.0:http            0.0.0.0:*               LISTEN     
        tcp        0      0 0.0.0.0:https           0.0.0.0:*               LISTEN     
        tcp        0      0 jellythink:https        39.154.11.104:8543      ESTABLISHED
        tcp        0      0 jellythink:50398        100.100.30.25:http      ESTABLISHED
        tcp6       0      0 [::]:ftp                [::]:*                  LISTEN     
        tcp6       0      0 [::]:mysql              [::]:*                  LISTEN     
        udp        0      0 jellythink:ntp          0.0.0.0:*                          
        Active UNIX domain sockets (servers and established)
        Proto RefCnt Flags       Type       State         I-Node   Path
        unix  9      [ ]         DGRAM                    6897     /dev/log
        unix  2      [ ]         DGRAM                    9721     /run/systemd/shutdownd
        unix  3      [ ]         STREAM     CONNECTED     11477    
        unix  3      [ ]         STREAM     CONNECTED     11478    /run/systemd/journal/stdout
        unix  3      [ ]         STREAM     CONNECTED     11234    /run/systemd/journal/stdout
        unix  2      [ ]         STREAM     CONNECTED     709729   
        unix  3      [ ]         STREAM     CONNECTED     56906077 /run/systemd/journal/stdout
        unix  3      [ ]         STREAM     CONNECTED     56906070 
    

    输出主要包含两部分:

    • Active Internet connections (servers and established),称为有源TCP链接,包括TCP和UDP等的详细状态;
    • Active UNIX domain sockets (servers and established),称为有源Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍);

    有源TCP连接字段详解:

    • Proto:当前连接的协议;如TCP、UDP;
    • Recv-Q:网络接收队列;
    • Send-Q:网络发送队列;接收队列和发送队列一般都应该是0,如果不是则表示数据包正在队列中堆积,但是这种情况比较少见;
    • Local Address:本机的ip:port(注意此处127.0.0.1默认显示主机名,0.0.0.0默认显示*,端口可能显示别名。若强制显示数字,加-n参数)
    • Foreign Address:对端ip:port;与Local Address规则相同
    • State:当前套接字的网络状态,有以下几种状态:
      • LISTEN:监听来自其它TCP端口的连接请求
      • SYN-SENT:再发送连接请求后等待匹配的连接请求(如果有大量这样的状态包,检查是否中招了)
      • SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认(如有大量此状态,估计被flood攻击了)
      • ESTABLISHED:代表一个打开的连接
      • FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
      • FIN-WAIT-2:从远程TCP等待连接中断请求
      • CLOSE-WAIT:等待从本地用户发来的连接中断请求
      • CLOSING:等待远程TCP对连接中断的确认
      • LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认(不是什么好东西,此项出现,检查是否被攻击)
      • TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
      • CLOSED:没有任何连接状态

      如果对这里的状态不是很明白,可以参考我之前总结的一篇《简析TCP的三次握手与四次分手

  • 命令:netstat -antp
    说明:以数字的形式显示所有的TCP连接,并显示对应程序所监听的端口号
    输出:

    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      12886/nginx: worker
    tcp      401      0 172.17.169.20:45058     106.11.68.13:80         CLOSE_WAIT  - 
    tcp        0     32 172.17.169.20:443       92.247.181.16:34102     FIN_WAIT1   - 
    tcp        0     36 172.17.169.20:50022     111.126.59.237:19225    ESTABLISHED - 
    tcp        0      0 172.17.169.20:80        92.247.181.16:59840     TIME_WAIT   -
    
  • 命令:netstat -anup
    说明:以数字的形式显示所有的UDP连接,并显示对应程序所监听的端口号
    输出:

    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    udp        0      0 172.17.169.20:123       0.0.0.0:*                           - 
    udp        0      0 127.0.0.1:123           0.0.0.0:*                           - 
    udp        0      0 0.0.0.0:123             0.0.0.0:*                           - 
    udp6       0      0 :::123                  :::*                                - 
    
  • 命令:netstat -st
    说明:统计TCP协议相关的网络统计数据

  • 命令:netstat -rn
    说明:打印内核路由信息
    输出:

    Kernel IP routing table
    Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
    0.0.0.0         172.17.175.253  0.0.0.0         UG        0 0          0 eth0
    169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0
    172.17.160.0    0.0.0.0         255.255.240.0   U         0 0          0 eth0
    

    输出内容详解:

    • Destination:目标网络或目标主机
    • Gateway:网关地址,如果没有就显示星号
    • Genmask:网络掩码,0.0.0.0表示默认路由
    • Flags:标志位,有以下常用取值:
      • U:表示该路由是启动的
      • H:目标是一部主机(IP)而非网域
      • G:需要透过外部的主机(gateway)来转递封包
    • Iface:网络接口名

  • 命令:netstat -ie
    说明:显示网络接口信息
    输出:

    Kernel Interface table
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.17.169.20  netmask 255.255.240.0  broadcast 172.17.175.255
            ether 00:16:3e:08:08:55  txqueuelen 1000  (Ethernet)
            RX packets 118652133  bytes 32809811588 (30.5 GiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 117764824  bytes 141868266007 (132.1 GiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            loop  txqueuelen 1  (Local Loopback)
            RX packets 176847758  bytes 366499506703 (341.3 GiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 176847758  bytes 366499506703 (341.3 GiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    

    这里的输出内容和《Linux ip命令详解》中ip -s link的输出内容是很像的,这里就不再一一解释了。

常用脚本

netstat命令在我们工作中是经常使用的,至少我是这样。对于那些常用的脚本,很多时候我们都是直接使用我们平时积累下来的脚本。下面就将我经常使用的脚本和大家分享。

  • 统计TCP各个状态数量
    netstat -n | awk '/^tcp/{++state[$NF]}; END{for(key in state) print key, "\t", state[key]}'
    

    通过上面的脚本,我们可以快速的统计中当前TCP每个状态的数量,通过这个数量,我们就可以大致知道服务器TCP连接当前的健康状态。

  • 统计连接某服务端口最多的IP地址

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

总结

大过年的,还在写博客,我是多么的爱学习。这篇关于netstat命令的文章到此就总结完毕了,说实话,这篇文章总结的还是比较水的,有些细节的地方还是没有总结到的,后续再根据实际的工作经验继续完善吧。最后,恭祝大家新年快乐!

果冻想,认真玩技术的地方。

2019年2月8日,于内蒙古包头。

赞(4) 打赏
未经允许不得转载:果冻想 » Linux netstat命令详解
关注微信公众号
关注微信公众号和果冻一起分享你的疑惑与心得。
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

玩技术,我们是认真的

联系我们关于果冻

请我喝杯咖啡也是不错的

支付宝扫一扫打赏

微信扫一扫打赏