您所在的位置:读书频道 > 操作系统 > Linux > 5.2.3 netstat

5.2.3 netstat

2007-12-05 10:22 鸟哥 机械工业出版社华章公司 字号:T | T
一键收藏,随时查看,分享好友!

《鸟哥的Linux私房菜——服务器架设篇》(第二版)第五章的主要介绍一些常见的网络命令,并新增了一些数据包捕获的命令。本文主要介绍的是netstat命令。

AD:

5.2.3  netstat

如果你觉得某个网络服务明明启动了,但是却无法联机的话,应该怎么办?首先应该查询一下自己的网络接口所监听的端口(port),看看是否真的有启动,因为有时候屏幕上面显示的OK并不一定真的OK了。

[root@linux ~]# netstat -[rn]       <==与路由有关的参数
[root@linux ~]# netstat -[antulpc]  <==与网络接口有关的参数
参数:
与路由 (route) 有关的参数说明
-r,列出路由表(route table),功能如同 route 这个命令
-n,不使用主机名称与服务名称,使用 IP 与 Port Number ,如同 route -n
与网络接口有关的参数
-a,列出所有的联机状态,包括 tcp/udp/unix socket 等
-t,仅列出 TCP 数据包的联机
-u,仅列出 UDP 数据包的联机
-l,仅列出有在 Listen (监听) 的服务之网络状态
-p,列出 PID 与 Program 的文件名
-c,可以设置几秒后自动更新一次,例如 -c 5 每5秒更新一次网络状态的显示

范例一:列出目前的路由表状态,且以 IP 及 Port Number 显示:
[root@linux ~]# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.10.0    0.0.0.0         255.255.255.0   U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0
0.0.0.0         192.168.10.30   0.0.0.0         UG        0 0          0 eth0
# 其实这个参数就跟 route -n 一模一样,对吧。这不是 netstat 的主要功能

范例二:列出目前的所有网络联机状态,使用 IP 与 Port Number
[root@linux ~]# netstat -an
Active Internet connections (Servers and established)
Proto Recv-Q Send-Q Local Address             Foreign Address             State
tcp        0      0 0.0.0.0:25                0.0.0.0:*                   LISTEN
tcp        0      0 :::22                     :::*                        LISTEN
tcp        0      0 ::ffff:192.168.10.100:25  ::ffff:192.168.10.200:57509 TIME_WAIT
tcp        0     52 ::ffff:192.168.10.100:22  ::ffff:192.168.10.210:1504  ESTABLISHED
udp        0      0 127.0.0.1:53              0.0.0.0:*
Active UNIX domain sockets (Servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     4792   public/cleanup
unix  2      [ ACC ]     STREAM     LISTENING     4799   private/rewrite
……(下面省略)……

netstat的输出主要分为两大部分,分别是TCP/IP的网络接口部分,以及传统的Unix socket部分。还记得我们在《鸟哥的Linux私房菜——基础学习篇》里面曾经谈到文件的类型吗?那个socket与FIFO文件还记得吧?那就是在Unix接口里用来作为程序数据交流的接口了,也就是上面程序里看到的Active Unix domain sockets的内容了。
通常鸟哥都是建议加上“-n”这个参数的,因为可以避免主机名称与服务名称的反查,直接以IP及端口号码(Port Number)来显示,显示的速度会快很多。至于在输出的信息当中,我们先来谈一谈关于网络联机状态的输出部分,它主要分为下面几个大项。

· Proto:该联机的数据包协议,主要为TCP/UDP等协议。

· Recv-Q:由非用户程序连接所复制而来的总bytes数。

· Send-Q:由远程主机传送而来,但不具有ACK标志的总bytes数,指主动联机SYN或其他标志的数据包所占的bytes数。

· Local Address:本地端的地址,可以是IP(-n参数存在时),也可以是完整的主机名称。如上述代码中我们看到的IP格式有两种,一种是IPv4的标准,即是4组十进制的数字加上冒号“:”后,接着Port Number。一种是IPv6,前面的IP加上很多冒号“:”的格式。可以由这个显示的数据看出这个服务是开放在哪一个接口,例如上例当中,port 22是开放在0.0.0.0,即所有接口都可以连到port 22,至于port 53则仅开放在本机的127.0.0.1这个接口而已,所以是不对外部接口开放的。

· Foreign Address:远程的主机IP与Port Number。

· stat:状态列,主要的状态有如下几项。

Ø ESTABLISED:已建立联机的状态。
Ø SYN_SENT:发出主动联机(SYN标志)的联机数据包。
Ø SYN_RECV:接收到一个要求联机的主动联机数据包。
Ø FIN_WAIT1:该联机正在断线当中。
Ø FIN_WAIT2:该联机已挂断,但正在等待对方主机响应断线确认的数据包。
Ø TIME_WAIT:该联机已挂断,但socket还在网络上等待结束。
Ø LISTEN:通常用在服务的监听port。可使用“-l”参数查阅。

基本上,我们常常谈到netstat的功能,可以用来观察网络的联机状态,而网络联机状态中,又以观察“我目前开了多少port在等待客户端的联机”以及“目前我的网络联机状态中,有多少联机已建立或产生问题”最常见。那你如何了解与观察呢?通常鸟哥是这样处理的:

范例三:显示出目前已经启动的网络服务
[root@linux ~]# netstat -tulnp
Active Internet connections (only Servers)
Proto Recv-Q Send-Q Local Address  Foreign Address  State   PID/Program name
tcp        0      0 0.0.0.0:25      0.0.0.0:*         LISTEN  2141/master
tcp        0      0 :::22            :::*               LISTEN  1924/sshd
tcp        0      0 :::25            :::*               LISTEN  2141/master
udp        0      0 127.0.0.1:53   0.0.0.0:*                   1911/named
# 上面最重要的其实是那个 -l 的参数,因为可以列出只有在 Listen 的 port

你可以在上面的范例中发现,我的网络联机仅对外开放port 25以及port 22(因为针对0.0.0.0开放),至于port 53则仅针对内部的127.0.0.1开放,所以是不对Internet开放这个服务的。而其中port 22、port 25都是使用TCP数据包,至于port 53则是开放在UDP数据包的状态。再仔细地看,每一行输出的最右边,你可以发现鸟哥的主机port 22是由sshd这个程序所启动的,并且它的PID是1924。看到这里,聪明的你应该知道,我该如何关闭这个port了吧?使用kill或killall即可。

范例四:观察本机上头所有的网络联机状态
[root@linux ~]# netstat -atunp
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:25           0.0.0.0:*            LISTEN       2141/master
tcp        0      0 :::22                 :::*                  LISTEN       1924/sshd
tcp        0      0 :::25                 :::*                  LISTEN       2141/master
tcp        0     68 192.168.1.100:22   192.168.1.210:1504  ESTABLISHED 30417/sshd:
udp        0      0 127.0.0.1:53        0.0.0.0:*                            1911/named

注意范例四的特殊字体,代表目前已经建立联机的一条网络连接,它是由远程主机192.168.1.210启动一个大于1024的端口,向本地端主机192.168.1.100的port 22进行联机的一条连接,你需要想起来的是:Client端是随机取一个大于1024的port进行联机,此外只有root可以启动小于1023的port,这样就能明白上面的那条连接了。如果你想要断开这条连接的话,查看最右边的30417/sshd后直接kill就可以了。

至于传统的Unix socket的数据,使用man netstat查阅一下吧。这个Unix socket通常用于一些仅在本机上运行的程序所打开的接口文件,例如X Window不都是在本机上运行吗?那何必启动网络的port呢?当然可以使用Unix socket了,另外,例如Postfix这一类的网络服务器,由于很多操作都是在本机上完成的,所以会占用很多的Unix socket。

例题1:请说明在Linux当中服务名称与Port Number的对应,是用哪个文件来设置的?

答:/etc/services

【责任编辑:董书 TEL:(010)68476606】

回书目   上一节   下一节

分享到:

  1. Linux服务器配置全程实录
  2. 揭秘--优秀PPT这样制作

热点职位

更多>>

热点专题

更多>>

读书

《广域网》
在开始学习WAN资料时,我经常面对资料深度不够或者为电气工程师编写的书。另外,在看了几本书,并且对Internet进行了研究以后,

51CTO旗下网站

领先的IT技术网站 51CTO 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i 51CTO学院 区块链第一聚合媒体 zhijiapro