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
可以显示本机所启动的网络服务。
本机网络服务通过表格形式呈现出来,具体的各列含义如下:
参数名 | 含义 |
---|---|
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:
- 《鸟哥的私房菜》
- 《The Linux command line》
- http://www.cnblogs.com/lemon-flm/p/7396536.html
- https://blog.csdn.net/ismr_m/article/details/68926508