netstat 命令详解

netstat 命令用于显示各种网络相关信息,如网络连接、路由表、接口状态(Interface Statistics)、masquerade 连接、多播成员(Multicast Memberships)等等。它是排查网络问题最常用的工具之一,本文将结合示例详细介绍它的输出含义和常见用法。

输出信息含义

执行 netstat 后,其输出结果为:

Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      2 210.34.6.89:telnet      210.34.6.96:2873        ESTABLISHED
tcp      296      0 210.34.6.89:1165        210.34.6.84:netbios-ssn ESTABLISHED
tcp        0      0 localhost.localdom:9001 localhost.localdom:1162 ESTABLISHED
tcp        0      0 localhost.localdom:1162 localhost.localdom:9001 ESTABLISHED
tcp        0     80 210.34.6.89:1161        210.34.6.10:netbios-ssn CLOSE

Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node Path
unix  1      [ ]         STREAM     CONNECTED     16178  @000000dd
unix  1      [ ]         STREAM     CONNECTED     16176  @000000dc
unix  9      [ ]         DGRAM                    5292   /dev/log
unix  1      [ ]         STREAM     CONNECTED     16182  @000000df

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

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

另一个是 Active UNIX domain sockets,称为有源 Unix 域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。

Proto 显示连接使用的协议,RefCnt 表示连接到本套接口上的进程号,Type 显示套接口的类型,State 显示套接口当前的状态,Path 表示连接到套接口的其它进程使用的路径名。

常见参数

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

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

实用命令实例

1. 列出所有端口(包括监听和未监听的)

列出所有端口 netstat -a

# netstat -a | more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 localhost:30037         *:*                     LISTEN
udp        0      0 *:bootpc                *:*

Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     6135   /tmp/.X11-unix/X0
unix  2      [ ACC ]     STREAM     LISTENING     5140   /var/run/acpid.socket

列出所有 tcp 端口 netstat -at

# netstat -at
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 localhost:30037         *:*                     LISTEN
tcp        0      0 localhost:ipp           *:*                     LISTEN
tcp        0      0 *:smtp                  *:*                     LISTEN
tcp6       0      0 localhost:ipp           [::]:*                  LISTEN

列出所有 udp 端口 netstat -au

# netstat -au
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
udp        0      0 *:bootpc                *:*
udp        0      0 *:49119                 *:*
udp        0      0 *:mdns                  *:*

2. 列出所有处于监听状态的 Sockets

只显示监听端口 netstat -l

# netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 localhost:ipp           *:*                     LISTEN
tcp6       0      0 localhost:ipp           [::]:*                  LISTEN
udp        0      0 *:49119                 *:*

只列出所有监听 tcp 端口 netstat -lt

# netstat -lt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 localhost:30037         *:*                     LISTEN
tcp        0      0 *:smtp                  *:*                     LISTEN
tcp6       0      0 localhost:ipp           [::]:*                  LISTEN

只列出所有监听 udp 端口 netstat -lu

# netstat -lu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
udp        0      0 *:49119                 *:*
udp        0      0 *:mdns                  *:*

只列出所有监听 UNIX 端口 netstat -lx

# netstat -lx
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     6294   private/maildrop
unix  2      [ ACC ]     STREAM     LISTENING     6203   public/cleanup
unix  2      [ ACC ]     STREAM     LISTENING     6302   private/ifmail
unix  2      [ ACC ]     STREAM     LISTENING     6306   private/bsmtp

3. 显示每个协议的统计信息

显示所有端口的统计信息 netstat -s

# netstat -s
Ip:
    11150 total packets received
    1 with invalid addresses
    0 forwarded
    0 incoming packets discarded
    11149 incoming packets delivered
    11635 requests sent out
Icmp:
    0 ICMP messages received
    0 input ICMP message failed.
Tcp:
    582 active connections openings
    2 failed connection attempts
    25 connection resets received
Udp:
    1183 packets received
    4 packets to unknown port received.
    .....

显示 TCP 或 UDP 端口的统计信息 netstat -st-su

netstat -st
netstat -su

4. 在 netstat 输出中显示 PID 和进程名称

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

# netstat -pt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        1      0 ramesh-laptop.loc:47212 192.168.185.75:www      CLOSE_WAIT  2109/firefox
tcp        0      0 ramesh-laptop.loc:52750 lax:www                 ESTABLISHED 2109/firefox

5. 在 netstat 输出中不显示主机、端口和用户名(host, port or user)

当你不想让主机、端口和用户名显示时,使用 netstat -n,将会使用数字代替那些名称:

netstat -an

同样可以加速输出,因为不用进行比对查询。

如果只是不想让这三个名称中的一个被显示,使用以下命令:

netstat -a --numeric-ports
netstat -a --numeric-hosts
netstat -a --numeric-users

6. 持续输出 netstat 信息

netstat -c 将每隔一秒输出网络信息:

# netstat -c
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 ramesh-laptop.loc:36130 101-101-181-225.ama:www ESTABLISHED
tcp        1      1 ramesh-laptop.loc:52564 101.11.169.230:www      CLOSING
tcp        0      0 ramesh-laptop.loc:43758 server-101-101-43-2:www ESTABLISHED
tcp        1      1 ramesh-laptop.loc:42367 101.101.34.101:www      CLOSING

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

netstat --verbose,在输出的末尾,会有如下的信息:

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.

8. 显示核心路由信息

# netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.1.0     *               255.255.255.0   U         0 0          0 eth2
link-local      *               255.255.0.0     U         0 0          0 eth2
default         192.168.1.1     0.0.0.0         UG        0 0          0 eth2

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

9. 找出程序运行的端口

并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息:

# netstat -ap | grep ssh
tcp        1      0 dev-db:ssh              101.174.100.22:39213    CLOSE_WAIT  -
tcp        1      0 dev-db:ssh              101.174.100.22:57643    CLOSE_WAIT  -

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

netstat -an | grep ':80'

10. 显示网络接口列表

# 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
eth0       1500 0         0      0      0 0             0      0      0      0 BMU
eth2       1500 0     26196      0      0 0         26883      6      0      0 BMRU
lo        16436 0         4      0      0 0             4      0      0      0 LRU

显示详细信息,像是 ifconfig,使用 netstat -ie

# netstat -ie
Kernel Interface table
eth0      Link encap:Ethernet  HWaddr 00:10:40:11:11:11
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Memory:f6ae0000-f6b00000

11. IP 和 TCP 分析

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

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

输出示例:

     18 221.136.168.36
      3 154.74.45.242
      2 78.173.31.236
      2 62.183.207.98
      2 192.168.1.14
      2 182.48.111.215
      2 124.193.219.34
      2 119.145.41.2
      2 114.255.41.30
      1 75.102.11.99

TCP 各种状态列表:

netstat -nat | awk '{print $6}'

先把状态全都取出来,然后使用 uniq -c 统计,之后再进行排序:

netstat -nat | awk '{print $6}' | sort | uniq -c

输出示例:

    143 ESTABLISHED
      1 FIN_WAIT1
      1 Foreign
      1 LAST_ACK
     36 LISTEN
      6 SYN_SENT
    113 TIME_WAIT
      1 established)

最后的命令如下:

netstat -nat | awk '{print $6}' | sort | uniq -c | sort -rn

分析 access.log 获得访问前 10 位的 ip 地址:

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10

   转载规则


《netstat 命令详解》 吴杭沉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Shell 实用技巧集锦 Shell 实用技巧集锦
Shell 是每个开发者的日常工具,掌握一些高频技巧能显著提升命令行下的工作效率。本文整理了别名定义、后台任务管理、重定向与管道、批量处理、进程管理、磁盘排查等实用技巧,每个技巧都配有可直接运行的示例,方便边看边练。 alias 命令别名对
2021-01-24
下一篇 
nc(netcat)使用指南(上) nc(netcat)使用指南(上)
nc 即 netcat 命令,这个工具在排查网络故障时非常有用,功能非常强大,因而被业界称为网络界的”瑞士军刀”,请读者务必掌握。默认系统是没有这个命令的,你需要先安装一下。 nc 命令常见的用法是模拟一个服务器程序被其他客户端连接,或者模
2021-01-10
  目录