原文链接:https://www.jellythink.com/archives/472
netstat
命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,同时还可用于检验本机各端口的网络连接情况。服务器有时候接收到的数据包导致数据出错或故障,不必感到奇怪,TCP/IP可以容许这些类型的错误,并能够自动重发数据报。但如果累计的出错情况数目占到所接收的IP数据报相当大的百分比,或者它的数目正迅速增加,那么我们就应该使用netstat
查一查为什么会出现这些情况了。
常用选项说明如下:
-a
:显示所有选项,默认不显示LISTEN相关-t
:仅显示tcp相关选项-u
:仅显示udp相关选项-n
:拒绝显示别名,能显示数字的全部转化成数字-l
:仅列出有在Listen(监听)的服务状态-p
:显示建立相关连接的程序名-r
:显示路由信息,路由表-e
:显示扩展信息,例如uid等-s
:按各个协议进行统计-c
:每隔一个固定时间,执行该netstat命令-i
:显示网卡接口信息
LISTEN和LISTENING的状态只有用-a
或者-l
才能看到
命令:netstat -a
说明:列出所有连接
输出:
输出主要包含两部分:
- Active Internet connections (servers and established),称为有源TCP链接,包括TCP和UDP等的详细状态;
- Active UNIX domain sockets (servers and established),称为有源Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍);
有源TCP连接字段详解:
有源TCP连接字段详解:
Proto
:当前连接的协议;如TCP、UDP;Recv-Q
:网络接收队列;Send-Q
:网络发送队列;接收队列和发送队列一般都应该是0,如果不是则表示数据包正在队列中堆积,但是这种情况比较少见;Local Address
:本机的ip:port(注意此处127.0.0.1默认显示主机名,0.0.0.0默认显示*,端口可能显示别名。若强制显示数字,加-n
参数)Foreign Address
:对端ip:port;与Local Address
规则相同State
:当前套接字的网络状态,有以下几种状态:LISTEN
:监听来自其它TCP端口的连接请求SYN-SENT
:再发送连接请求后等待匹配的连接请求(如果有大量这样的状态包,检查是否中招了)SYN-RECEIVED
:再收到和发送一个连接请求后等待对方对连接请求的确认(如有大量此状态,估计被flood攻击了)ESTABLISHED
:代表一个打开的连接FIN-WAIT-1
:等待远程TCP连接中断请求,或先前的连接中断请求的确认FIN-WAIT-2
:从远程TCP等待连接中断请求CLOSE-WAIT
:等待从本地用户发来的连接中断请求CLOSING
:等待远程TCP对连接中断的确认LAST-ACK
:等待原来的发向远程TCP的连接中断请求的确认(不是什么好东西,此项出现,检查是否被攻击)TIME-WAIT
:等待足够的时间以确保远程TCP接收到连接中断请求的确认CLOSED
:没有任何连接状态
命令:netstat -antp
说明:以数字的形式显示所有的TCP连接,并显示对应程序所监听的端口号
输出:
命令:netstat -anup
说明:以数字的形式显示所有的UDP连接,并显示对应程序所监听的端口号
输出:
命令:netstat -st
说明:统计TCP协议相关的网络统计数据
命令:netstat -rn
说明:打印内核路由信息
输出:
输出内容详解:
Destination
:目标网络或目标主机Gateway
:网关地址,如果没有就显示星号Genmask
:网络掩码,0.0.0.0
表示默认路由Flags
:标志位,有以下常用取值:U
:表示该路由是启动的H
:目标是一部主机(IP)而非网域G
:需要透过外部的主机(gateway)来转递封包
Iface
:网络接口名
命令:netstat -ie
说明:显示网络接口信息
输出:
命令:netstat -a|grep 6379
说明:查看某个端口是否被占用
如果你遇到“Address already in use”的错误,那么你就需要好好看看是不是端口已经被占用了。-a(all)参数用于列出所有监听和非监听状态的连接。
这里我们可以看到,有一个tcp连接使用了6379端口,并且当前处于LISTEN状态
命令:netstat -ap|grep 6379
说明:查找占用端口的进程
前面虽然知道已经有进程使用了6379端口,但是不知道是哪个进程,因此为了知道进程信息,需要使用-p(program)参数:
这个时候就可以看到是进程id为10011的redis-server进程占用了6379端口
命令:netstat -ent
说明:查看用户和连接的iNode
可以看到在使用-e参数后,多了最后两列,分别是user和Inode。而使用id命令可以知道该user到底是谁:
常用脚本
- 统计TCP各个状态数量
netstat -n | awk '/^tcp/{++state[$NF]}; END{for(key in state) print key, " ", state[key]}'
通过上面的脚本,我们可以快速的统计中当前TCP每个状态的数量,通过这个数量,我们就可以大致知道服务器TCP连接当前的健康状态。
-
统计连接某服务端口最多的IP地址
netstat -nat | grep ":80" | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -20