系统检测工具
学习《Linux高性能服务器编程》第十七章多线程编程,里面介绍了各种Linux中提供给开发人员调试和测评的服务器程序,为了印象深刻一些,多动手多实践,所以记下这个笔记。
tcpdump
tcpdump
是一款经典的网络抓包工具。tcpdump
给使用者提供了大量的选项,用以过滤数据包或者定制输出格式。
1 | -n,使用IP地址表示主机,而不是主机名;使用数字表示端口号,而不是服务名称。 |
除了使用选项外,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 | -i 显示socket文件描述符。 |
其中,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文件描述符。
除此之外,还有其他参数,比如:
1 | -u 显示指定用户启动的所有进程打开的所有文件描述符。 |
nc
nc
(netcat〉命令短小精干、功能强大,有着“瑞士军刀”的美誉。它主要被用来快速构建网络连接。我们可以让它以服务器方式运行,监听某个端口并接收客户连接,因此它可用来调试客户端程序。我们也可以使之以客户端方式运行,向服务器发起连接并收发数据,因此它可以用来调试服务器程序,此时它有点像telnet程序。
1 | -i 设置数据包传送的时间间隔。 |
netstat
netstat是一个功能很强大的网络信息统计工具。它可以打印本地网卡接口上的全部连接、路由表信息、网卡接口信息等。我们主要利用的是上述功能中的第一个,即显示TCP连接及其状态信息。毕竞,要获得路由表信息和网卡接口信息,我们可以使用输出内容更丰富的route和 ifconfig命令。
nctstat命令常用的选项包括:
1 | -n 使用IP地址表示主机,而不是主机名;使用数字表示端口号,而不是服务名称。 |