目录:
(一)netstat简介
(二)netstat语法指南
(三)实战演练
(四)netstat小结
(一)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的一个连接。
(二)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
—————— 本文至此结束,感谢阅读 ——————
原文地址:https://blog.51cto.com/13613726/2461898
时间: 2024-11-05 21:55:15