当前位置: 首页 > 科技观察

Linux网络分析必备技能:tcpdump实用详解

时间:2023-03-20 16:30:26 科技观察

今天要分享的是tcpdump,它是Linux系统中特别好用的网络工具。通常用于故障诊断和网络分析,功能非常强大。与其他Linux工具相比,tcpdump比较复杂。当然,我不建议你全部学习。学以致用,能够解决工作中的问题是关键。本文将从应用场景和基本原理出发,提供丰富的实战案例,让你快速掌握tcpdump的核心用法,足以满足日常工作需要。应用场景很多日常工作中遇到的网络问题,都可以通过tcpdump优雅的解决:1.相信大部分同学都遇到过SSH连接服务器慢的情况。通过tcpdump抓包,可以快速定位具体原因,通常是因为DNS解析太慢。2、当我们的工程师和用户因网络问题发生争执时,我们可以通过tcpdump抓包快速定位故障原因,轻松甩锅无压力。3、当我们新开发的网络程序运行不正常时,通过tcpdump收集相关数据包,从数据包层面分析具体原因,轻松解决问题。4、当我们的网络程序性能比较低时,通过tcpdump分析数据流特征,结合相关协议优化网络参数,提高系统网络性能。5、我们在学习网络协议时,可以使用tcpdump抓包分析协议格式,帮助我们更直观、有效、快速地学习网络协议。以上只是简单列举了几种常见的应用场景,而tcpdump在网络诊断、网络优化、协议学习等方面确实是一个非常强大的网络工具。只要有网络问题,总能看到。熟练使用tcpdump可以帮助我们解决工作中的各种网络问题。下面就来简单了解一下它的工作原理。工作原理tcpdump是Linux系统中非常好用的网络工具。它运行在用户态,本质上是通过调用libpcap库的各种API实现抓包功能。从上图我们可以直观的看出,数据包到达网卡后,经过数据包过滤器(BPF)的筛选后,复制到用户态的tcpdump程序中,由网卡进行后续处理、输出或存储。tcpdump工具到pcap文件。数据包过滤器(BPF)的主要作用是根据用户输入的过滤规则,只将用户关心的数据包复制到tcpdump,可以减少不必要的数据包复制,减少数据包造成的性能损失捕获。思考:这是一道真正的面试题。面试官:如果有些数据包被iptables拦截了,可以通过tcpdump抓包吗?通过上图,我们很容易回答这个问题。因为netfilter在Linux系统中工作在协议栈阶段,而tcpdump的filter(BPF)工作在协议栈之前,当然可以抓包了!了解了tcpdump的基本原理之后,我们就直接进入实战吧!实战:基本用法下面通过几个简单的例子来介绍一下tcpdump的基本用法。1、不带任何参数,默认情况下,会抓取第一个非lo网卡上的所有数据包$tcpdump2。eth0网卡上的所有数据包都会被抓取$tcpdump-ieth03。抓包时指定-n选项,不解析主机名和端口名。该参数非常关键,会影响抓包性能。一般抓包时需要指定该选项。$tcpdump-n-ieth04。捕获指定主机192.168.1.100$tcpdump-nieth0host192.168.1.1005的所有数据包。抓取指定主机10.1.1.2$tcpdump-nieth0srchost10.1.1.26发送的数据包。捕获并发送对于10.1.1.2$tcpdump-nieth0dsthost10.1.1.27的所有数据包。抓取eth0网卡上发往指定主机的数据包,抓到10个包后停止。这个参数也是常用的$tcpdump-nieth0-c10dsthost192。168.1.2008。抓取eth0网卡上的所有SSH请求包,SSH默认端口为22$tcpdump-nieth0dstport229。在eth0网卡$tcpdump-nieth0-c5icmp10上抓取5个ping包。抓取eth0网卡上的所有arp数据包$tcpdump-nieth0arp11。使用十六进制输出,这在您要检查数据包内容是否有问题时会很有帮助。$tcpdump-nieth0-c1arp-Xlisteningoneth0,链路类型EN10MB(以太网),捕获大小262144字节12:13:31.602995ARP,请求谁有172.17.92.133告诉172.17.95.253,长度280x0000:0010ff480......00....0x00:5ffd000000000000ac115c85_......\.12。仅捕获eth0网卡上的IPv6流量$tcpdump-nieth0ip613。抓取指定端口范围$tcpdump-nieth0portrange80-900014的流量。抓取指定网段的流量$tcpdump-nieth0net192.168.1.0/24实战:advancedadvancedtcpdump的强大功能和灵活的策略主要体现在过滤器(BPF)强大的表达组合能力上。本节主要分享一些常见的所谓高级用法。希望读者能够举一反三,根据自己的实际需要灵活运用。1、抓取指定客户端访问ssh的数据包$tcpdump-nieth0src192.168.1.100anddstport222。抓取某网段到某网段的流量$tcpdump-nieth0srcnet192.168.1.0/16anddstnet10.0.0.0/8or172.16.0.0/163。捕获从主机到非ssh端口的流量$tcpdump-nieth0src10.0.2.4andnotdstport224。构建复杂查询时,可能需要使用引号,单引号告诉tcpdump忽略特定的特殊字符,其中()是特殊符号,如果不使用引号,则需要使用转义字符$tcpdump-nieth0'src10。0.2.4和(dstport3389or22)'5。根据数据包大小过滤,如果你正在查看一个特定的数据包大小,你可以使用这个参数小于或等于64字节:$tcpdump-niless64大于或等于64字节:$tcpdump-nieth0greater64等于64字节:$tcpdump-nieth0length==646。过滤TCP特殊标记数据抓取主机发送的RST包:$tcpdump-nieth0srchost192.168.1.100and'tcp[tcpflags]&(tcp-rst)!=0'抓取主机发送的SYN包:$tcpdump-nieth0srchost192.168.1.100and'tcp[tcpflags]&(tcp-syn)!=0'抓取主机发送的FIN包:$tcpdump-nieth0srchost192.168.1.100and'tcp[tcpflags]&(tcp-fin)!=0'捕获TCP连接中的SYN或FIN数据包$tcpdump'tcp[tcpflags]&(tcp-syn|tcp-fin)!=0'7.捕获所有非pingICMP数据包$tcpdump'icmp[icmptype]!=icmp-echoandicmp[icmptype]!=icmp-echoreply'8.捕获端口为80,网络层协议为IPv4,包含数据,不是SYN、FIN和ACK数据包没有数据$tcpdump'tcpport80and(((ip[2:2]-((ip[0]&0xf)<<2))-((tcp[12]&0xf0)>>2))!=0)'解释这个复杂的表达式。具体意思就是整个IP数据包的长度减去IP头的长度,再减去TCP头的长度。如果结果不为0,说明数据包中有数据,如果还是不太理解,需要自己补上tcp/ip协议。2]=0x4745ortcp[20:2]=0x4854'常用选项通过以上实战案例,相信大家已经掌握了tcpdump的基本用法,这里对常用选项参数进行详细汇总(一)基本选项-i:指定接口-D:列出可用于抓包的接口-s:指定抓包的长度-c:指定抓包的个数-w:将抓包数据保存在文件中-r:从文件中读取抓取数据-C:指定文件大小,与-w一起使用-F:从文件中读取抓包表达式-n:不解析主机和端口号,这个参数很重要,一般需要加上-P:指定要捕获的数据包是流入还是流出数据包,可以指定的值有in、out、inout(2)输出选项-e:输出信息包括数据链路层头信息-t:显示时间戳,tttt显示更详细的时间-X:显示十六进制格式-v:显示详细message信息,try-vvv,v越多,filterexpression越详细tcpdump的强大功能和灵活的策略主要体现在filter(BPF)强大的表达式组合能力上。(1)操作对象表达式中可以操作的对象如下:type,表示对象的类型,如:host,net,port,portrange,如果不指定type,默认为hostdir:表示传输方向,首选方式有:src、dst。proto:表示协议,可选协议有:ether、ip、ip6、arp、icmp、tcp、udp。(2)条件组合表达式对象也可以通过关键字and、or、not连接起来,组成更强大的表达式。or:表示或操作and:表示和操作not:表示不操作。建议看完这篇再回头看看实战篇中的例子,相信会有更深的理解。如果是这样,就达到了我预期的效果!这里就不增加新的知识点了,分享一些工作中总结的经验:1、我们要知道tcpdump不是万能的,它不能解决所有的网络问题。2.在大流量场景下,抓包可能会影响系统性能。如果是生产环境,请慎用!3、在大流量场景下,tcpdump不适合做流量统计。必要时可以使用交换机镜像进行分析统计。4、在Linux上使用tcpdump抓包,结合wireshark工具进行数据分析,可以事半功倍。5、抓包时,尽量不要使用任何接口抓包。6.抓包时,尽量详细指定包过滤表达式,减少无用包的复制。7、抓包时,尽量指定-n选项,减少解析host和port带来的性能开销。最后,通过以上内容,我们知道了tcpdump是一个强大的故障排查和网络分析工具。在我们日常工作中,遇到的网络问题总能通过tcpdump来解决。然而,tcpdump比其他Linux命令复杂得多,但鉴于其强大功能的诱惑,值得我们多花些时间。要想掌握好tcpdump,需要对网络包(TCP/IP协议)有一定的了解。当然,对于简单的使用来说,只要你对网络有基本的概念,掌握tcpdump的常用方法就足以应付你工作中大部分与网络相关的疑难杂症了。