目录:
(一)netstat简介
(二)netstat语法指南
(三)实战演练
(四)netstat小结php
(一)netstat简介
(1.1)在Internet的RFC标准中,netstat的定义是:netstat是在内核中访问网络链接状态及相关信息的程序,它能提供TCP链接、在TCP和UDP监听、进程内存管理的相关报告。netstat是控制台命令,是一个监控TCP/IP网络的很是有用的工具,它能够显示路由表、实际的网络链接以及每个网络接口设备的状态信息。netstat用于显示IP、TCP、UDP和ICMP协议相关的统计数据,通常用于检验本机各端口的网路链接状况。若是你的计算机有时候接收到的数据包致使出错数据或故障,你没必要感到奇怪,TCP/IP能够允许这些类型的错误,并可以自动重发数据包。但若是累积的出错状况数目占到所接收的IP数据报至关大的百分比,或者它的数目正迅速增长,那么你就应该使用netstat查一查为何会出现这些状况了。netstat命令的功能是显示网路链接、路由表和网络接口信息,可让用户得知有哪些网络链接正在运做。使用时若是不带参数,netstat显示活动的TCP链接。
(1.2)咱们的服务器常常会搭建网站同时会对外提供服务,不少时候咱们想要监控服务器的TCP链接信息、UDP链接信息、或者查询有多少个用户链接到咱们的服务器等,每一个用户创建了多少个链接,所以对咱们来讲不论是对服务器的流量统计,对服务器的性能优化,或者对服务器的性能统计,那么此时咱们可使用netstat命令对咱们的服务器进行专门的信息统计,而且统计的网络信息也是很是全面的。
(1.3)咱们输入netstat命令,在系统中显示了两列的内容,其中第一列默认列出了当前互联网的链接信息,第二列表示的是当前UNIX的sockets的一个链接。web
(二)netstat语法指南
(2.1)若是咱们须要显示全部TCP链接的信息,咱们可使用“-at”参数,其中a参数表示全部信息,t参数表示tcp的链接,显示出来咱们全部TCP监听的端口,包括咱们所链接的TCP信息。若是咱们使用“-au”参数,表示显示全部的UDP链接的信息,且咱们知道UDP链接的信息是无状态的。
# netstat -at
# netstat -au
(2.2)若是咱们但愿列出当前服务器中全部TCP和UDP正在监听的端口,此时咱们可使用“-l”参数,表示列出相关符合要求的信息。好比咱们如今搭建了一个web服务,咱们但愿如今查看一下服务运行的是否正常,咱们可使用“-lt”参数查看一下当前系统的80端口是否有监听的状态。
# netstat -ltu
(2.3)若是咱们须要监控咱们系统实时更新的链接状态,咱们可使用“-c”参数。
# netstat -c---查看咱们的系统实时更新的链接状态
(2.4)若是咱们须要查看系统中TCP链接的状况,而且查询的时候不须要逆向解析,此时咱们可使用“-tn”参数(图1-6),若是咱们须要查询当前系统全部链接的数量,可使用“wc -l”进行统计。
# netstat -tn
# netstat -tn | wc -l
(2.5)若是咱们须要查询当前系统全部访问咱们服务器22端口的链接的统计,这样即可以很是精确的显示到端口的统计信息了。
# netstat -tn | grep 192.168.26.101:22 | wc -l
(2.6)若是咱们但愿对显示的数据进行排序统计,咱们使用“-tunl”其中t表明的TCP、u表明的是UDP、n表明的是直接使用IP地址不ton过域名服务器、l表示的是显示监控中的服务器socket、p表明的是显示正在使用socket的程序识别码和程序名称,此时咱们能够先使用“grep :123”获取全部为123端口的列表项,而后使用“awk '{print $4}'”获取第四列的信息包括IP地址与端口号,接着使用“awk -F":" '{print $1}'”获取IP地址信息,而后使用“sort”命令进行排序,使用“uniq -c”命令进行去重,最后使用“sort -r -n”其中-n表示按照数字进行排序,-r表示逆向进行排序。
注意:sort -u命令和sort | uniq -c意义相同
# netstat -tunl | grep :123 | awk '{print $4}'| awk -F":" '{print $1}'| sort | uniq -c | sort -r -n
(2.7)利用netstat指令可让你知道整个Linux系统的网络情况
参数:
-a:显示全部连线中的socket
-A:<网络类型>列出该网络类型连线中的相关地址
-c或-continuous:持续列出网络状态
-C或-cache:显示路由器配置的快取信息
-e或-extend:显示网络其余相关信息
-F或-fib:显示FIB
-g或-groups:显示多重广播功能群组组员名单
-h或-help:在线帮助
-i或-interfaces:显示网络界面信息表单
-l或-listening:显示监控中的服务器的socket
-M或-masquerade:显示假装的网络连线
-n或-numeric:直接使用IP地址,而不经过域名服务器
-N或-netlink或-symbolic:显示网络硬件外围设备的符号链接名称
-o或-timers:显示计时器
-P或-programs:显示正在使用socket的程序识别码和程序名称
-r或-route:显示Routing Table
-s或-statistice:显示网络工做信息统计表
-t或-tcp:显示TCP传输协议的连线情况
-u或-udp:显示UDP传输协议的连线情况
-v或-verbose:显示指令执行过程
-V或-version:显示版本信息
-w或-raw:显示RAW传输协议的连线情况
-x或-unix:此参数的效果和指定“-A unix”参数相同
-ip或-inet:此参数的效果和指定“-A inet”参数相同
(2.8)网络链接状态详解
共有12种可能的状态,前面11种是按照TCP链接创建的三次握手和TCP链接断开的四次握手过程来描述的。
(2.8.1)LISTEN:首先服务端须要打开一个socket进行监听,状态为LISTEN。(The socket is listening for incoming connections.)侦听来自远端TCP端口的链接请求。
(2.8.2)SYN_SENT:客户端经过应用程序调用connect进行active open,因而客户端tco发送一个SYN以请求创建一个链接,以后状态置为SYN_SENT。(The socket is actively attempting to establish a connection.)在发送链接请求后等待匹配的链接请求。
(2.8.3)SYN_RECV:服务端应发出ACK确认客户端的SYN,同时本身向客户端发送一个SYN,以后状态置为SYN_RECV。(A connection request has been received from the network.)在收到和发送一个链接请求后等待对链接请求的确认。
(2.8.4)ESTABLISHED:表明一个打开的链接,双方能够进行或已经在数据交互了。(The socket has an established connection.)表明一个打开的链接,数据能够传递给用户。
(2.8.5)FIN_WAIT1:主动关闭(active close)端应用程序调用close,因而其TCP发出FIN请求主动关闭链接,以后进入FIN_WAIT1状态。(The socket is closed,and the connection is shutting down,waiting for the socket to close.)等待远程TCP的链接中断请求,或先前的链接中断请求的确认。
(2.8.6)CLOSE_WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也做为文件结束符传递给上层应用程序),并进入CLOSE_WAIT,(The remote end has shut down,waiting for teh socket to close.)等待从本地用户发来的链接中断请求。
(2.8.7)FIN_WAIT2:主动关闭端接收到ACK后,就进入了FIN-WAIT-2。(Connection is closed,and the socket is waiting for a shutdown from the remote end.)从远程TCP等待链接中断请求。
(2.8.8)LAST_ACK:被动关闭一段时间后,接收到文件结束符的应用程序将调用CLOSE关闭链接。这致使它的TCP也发送一个FIN,等待对方的ACK,就进入了LAST-ACK。(The remote end has shut down,and the socket is closed,waiting for acknowledgement.)等待原来发向远程TCP的链接中断请求的确认。
(2.8.9)TIME_WAIT:在主动关闭接收到FIN后,TCP就发送ACK包,并进入到TIME-WAIT状态。(The socket is waiting after close to handle packets still in the network.)等待足够的时间以确保远端TCP接收到链接中断请求的确认。
(2.8.10)CLOSING:比较少见。(Both sockets are shut down but we still don’t have all our data sent.)等待远程TCP对链接中断的确认。
(2.8.11)CLOSED:被动关闭端在接收到ACK包后,就进入了closed的状态,链接结束。(The socket is not being used.)没有任何链接状态
(2.8.12)UNKNOWN:未知的socket状态。(The state of the socket is unknown.)
(2.9)SYN:(同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手创建TCP链接时有效。表示一个新的TCP链接请求。
ACK:(确认编号,Acknowledgement Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收全部数据。
FIN:(结束标志,Finish)用来结束一个TCP会话,但对应端口仍处于开放状态,准备接收后续数据。数据库
(三)实战演练
(3.1)查看TCP链接状态
# netstat -nat | awk '{print $6}'| sort |uniq -c|sort -r -n---以倒序的方式显示全部TCP的链接状态
(3.2)查看ESTABLISHED的链接状态。可能你在其它语言见过int a[10];这表明有10个元素的数组,下标为0,1,2,3...,9。而awk的下标是字符串,说白了,像极了hash,好比a[“hello”]=’world’,只不过咱们称之为数组,同时,你要明白NF是字段数,number of filed。好比某一行文件为hello world,那么NF为2可是加上$,即$NF就表明第二个字段的内容,那么$NF为world,如今回到正文,++S[$NF],就优势相似于,用字典统计文件,好比hello world hello,那么++S[$NF]的结果就是s[“hello”]=2,s[“world”]=1,/^tcp/表示对每一行进行正则匹配,由于咱们netstat会产生udp的行,因此咱们要用正则过滤,最后print a,S[a]就很容易懂了,就是:2 hello,1 world。
# netstat -n | awk '/^tcp/ {++S[$NF]}END {for(a in S) print a,S[a]}'---此时咱们发现netstat -n第一列的ESTABLISHED的值为1
# netstat -n | awk '/^tcp/{++state[$NF]}END{for(key in state)print key,"\t",state[key]}'---此时咱们发现netstat -n第一列的ESTABLISHED的值为1
# netstat -n | awk '/^tcp/{++arr[$NF]}END {for(k in arr)print k,"\t",arr[k]}'---此时咱们发现netstat -n第一列的ESTABLISHED的值为1
# netstat -n | awk '/^tcp/{print $NF}' | sort| uniq -c | sort -rn---统计ESTABLISHED出现的次数
# netstat -ant | awk '{print $NF}'| grep -v '[a-z]'| sort | uniq -c---统计全部状态出现的次数
(3.3)查找请求数的前20个IP
# netstat -anlp | grep 80 | grep tcp| awk '{print $5}'| awk -F: '{print $1}'| sort | uniq -c| sort -rn|head -n20---查找请求数的前20个IP
# netstat -ant | awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for (i in A)print A[i],i}'| sort -rn| head -n20---查找请求数的前20个IP
(3.4)用tcpdump嗅探80端口的访问看看谁最高
# tcpdump -i eno16777728 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}'| sort | uniq -c | sort -nr | head -20
(3.5)查找较多time_wait链接。
# netstat -n | grep TIME_WAIT | awk '{print $5}'| sort|uniq -c| sort -rn | head -n20
(3.6)查询较多的SYN链接。
# netstat -an | grep SYN| awk '{print $5}'| awk -F: '{print $1}' | sort | uniq -c | sort -rn |more
(3.7)根据端口列进程
# netstat -tnlp | grep 80 | awk '{print $7}'| cut -d/ -f1
(3.8)网站日志分析篇,得到访问前10位的IP地址
# cd /etc/httpd/logs/---进入到web服务日志存放的位置
# cat /etc/httpd/logs/access_log---查看web服务日志存放的位置
# cat access_log | awk '{print $1}'| sort | uniq -c | sort -rn | head -10
# cat access_log | awk '{counts[$(11)]+=1}END{for(url in counts)print counts[url],url}'
(3.9)访问次数最多的文件或页面,取前20
# cd /etc/httpd/logs/---进入到web服务日志存放的位置
# cat access_log | awk '{print $11}' | sort | uniq -c| sort -rn | head -20
(3.10)列出传输最大的几个exe文件(分析下载站的时候经常使用)
# cd /etc/httpd/logs/---进入到web服务日志存放的位置
# cat access_log |awk '($7~/.exe/){print $10 " " $1 " " $4 " " $7}'|sort -nr|head -20
(3.11)列出输出大于200000byte(约200kb)的exe文件以及对应的文件发生次数
# cd /etc/httpd/logs/---进入到web服务日志存放的位置
# cat access_log | awk '($10 > 200000 && $7~/.exe/){print $7}'| sort -n| uniq -c | sort -rn |head -10
(3.12)若是日志最后一列记录的是页面文件传输时间,则列出到客户端最耗时的页面
# cd /etc/httpd/logs/---进入到web服务日志存放的位置
# cat access_log |awk '($7~/.php/){print $NF " " $1 " " $4 " " $7}'|sort -nr|head -10
(3.13)列出最耗时的页面(超过60秒)以及对应页面发生次数。
# cd /etc/httpd/logs/---进入到web服务日志存放的位置
# cat access_log |awk '($NF > 60 && $7~/.php/){print $7}'|sort -n|uniq -c|sort -nr|head -10
(3.14)列出传输时间超过30秒的文件
# cd /etc/httpd/logs/---进入到web服务日志存放的位置
# cat access_log |awk '($NF > 30){print $7}'|sort -n|uniq -c|sort -nr|head -20
(3.15)统计网站流量
# cd /etc/httpd/logs/---进入到web服务日志存放的位置
# cat access_log |awk '{sum+=$10} END {print sum/1024/1024/1024}'
(3.16)统计404的链接
# cd /etc/httpd/logs/---进入到web服务日志存放的位置
# awk '($9~/404/)' access_log | awk '{print $9,$7}' | sort
(3.17)统计http status,http状态统计
# cd /etc/httpd/logs/---进入到web服务日志存放的位置
# cat access_log-20190825 | awk '{counts[$(9)]+=1}END{for(code in counts)print code,counts[code]}'
(3.18)查看哪些蜘蛛在抓取内容
# /usr/sbin/tcpdump -i ens32 -l -s 0 -w - dst port 80 | strings | grep -i user-agent | grep -i -E 'bot|crawler|slurp|spider'
(3.19)按域统计流量
# zcat squid_access.log.tar.gz| awk '{print $10,$7}' |awk 'BEGIN{FS="[ /]"}{trfc[$4]+=$1}END{for(domain in trfc){printf "%s\t%d\n",domain,trfc[domain]}}'
(3.20)查看数据库执行的SQL
# /usr/sbin/tcpdump -i ens32 -s 0 -l -w - dst port 3306 | strings | egrep -i 'SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|CALL'数组
(四)netstat小结
(4.1)列出全部端口状况
# netstat -a---列出全部端口
# netstat -at---列出全部的TCP端口
# netstat -au---列出全部UDP端口
(4.2)列出全部处于监听状态的Socket
# netstat -l---只显示监听端口
# netstat -lt---显示监听TCP端口
# netstat -lu---显示监听UDP端口
# netstat -lx---显示全部Unix端口
(4.3)显示每一个协议的统计信息
# netstat -s---显示全部端口的统计信息
# netstat -st---显示全部TCP的统计信息
# netstat -su---显示全部UDP的统计信息
(4.4)显示PID和进程名称
# netstat -p
# netstat -pt
(4.5)显示核心路由信息
# netstat -r---显示核心路由信息
# netstat -rn---显示数字格式,不查询主机名称
(4.6)查看端口和服务
# netstat -antp | grep ssh---查看服务
# netstat -antp | grep 22---查看端口
(4.7)在netstat输出中不显示主机,端口和用户名(host, port or user)
# netstat -an
若是只是不想让这三个名称中的一个被显示,使用如下命令
# netstat -a --numeric-ports
# netstat -a --numeric-hosts
# netstat -a --numeric-users
(4.8)持续输出netstat信息
# netstat -c---将每隔1秒输出网络信息
(4.9)显示系统不支持的地址族
# netstat --verbose
(4.10)显示网路接口列表
# netstat -i
# netstat -ie---显示详细信息,像是ifconfig列表信息
(4.11)查看连接某服务端口最多的IP地址
# netstat -ant | grep "192.168.26.50:22" | awk '{print $5}'| awk -F: '{print $1}'|sort | uniq -c| sort -rn| head -10
(4.12)显示TCP各类状态列表
# netstat -ant | awk '{print $6}'| sort | uniq -c | sort -rn性能优化
—————— 本文至此结束,感谢阅读 ——————服务器