【我的Linux,我做主!】实战--使用netstat监控网络连接信息

目录:
(一)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

【我的Linux,我做主!】实战--使用netstat监控网络连接信息的相关文章

netstat 显示网络连接,路由表,接口状态命令

功能: 显示网络连接,路由表,接口状态,伪装连接,网络链路信息和组播成员组 格式: netstat [-vWeenNcCF] [<Af>] -r netstat {-V|--version|-h|--help} netstat [-vWnNcaeol] [<Socket> ...] netstat { [-vWeenNac] -I[<Iface>] | [-veenNac] -i | [-cnNe] -M | -s [-6tuw] } [delay] 选项: OPTIO

Linux网络监控工具--netstat及网络连接分析

netstat命令用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况 -a     (all)显示所有选项,默认不显示LISTEN相关    -t     (tcp)仅显示tcp相关选项    -u     (udp)仅显示udp相关选项    -n     拒绝显示别名,能显示数字的全部转化成数字    -l     仅列出有在 Listen (监听) 的服務状态 -p     显示建立相关链接的程序名    -r     显示路由信息,路由表    -e     

可购买了:《高性能Linux服务器构建实战Ⅱ》已正式发行!

由国内著名技术社区51CTO鼎力推荐.华章图书出品.2014年南非蚂蚁(高俊峰)最新技术力作:<高性能Linux服务器构建实战----系统安全.故障排查.自动化运维与集群架构>,已经上架发行,此书是<高性能Linux服务器构建实战---运维监控.性能调优.集群应用>的姊妹篇,仍然沿用了实战.实用.通俗.易懂的写作特点,在内容上更加实战化,从运维的多个方面以近似真实的环境介绍运维工作中的各个方方面面,此书新增加了运维中很容易忽略但是又是非常重要的安全章节,这部分内容是本书的一大亮点,

千呼万唤始出来!《高性能Linux服务器构建实战Ⅱ》出版在即

经过近2年的酝酿,几个月的修正,<高性能Linux服务器构建实战Ⅱ----系统安全.故障排查.自动化运维与集群架构>一书出版在即,马上就要与读者见面了. <高性能Linux服务器构建实战Ⅱ----系统安全.故障排查.自动化运维与集群架构>仍 然沿用了<高性能Linux服务器构建实战---运维监控.性能调优.集群应用>的写作特点:实战.实用.通俗.易懂的特点,而在内容上更加实战化,从运 维的多个方面以近似真实的环境介绍运维工作中的各个方方面面,与第一本书不同的是,此书新增

linux运维好书《高性能Linux服务器构建实战Ⅱ》已出版发售,附封面照!

经过近2年的酝酿,几个月的修正,<高性能Linux服务器构建实战Ⅱ----系统安全.故障排查.自动化运维与集群架构>一书出版在即,马上就要与读者见面了. <高性能Linux服务器构建实战Ⅱ----系统安全.故障排查.自动化运维与集群架构>仍 然沿用了<高性能Linux服务器构建实战---运维监控.性能调优.集群应用>的写作特点:实战.实用.通俗.易懂的特点,而在内容上更加实战化,从运 维的多个方面以近似真实的环境介绍运维工作中的各个方方面面,与第一本书不同的是,此书新增

linux运维好书推荐:《高性能Linux服务器构建实战Ⅱ》热销中,附实例源码下载

由国内著名技术社区ChinaUnix.51CTO鼎力推荐.华章图书出品.2014年南非蚂蚁(高俊峰)最新技术力作:<高性能Linux服务器构建实战----系统安全.故障排查.自动化运维与集群架构>,已经上架发行,此书是<高性能Linux服务器构建实战---运维监控.性能调优.集群应用>的姊妹篇,仍然沿用了实战.实用.通俗.易懂的写作特点,在内容上更加实战化,从运维的多个方面以近似真实的环境介绍运维工作中的各个方方面面,此书新增加了运维中很容易忽略但是又是非常重要的安全章节,这部分内

Linux常用命令(十三)基础网络设置

Linux常用命令(十三)基础网络设置 本篇内容实验环境为Redhat 6.5系统 一.查看及测试网络 查看及测试网络配置时管理Linux网络服务的第一步.其中本篇中大多数命令以普通用户权限就可以完成操作.   1.查看网络配置 1.1).使用ifconfig命令查看网络接口地址 主机的网络接口卡(网卡)通常称为"网络接口".在Linux系统中,使用ifconfig命令可以查看网络接口的地址配置信息. 查看活动的网络接口设备 当ifconfig命令不带任何选项和参数时,将显示当前主机中

linux运维实战练习-正则表达式

一.linux运维实战练习题及解答 1.显示/etc/passwd文件中以bash结尾的行 2.显示/etc/passwd文件中的两位数或三位数 3.显示`netstat -tan`命令结果中以'LISTEN'后跟0个.1个或者多个空白字符结尾的行 4.添加用户bash.testbash.basher以及nologin用户(nologin用户的shell为/sbin/nologin):而后找出/etc/passwd文件中用户名与其shell名相同的行 5.显示当前系统上root.centos或者

Linux命令(33):netstat命令-显示网络端口信息

netstat命令 功能说明 netstat命令用来显示本机网络连接.运行端口和中由表等信息,用法如下: netstat [选项] 常用参数 选项 说明 -a 显示本机所有连接和监听端口 -n 以网络IP地址的形式显示当前建立的有效连接和端口 -r 显示路由表信息 -s 显示按协议的统计信息.默认情况下,将显示IP.IPV6.ICMP.ICMPv6.TCP.TCPv6.UDP和UDPv6的统计信息 -v 显示当前的有效连接,与"-n"选项类似 -t 显示所有的TCP协议连接情况 -u