寻源问脉 – Linux网络自诊查工具 netstat

Linux 提供了强大的网络功能,网络的连贯、通畅,是基于网络的业务开展的基本前提。为此,Linux 提供了一系列工具,协助诊查网络中各条“经脉(连接)”的畅通性、各个“神经元(主机)”的活跃情况及基本信息。

本机网络情况自诊察 — netstat

开展网络服务,首先,要了解本机的网络连接情况,至少要关注以下几个方面的内容:

  • 本机到底有多少网络接口及其具体情况(网络接口及信息)
  • 每个网络接口对外的通路构建情况(每个网络接口的路由表)
  • 本机对外的所有连接情况
    • TCP 连接情况
    • UDP 连接情况

每个操作系统都为上述需求提供了解决方案,Linux 也不例外。Linux 中也有很多工具可以用于提供上述信息,其中,netstat 为上述需求提供了全面的解决方案。

netstat 的基本格式为:

netstat [parameter]|[parameter]|...|[parameter]

1、通用附加参数

-n (numeric)

-n,是 numeric 的缩写,顾名思义,即将 netstat 指令输出中的所有内容都进行数字化显示。在网络中,主机名和网络服务的名称,都可以有字符串和数字(IP地址/端口号)两种表现形式,使用该参数,则一律用数字形式展示,清晰明了。涉及端口和连接查询的指令中建议都加上该选项

2、查看本机的网络接口信息

netstat -ie

-i,是 interface 的含义,使用该参数,则显示本机上所有的网络接口信息。
-e,是 extend 的含义,显示更多额外信息。
该命令与 ifconfig 等价。

3、查看本机各个网络接口路由表信息

netstat -r

-r,为 route 的含义,显示本机操作系统内核路由表信息。
该命令与 route -e 等价。

4、查看本机对外连接情况

1)、大而全 — 查看所有连接信息

netstat -an

-a 即代表 all,该指令囊获了本机当前所有连接的信息,这些连接信息主要可分为两大部分内容:

  • TCP/IP 的网络接口部分
  • 传统 Unix 的 socket 部分

基于信息全集,可进一步利用参数显示特定连接信息。

2)、特定连接信息

参数名 作用
t 显示 TCP 连接
u 显示 UDP 连接
l 显示处在 listening 状态的连接
p 显示每个连接所对应的 PID 和 program 名称

所有连接信息除了 TCP/IP 信息外,还包括 Unix 的 socket 信息,如果只关注网络连接,可以将 Unixt 的 socket 信息通过特定参数屏蔽掉。

3)、连接信息持续性更新

netstat -c number

本机的连接信息是持续变化的,而通过 netstat 显示出来的只是一个时刻的连接状态,是一个连接信息的“时刻切片”,利用 -c 参数可以持续性的显示连接信息,动态更新当前的连接情况。

5、典型应用分析

eg. 查看本机启动的网络服务

启动基于网络的服务,则服务一定处于“监听”的状态,利用 netstat -tunlp 可以显示本机所启动的网络服务。

pic-netstat-1

本机网络服务通过表格形式呈现出来,具体的各列含义如下:

参数名 含义
proto 协议名
Recv-Q 接收队列信息。State 为 Established 时,为连接到该 socket 程序未拷贝走的 byte 数
Send-Q 发送队列信息。State 为 Established 时,为远程主机为接收的 byte 数
Local Address 本地地址及端口号
Foreign Address 远程主机及端口号
State 连接状态信息
PID/Program 连接所属进程的 PID 和程序名称

Local Address 和 Foreign Address 中涉及两个特殊的地址:0.0.0.0 和 127.0.0.1 。

  • 0.0.0.0 不是一个真正意义上的 IP 地址,它代表的是 “所有不清楚的主机” 的集合,有些“变量”的意思
    • 当它用于 Local Address 时,0.0.0.0 指代是本机上的所有 IPv4 地址,本质上真正表示“本网络中的本机”,而其开放的端口则代表本机的一个对外开放的可访问的服务。
    • 使用带有不确定性的 0.0.0.0,可以充分发挥其变量的代表性,尤其是当主机有多个 IP 的时候,可以用统一的格式描述所有 IP 上的共性服务。在实际应用中,在服务端绑定端口的时候可以选择绑定到 0.0.0.0,这样服务访问方就可以通过本机的多个 IP 地址进行访问同一个服务。
      (本质上是多个 IP 共享服务的一种便捷的表示形式)

      • 例如,一个主机有两个IP地址,192.168.1.1 和 10.1.2.1,并且该主机上的一个服务监听的地址是 0.0.0.0,那么通过两个 IP 地址都能够访问该服务。
      • 例如,有一台服务器,一个外放地址A,一个内网地址B,如果绑定的端口指定了 0.0.0.0,那么通过内网地址或外网地址都可以访问应用。但是如果只绑定了内网地址,那么通过外网地址就不能访问。所以如果绑定 0.0.0.0,也有一定安全隐患,对于只需要内网访问的服务,可以只绑定内网地址
    • 0.0.0.0 的模糊手法表示公用服务的模式,仅仅在服务器进行服务监听时可以利用这种便捷的表示方法;当服务器与外部连接建立后,在具体连接中,0.0.0.0 则一定会被具体的 IP 所替换
      (监听可以是“虚监听”,但连接一定是“实连接”)
    • 当它用于 Foreign Address 时,代表任意外部 IP。
  • 127.0.0.1,本身是内部回环网络接口,是一个虚拟接口,系统用它来“自言自语”。

通过显示结果分析,也可见本机服务的一些特点。从 Local Address 入手,0.0.0.0 是对外开放的,可以通过服务域名、ip 访问的;127.0.0.1 只能对本机访问,很多的网络服务(端口)仅仅针对本机的 127.0.0.1 开放,这意味着,internet 是连接不到该端口的,localhost 接口上的服务是不对外开放的,从某种程度上说,这也是对此端口安全性的一种保护。

reference:

  1. 《鸟哥的私房菜》
  2. 《The Linux command line》
  3. http://www.cnblogs.com/lemon-flm/p/7396536.html
  4. https://blog.csdn.net/ismr_m/article/details/68926508

发表评论

电子邮件地址不会被公开。 必填项已用*标注