io、free、ps、netstat命令、Linux下抓包

丶灬走出姿态 提交于 2019-11-29 16:58:31

 

1、监控 io 性能

 

这个 iostat 命令,在安装 sar 命令的时候,就一起安装了,所以不用重新安装。具体用法见下图,

iostat 命令和 vmstat 挺像的,输入 iostat 可以直接查看磁盘显示情况,输入 iostat 1 就是每隔1秒显示一次,是动态命令,使用 ctrl + c 结束命令。sda 和 sdb 表示磁盘,第3 列和第4 列表示读和写的速度。这个命令没什么用处,因为命令 sar -b 也可以看出这些信息。

接着往下介绍命令 iostat -x 1,见下图,

这个命令有一个非常重要的指标 %util ,表示 io 等待,在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。

还有一个命令 iotop ,需要安装,见下图,

iotop 命令和 top 命令很像,也是动态显示,输入命令 iotop ,回车,见下图,

可以看到排序,但是 io 没有什么读写信息,也就没有什么排序。按字母 q 退出。

 

2、free 命令

 

直接查看内存使用状况。输入 free ,回车,见下图,

可以看到当前系统的总内存大小以及使用内存的情况,单纯的 free 命令单位是 KB ,-m 选项的单位是 M ,-g 选项的单位是 G,-h 选项是智能的显示单位。其中,第2行是内存使用情况,第3行是 swap的使用情况。我们关注的是第2行的数据,从上例中可看到当前系统内存总大小为999936 KB,已经使用118532 KB,剩余578680 KB,共享6832 KB。 系统初始化时,就已经分配出很大一部分内存给缓存(buff/cache),这部分缓存用来随时提供给程序使用,如果程序不用,那这部分内存就空闲。CPU 和磁盘之间,需要通过内存来缓存。从磁盘到CPU之间的内存叫 cache ,从CPU到磁盘之间的内存叫 buffer。

公式:total=used+free+buff/cache。

avaliable包含free和buffer/cache剩余部分。

 

3、ps 命令

 

 

作为系统管理员,一定要知道你所管理的系统都有那些进程在运行,在windows下只要打开任务管理器即可查看。在linux下呢?其实在上面介绍的top命令就可以,但是不容易看,还有专门显示系统进程的命令 ps ,静态显示出来进程情况。

先输入命令 man ps ,回车,来查看一下 ps 的功能,见下图,

可以看到 ps 的作用是报告当前流程的快照。

接着来看一下 ps 的用法,见下图,

ps aux 命令显示当前系统的所有进程,它经常会连同管道符一起使用,用来查看某个进程或者它的数量,见下图,

ps 还有一种用法,见下图,

-elf 的用法和 aux 大同小异,显示的信息基本上是一样的,不一一截图了。这两种方法就是看个人喜好。

接着介绍 ps aux 命令结果里面几个参数的意义:

USER:进程的运行用户

PID :进程的id,这个id很有用,在linux中内核管理进程就得靠pid来识别和管理某一个程序,比如我想终止某一个进程,则用 kill  进程的pid 有时并不能杀掉,则需要加一个-9选项了 kill  -9  进程pid

现在假设 PID 为509的进程是非法进程,先查看一下进程的目录,看看进程是从哪边启动起来的,就是下图红色框框绿色字体的内容。

%CPU   CPU百分比

%MEM  内存百分比

VSZ       虚拟内存

RSS       物理内存

START   什么时候启动

TIME     运行多久

COMMAND 命令

STAT :表示进程的状态,进程状态分为以下几种(不要求记住,但要了解)

D 不能中断的进程(通常为IO)

R 正在运行中的进程

S (大写的S)已经中断的进程,通常情况下,系统中大部分进程都是这个状态

T 已经停止或者暂停的进程,如果我们正在运行一个命令,比如说 vmstat 1 ,如果我们按一下 ctrl + z  让他暂停,那么我们用ps查看就会显示T这个状态,见下图,

W 这个好像是说,从内核2.6xx 以后,表示为没有足够的内存页分配

X 已经死掉的进程(这个好像从来不会出现)

Z 僵尸进程,杀不掉,打不死的垃圾进程,占系统一小点资源,不过没有关系。如果太多,就有问题了。一般不会出现。

< 高优先级进程,CPU先给这些进程用

N 低优先级进程

L 在内存中被锁了内存分页(还没见过,了解即可)

s (小写的s)主进程,一般显示为 Ss 为主进程,S 为子进程。

l 多线程进程,意思就是这个进程有多个线程。这边线程和进程,可以查查资料

+ 代表在前台运行的进程

这个ps命令是在工作中用的非常多的命令之一。

 

总结:

iostat -x     %util表示在统计时间内所有处理IO时间,除以总共统计时间

iostat         显示当前磁盘使用情况

iostat 1      每隔1秒显示一次磁盘使用情况,是动态命令,使用 ctrl + c 结束命令

iotop          磁盘使用情况,按 io 排序

free            可以看到当前系统的总内存大小以及使用内存的情况,-m 单位M,-g单位G,-h智能显示单位

ps aux        静态的显示当前系统的所有进程,经常与 | 一起使用

ps -elf        结果与 ps aux 大同小异,看个人喜好使用

 

4、netstat

 

netstat 是在内核中访问网络连接状态及其相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。

netstat 是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。

如果你的计算机有时候接收到的数据包导致出错数据或故障,你不必感到奇怪,TCP/IP可以容许这些类型的错误,并能够自动重发数据包。但如果累计的出错情况数目占到所接收的IP数据报相当大的百分比,或者它的数目正迅速增加,那么你就应该使用netstat查一查为什么会出现这些情况了。

netstat 命令的功能是显示网络连接、路由表和网络接口信息,可以让用户得知有哪些网络连接正在运作。使用时如果不带参数,netstat显示活动的 TCP 连接。

 

netstat 命令用来打印网络连接状况、系统所开放端口、路由表等信息。最常用的关于netstat的命令就是这个 netstat -lnp (查看当前系统启动哪些端口)以及 netstat  -an (查看网络连接状况)这两个命令非常有用。

正常情况下,一台机器是没有任何的端口监听,也就意味着它没有办法和其他的机器通信。要想提供web服务,让其他人访问服务器和网站,就需要监听一个端口。那么怎么查看监听端口?输入命令 netstat -lnp ,回车,见下图,

重点关注上图红色框框的内容,显示监听了哪些端口,后面会经常用到这个命令。tcp和udp,最好网上查查他们俩的意思,做个了解。

tcp 百度百科 https://baike.baidu.com/item/TCP/33012?fr=aladdin 

dup 百度百科 https://baike.baidu.com/item/UDP/571511?fr=aladdin 

除了 tcp 和 dup ,还有 unix ,之前说过 socket 文件,说的是同一台服务器,两个进程之前互相通信使用 socket 文件。

只查看tcp和udp的命令,见下图,

还有一个命令,输入 netstat -an ,回车,见下图,

内容较多,没有一一截图。这个命令涉及扩展知识,叫TCP/IP的“三次握手,四次挥手”。“三次握手,四次挥手”是重点。

上图中常见状态即连接状态。在原模式中没有状态,在用户数据报协议中也经常没有状态,于是状态列可以空出来。若有状态,通常取值为:

LISTEN

侦听来自远方的TCP端口的连接请求

SYN-SENT

在发送连接请求后等待匹配的连接请求

SYN-RECEIVED

在收到和发送一个连接请求后等待对方对连接请求的确认

ESTABLISHED

代表一个打开的连接,表示正在通信。这个数值需要关注,如果很大的话,说明系统现在很忙。通常情况下,1000以内,服务器都是可以接受的。

FIN-WAIT-1

等待远程TCP连接中断请求,或先前的连接中断请求的确认

FIN-WAIT-2

从远程TCP等待连接中断请求

CLOSE-WAIT

等待从本地用户发来的连接中断请求

CLOSING

等待远程TCP对连接中断的确认

LAST-ACK

等待原来的发向远程TCP的连接中断请求的确认

TIME-WAIT

等待足够的时间以确保远程TCP接收到连接中断请求的确认

CLOSED

没有任何连接状态

 

分享一个小技巧,可以查看所有的状态的数字,输入命令 netstat -an | awk '/^tcp/ {++sta[$NF]} END {for(key in sta) print key, "\t", sta[key]}' ,回车,见下图,

我的虚拟机上的状态比较少,显示为 LISTEN 4个,ESTABLISHED 1个。

 

还有一个命令 ss ,它与 netstat 类似,见下图,

内容较多,不一一截图。ss -an 也能够查看状态,想单独查看某一个状态的话,输入命令 ss -an | grep -i listen,回车,见下图,

这个命令有个缺点,不会显示进程的名字,netstat 命令就可以。

 

5、Linux 下抓包

 

 

TcpDump可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

Linux作为网络服务器,特别是作为路由器和网关时,数据的采集和分析是不可少的。TcpDump是Linux中强大的网络数据采集分析工具之一。

用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。

作为互联网上经典的的系统管理员必备工具,tcpdump以其强大的功能,灵活的截取策略,成为每个高级的系统管理员分析网络,排查问题等所必备的工具之一。

tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的 FreeBSD系统中,由于它需要将网络接口设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。

基本上tcpdump的总的输出格式为:系统时间 来源主机.端口 > 目标主机.端口 数据包参数

 

有时候,也许你会有这样的需求,想看一下某个网卡上都有哪些数据包,尤其是当你初步判定你的服务器上有流量攻击。这时,使用抓包工具来抓一下数据包,就可以知道有哪些IP在攻击你了。

如果没有tcpdump 这个命令,需要用 yum install -y tcpdump 命令去安装一下。见下图,

接着执行最简单的用法,输入命令 tcpdump -nn ,回车,见下图,

出现上图所示一段话,然后命令就卡着没有动,需要使用 ctrl + c 才能结束命令。这是因为我的设备名字比较特殊,所以需要指定网卡的名字,使用命令 ifconfig ,见下图,

然后输入命令 tcpdump -nn -i ens33 ,回车,见下图,

命令跑得非常快,需要使用 ctrl + c 来结束命令。上图中,结果显示出很多信息,命令这边的 -nn 中第1个 n 表示IP用数字的形式显示出来,如果不加就会显示成主机名。输入命令 tcpdump -i ens33 ,回车,见下图,

可以看到,显示的ip地址变成主机名了。主机名对我们来说,不知道是谁,所以还是用 -nn 查看ip地址比较直观。我们自己的主机名上的 .ssh 意思是ssh服务的端口 22 ,知道 22 的话就还好,不知道的话,就不知道是谁了。

上上图中第1列是时间,第2列是IP,第3列显示的是原IP.原端口,> 是一个方向表示到哪里去,第4列显示的信息是现在的IP和端口,后面的信息是该数据包的相关信息。我们主要关注的是IP地址和端口这两列。认真看的话,会发现这两列IP地址是一对一对,而且互相发送信息。

tcpdump 查看的就是数据的流向。

也可以指定端口查看,来看一下123端口的,输入命令 tcpdump -nn -i ens33 port 123 ,回车,见下图,

结果就只有端口123的出来,当然也有排除的命令,输入 tcpdump -nn -i ens33 not port 22 ,回车,见下图,

还可以加入条件,输入命令 tcpdump -nn -i ens33 not port 22 and host 192.168.218.128 ,回车,见下图,

还可以指定数据包的长度和个数,见下图,

上图中的10就表示个数,还可以指定存放的文件,文件名随便取,见下图,

这边取包会需要点时间,不是卡住了,耐心等一会就会有结果的。最终写出的文件,可以进入查看,输入命令 file /tmp/1.cap ,回车,见下图,

这个文件无法用 cat 命令查看,结果会出现一堆乱码,可以使用 file 命令查看一下大致信息,也可以使用 tcpdump 命令查看,需要加上 -r ,见下图,

结果就是一些数据流。

接着分享一个命令 tshark ,需要先安装一个工具,见下图,

安装完毕,往下操作,输入命令 tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri" ,回车,见下图,

可以查看指定网卡,80端口的一个web端口访问的情况,虚拟机是查不到情况的,因为没有任何的80端口在监听,没有提供web服务。所以上图没有结果,看不到效果,但是需要记住这个命令。这个命令的结果类似于web的访问日志,包含时间、IP地址、访问的域名,链接等信息。

 

总结:

netstat -lnp         查看当前系统启动哪些端口

netstat -an          查看网络连接状况

netstat -ltnp        查看当前系统启动的tcp端口

netstat -lunp       查看当前系统启动的udp端口

netstat -ltunp      查看当前系统启动的tcp和udp端口

netstat -an | awk '/^tcp/ {++sta[$NF]} END {for(key in sta) print key, "\t", sta[key]}'     可以查看所有的状态的数字。

课件地址在 centos7.aminglinux.com 

ss -an                  与 netstat 异曲同工,都是查看状态的,不过它不会显示进程的名字

ss -an | grep -i listen       查看状态为 listen 的情况

tcpdump -nn -i ens33     查看数据的流向,可查看ip地址和端口

tcpdump -i ens33            不加-nn查看主机名,没有ip地址和端口

tcpdump -nn -i ens33 port 123   查看指定端口123的数据流向

tcpdump -nn -i ens33 not port 22    查看非指定端口22的数据流向

tcpdump -nn -i ens33 not port 22 and host 192.168.218.128     查看非指定端口22和ip地址是 192.168.218.128 的数据流向

tcpdump -nn -i ens33 -c 10       查看10个数据的流向

tcpdump -nn -i ens33 -c 10 -w /tmp/1.cap    查看10个数据的流向并且指定存放的路径/tmp/1.cap 

tcpdump -r /tmp/1.cap      查看数据存放的文件

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!