5.9. netstat 命令

netstat 是一个用于检查网络配置和活动的有用工具。它实际上是几个工具的集合。我们将在以下章节中讨论它的每个功能。

5.9.1. 显示路由表

当你使用–r标志调用 netstat 时,它会像我们使用 route 命令一样显示内核路由表。在 vstout 上,它会产生
# netstat -nr
Kernel IP routing table
Destination   Gateway      Genmask         Flags  MSS Window  irtt Iface
127.0.0.1     *            255.255.255.255 UH       0 0          0 lo
172.16.1.0    *            255.255.255.0   U        0 0          0 eth0
172.16.2.0    172.16.1.1   255.255.255.0   UG       0 0          0 eth0

The–n选项使 netstat 将地址打印为点分十进制 IP 数字,而不是符号主机和网络名称。当你想要避免通过网络进行地址查找时(例如,到 DNS 或 NIS 服务器),此选项特别有用。

netstat 输出的第二列显示路由条目指向的网关。如果未使用网关,则会打印星号。第三列显示路由的“通用性”,即此路由的网络掩码。当给定一个 IP 地址以查找合适的路由时,内核会遍历每个路由表条目,将地址和 genmask 进行按位 AND 运算,然后将其与路由的目标进行比较。

第四列显示描述路由的以下标志:

G

路由使用网关。

U

要使用的接口已启动。

H

只能通过路由访问单个主机。例如,环回条目 127.0.0.1 就是这种情况。

D

此路由是动态创建的。如果表条目是由路由守护进程(如 gated)或由 ICMP 重定向消息生成的,则会设置此标志(请参阅第 2 章中的 2.5 节)。

M

如果表条目被 ICMP 重定向消息修改,则会设置此路由。

!

该路由是一个拒绝路由,数据报将被丢弃。

接下来的三列显示将应用于通过此路由建立的 TCP 连接的 MSS、Window 和 irtt。MSS 是最大段大小,是内核将构造的通过此路由传输的最大数据报的大小。Window 是系统将从远程主机在单个突发中接受的最大数据量。首字母缩略词irtt代表“初始往返时间”。TCP 协议通过重新传输已丢失的数据报来确保数据在主机之间可靠传递。TCP 协议会持续记录将数据报传递到远程端并接收到确认所需的时间,以便它知道在假定需要重新传输数据报之前需要等待多长时间;此过程称为往返时间。初始往返时间是 TCP 协议在首次建立连接时将使用的值。对于大多数网络类型,默认值是可以的,但对于某些慢速网络,特别是某些类型的业余无线电分组网络,该时间太短,会导致不必要的重新传输。irtt可以使用 route 命令设置该值。这些字段中的零值表示正在使用默认值。

最后,最后一个字段显示此路由将使用的网络接口。

5.9.2. 显示接口统计信息

当使用–i标志调用 netstat 时,它会显示当前配置的网络接口的统计信息。如果还给出了–a选项,它会打印内核中存在的所有接口,而不仅仅是当前已配置的接口。在 vstout 上,netstat 的输出将如下所示:
# netstat -i
Kernel Interface table
Iface MTU Met  RX-OK RX-ERR RX-DRP RX-OVR  TX-OK TX-ERR TX-DRP TX-OVR Flags
lo      0   0   3185      0      0      0   3185      0      0      0 BLRU
eth0 1500   0 972633     17     20    120 628711    217      0      0 BRU

TheMTUMet字段显示该接口的当前 MTU 和 metric 值。RXTX列显示已无错误地接收或传输了多少数据包 (RX-OK/TX-OK) 或已损坏的数据包 (RX-ERR/TX-ERR);丢弃了多少数据包 (RX-DRP/TX-DRP);以及由于溢出而丢失了多少数据包 (RX-OVR/TX-OVR).

最后一列显示为此接口设置的标志。这些字符是长标志名称的单字符版本,当你使用 ifconfig 显示接口配置时会打印这些标志。

B

已设置广播地址。

L

此接口是一个环回设备。

M

接收所有数据包(混杂模式)。

O

已为此接口关闭 ARP。

P

这是一个点对点连接。

R

接口正在运行。

U

接口已启动。

5.9.3. 显示连接

netstat 支持一组选项来显示活动或被动套接字。选项–t, –u, –w–x显示活动的 TCP、UDP、RAW 或 Unix 套接字连接。如果你还提供–a标志,也将显示正在等待连接(即正在侦听)的套接字。此显示将为你提供系统上当前运行的所有服务器的列表。

vlager 上调用 netstat -ta 会产生以下输出:
$ netstat -ta
Active Internet Connections
Proto Recv-Q Send-Q Local Address    Foreign Address    (State)
tcp        0      0 *:domain         *:*                LISTEN  
tcp        0      0 *:time           *:*                LISTEN  
tcp        0      0 *:smtp           *:*                LISTEN  
tcp        0      0 vlager:smtp      vstout:1040        ESTABLISHED  
tcp        0      0 *:telnet         *:*                LISTEN  
tcp        0      0 localhost:1046   vbardolino:telnet  ESTABLISHED  
tcp        0      0 *:chargen        *:*                LISTEN  
tcp        0      0 *:daytime        *:*                LISTEN  
tcp        0      0 *:discard        *:*                LISTEN  
tcp        0      0 *:echo           *:*                LISTEN  
tcp        0      0 *:shell          *:*                LISTEN  
tcp        0      0 *:login          *:*                LISTEN  

此输出显示大多数服务器只是在等待传入连接。但是,第四行显示来自 vstout 的传入 SMTP 连接,第六行告诉你有一个到 vbardolino 的传出 telnet 连接。[1]

单独使用–a标志将显示所有系列的所有套接字。

注释

[1]

你可以从端口号判断连接是否是传出的。为调用主机显示的端口号始终是一个简单的整数。在被调用主机上,将使用一个众所周知的服务端口,netstat 为其使用符号名称,例如smtp,可以在/etc/services.