0%

系统监测工具

系统检测工具

学习《Linux高性能服务器编程》第十七章多线程编程,里面介绍了各种Linux中提供给开发人员调试和测评的服务器程序,为了印象深刻一些,多动手多实践,所以记下这个笔记。

tcpdump

tcpdump是一款经典的网络抓包工具。tcpdump给使用者提供了大量的选项,用以过滤数据包或者定制输出格式。

1
2
3
4
5
6
7
8
9
10
11
12
13
	-n,使用IP地址表示主机,而不是主机名;使用数字表示端口号,而不是服务名称。
-i,指定要监听的网卡接口。“-i any”表示抓取所有网卡接口上的数据包。
-v,输出一个稍微详细的信息,例如,显示IP数据包中的TTL和TOS信息。
-t,不打印时间戳。
-e,显示以太网帧头部信息。
-c,近抓取指定数量的数据包。
-x,以十六进制数显示数据包的内容,但不显示包中以太网帧的头部信息。
-X,与-x选项类似,不过还打印每个十六进制字节对应的ASCII字符。
-XX,与-X相同,不过还打印以太网帧的头部信息。
-s,设置抓包时的抓取长度。
-S,以绝对值来显示TCP报文段的序号,而不是相对值。
-w,以绝对值来显示TCP报文段的序号,而不是相对值。
-r,从文件读取数据包信息并显示之。

除了使用选项外,tcpdump还支持用表达式来进一步过滤数据包。tcpdump表达式的操作数分为3种:类型(type)、方向(dir)和协议(proto)

  • 类型,解释其后面紧跟着的参数的含义。tcpdump支持的类型包括host、net、port和portrange。它们分别指定主机名(或IP地址),用CIDR方法表示的网络地址,端口号以及端口范围。比如,要抓取整个1.2.3.0/255.255.255.0网络上的数据包,可以使用如下命令:

    1
    tcpdump net 1.2.3.0/24
  • 方向,src指定数据包的发送端,dst指定数据包的目的端。比如要抓取进人端口13579的数据包,可以使用如下命令:

    1
    tecpdump dst port 13579 
  • 协议,指定目标协议。比如要抓取所有ICMP数据包,可以使用如下命令:

    1
    tcpdump icmp

当然,我们还可以使用逻辑操作符来组织上述操作数以创建更复杂的表达式。tcpdump支持的逻辑操作符和编程语言中的逻辑操作符完全相同,包括and(或者&&)、or(或者ll)、not(或者!)。比如要抓取主机 ernest-laptop和所有非 Kongming20 的主机之间交换的IP数据包,可以使用如下命令:

1
tcpdump ip host ernest-laptop and not Kongming20

如果表达式比较复杂,那么我们可以使用括号将它们分组。不过在使用括号时,我们要么使用反斜杠“\”对它转义,要么用单引号“ ”将其括住,以避免它被shell所解释。比如要抓取来自主机10.0.2.4,目标端口是3389或22的数据包,可以使用如下命令:

1
tepdump 'src 10.o.2.4 and (dst port 3389 or 22) '

此外,tcpdump还允许直接使用数据包中的部分协议字段的内容来过滤数据包。比如,仅抓取TCP同步报文段,可使用如下命令:

1
tcpdump 'tcp[13]&2 != 0'

这是因为TCP头部的第14个字节的第2个位正是同步标志。该命令也可以表示为:

1
tcpdump 'tcp[tcpflags] & tcp-syn != 0 '

最后,tcpdump的具体输出格式除了与选项有关外,还与协议有关。可以查询man手册进行学习。

lsof

lsof(list open file)是一个列出当前系统打开的文件描述符的工具。通过它我们可以了解感兴趣的进程打开了哪些文件描述符,或者我们感兴趣的文件描述符被哪些进程打开了。

lsof命令常用的选项包括:

1
2
-i 显示socket文件描述符。
lsof -i[46] [protocol] [@hostname|ipaddr] [:service|port]

其中,4表示IPv4协议,6表示IPv6协议;protocol指定传输层协议,可以是TCP或者UDP ; hostname指定主机名;ipaddr指定主机的IP地址; service指定服务名;port指定端口号。比如,要显示所有连接到主机192.168.1.108的 ssh服务的socket文件描述符,可以使用命令:

1
lsof -i@192.168.1.108:22

如果-i选项后不指定任何参数,则lsof命令将显示所有socket文件描述符。

image-20221001174639842

除此之外,还有其他参数,比如:

1
2
3
4
-u 显示指定用户启动的所有进程打开的所有文件描述符。
-c 显示指定的命令打开的所有文件描述符。比如要查看websrv程序打开了哪些文件描述符,可以使用如下命令:lsof -c websrv
-p,显示指定进程打开的所有文件描述符。
-t,仅显示打开了目标文件描述符的进程的PID。

nc

nc (netcat〉命令短小精干、功能强大,有着“瑞士军刀”的美誉。它主要被用来快速构建网络连接。我们可以让它以服务器方式运行,监听某个端口并接收客户连接,因此它可用来调试客户端程序。我们也可以使之以客户端方式运行,向服务器发起连接并收发数据,因此它可以用来调试服务器程序,此时它有点像telnet程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-i 设置数据包传送的时间间隔。
-l 以服务器方式运行,监听指定的端口。nc命令默认以客户端方式运行。
-k 重复接受并处理某个端口上的所有连接,必须与-l选项一起使用。
-n 使用IP地址表示主机,而不是主机名﹔使用数字表示端口号,而不是服务名称。
-p 当nc命令以客户端方式运行时,强制其使用指定的端口号。
-s 设置本地主机发送出的数据包的IP地址。
-C 将CR和LF两个字符作为行结束符。
-U 使用UNIX本地域协议通信。
-u 使用UDP协议。nc命令默认使用的传输层协议是TCP协议。
-w 如果nc客户端在指定的时间内未检测到任何输入,则退出。
-X 当nc客户端和代理服务器通信时,该选项指定它们之间使用的通信协议。目前nc支持的代理协议包括“4”(SOCKS v.4),“5”(SOCKs v.5)和“connect”(HTTPS proxy)。nc 默认使用的代理协议是SOCKs v.5。
-x 指定目标代理服务器的IP地址和端口号。比如,要从 Kongming20连接到ernest-laptop上的 squid代理服务器,并通过它来访问www.baidu.com 的 Web服务,可以使用如下命令: nc -x ernest-laptop:1080 -X connect www.baidu.com
-z 扫描目标机器上的某个或某些服务是否开启(端口扫描)。比如,要扫描机器ernest-laptop上端口号在20 ~ 50之间的服务,可以使用如下命令:
nc -z ernest-laptop 20-50

netstat

netstat是一个功能很强大的网络信息统计工具。它可以打印本地网卡接口上的全部连接、路由表信息、网卡接口信息等。我们主要利用的是上述功能中的第一个,即显示TCP连接及其状态信息。毕竞,要获得路由表信息和网卡接口信息,我们可以使用输出内容更丰富的route和 ifconfig命令。

nctstat命令常用的选项包括:

1
2
3
4
5
6
7
8
-n 使用IP地址表示主机,而不是主机名;使用数字表示端口号,而不是服务名称。
-a 显示结果中也包含监听socket。
-t 仅显示TCP连接。
-r 显示路由信息。
-i 显示网卡接口的数据流量
-c 每隔1s输出一次
-o 显示socket定时器(比如保活定时器)的信息
-p 显示socket所属的进程的PID和名字