正文
网络抓包的学习与使用
背景
最近看了很多文档, 说到很多性能问题其实是需要通过网络抓包来定位的.
网络的很多功能主要有 ping,iperf,netperf等等工具.
也可以使用tcpdump进行一下抓包验证工作.
感觉子这一块比较薄弱, 所以想趁着周末提高一下自己
网络知识简单梳理
network 其实是计算机科学技术的核心议题
所有的硬件软件,如果无法通过网络给大家一下展示他的计算结果
那么使用范围就非常狭窄.
网络知识其实非常复杂. 日常工作中遇到最多的往往是 tcp/ip协议族,
以及internet 互联网.
真正的生产环境中用的网络设备很多:
从客户端到服务器主要有:
1. 接入层交换机 无线AP.有线交换机.4G/5G网络设备.
2. 汇聚层交换机, 防火墙,后者似乎VPN设备.专线等.
3. 运营商等的核心机房
4. 服务器侧的防火墙,路由器灯.
5. 服务器的网卡, 网络设置等.
不同的设备也有完全不同的物理设备.
网线的类型/双绞线/光缆/IB线 不同设备的性能不尽相同.
交换机也有高速和普通交换机, 对应的延迟和带宽也不尽相同.
网络分层也分为OSI7层或者是5层模型.
每一层和每一段网络设备的最低值来决定整个网络的性能
也就是一个这是一套串联的系统, 瓶颈处是网络最终结果.
网络不仅仅是串联系统, 还可能是一套动态的. 跟设备的状况,负载,其他设备是否争用有巨大的关系.
所以不能一次测试完成就认为没有问题了, 需要动态的不同时段的监控和观测.
延迟情况分析
网络时延的总结-单位微秒
原始地址 |
目标地址 |
平均网络延迟 |
最大网络延迟 |
电信企业100M |
127.0.0.1(本机) |
22 |
52 |
电信企业100M |
192.168.2.201(本机路由器地址) |
18 |
64 |
电信企业100M |
192.168.2.202(本地局域网其他linux) |
93 |
128 |
电信企业100M |
192.168.2.205(本地局域网其他Windows) |
422 |
548 |
电信企业100M |
境内dns默认baidu地址 |
15731 |
15962 |
电信企业100M |
美国洛杉矶IP地址 |
147287 |
149023 |
电信企业100M |
美国华盛顿IP地址 |
231976 |
235268 |
联通家用宽带无线 |
美国华盛顿IP地址 |
249898 |
277650 |
网络时延的验证详细信息
# ping 本机
ping -s 1460 192.168.2.201
1468 bytes from 192.168.2.201: icmp_seq=30 ttl=64 time=0.030 ms
30 packets transmitted, 30 received, 0% packet loss, time 30152ms
rtt min/avg/max/mdev = 0.010/0.018/0.064/0.011 ms
# ping 局域网内的其他linux
ping -s 1460 192.168.2.202
1468 bytes from 192.168.2.202: icmp_seq=30 ttl=64 time=0.107 ms
30 packets transmitted, 30 received, 0% packet loss, time 30160ms
rtt min/avg/max/mdev = 0.076/0.093/0.128/0.012 ms
# ping 局域网内Windows机器
ping -s 1460 192.168.2.205
1468 bytes from 192.168.2.205: icmp_seq=30 ttl=128 time=0.455 ms
30 packets transmitted, 30 received, 0% packet loss, time 30154ms
rtt min/avg/max/mdev = 0.309/0.422/0.548/0.061 ms
# ping 境内的机器
ping -s www.baidu.com
1468 bytes from 180.101.50.242 : icmp_seq=30 ttl=53 time=15.7 ms
30 packets transmitted, 30 received, 0% packet loss, time 29049ms
rtt min/avg/max/mdev = 15.656/15.731/15.962/0.049 ms
# ping 洛杉矶的地址
ping -s 1460 1.0.0.1
1468 bytes from 1.0.0.1: icmp_seq=30 ttl=54 time=147 ms
30 packets transmitted, 30 received, 0% packet loss, time 29032ms
rtt min/avg/max/mdev = 147.009/147.287/149.023/0.384 ms
# ping 华盛顿的机器
ping -s 1460 5.157.36.1
1468 bytes from 5.157.36.1: icmp_seq=30 ttl=53 time=231 ms
30 packets transmitted, 27 received, 10% packet loss, time 29251ms
rtt min/avg/max/mdev = 231.129/231.976/235.268/1.081 ms
机器地址来源:
https://zh-hans.ipshu.com/ip-country/us?page=8
# 注意上面是电信企业版.直接使用的有线地址
我这边联通网络, 无线路由器连接后的为:
来自 5.157.36.1 的回复: 字节=32 时间=230ms TTL=52
5.157.36.1 的 Ping 统计信息:
最短 = 230ms,最长 = 265ms,平均 = 246ms
# 使用回环地址
ping -s 1460 127.0.0.1
1468 bytes from 127.0.0.1: icmp_seq=30 ttl=64 time=0.015 ms
30 packets transmitted, 30 received, 0% packet loss, time 30196ms
rtt min/avg/max/mdev = 0.012/0.022/0.052/0.009 ms
ping -s 1460 localhost
1468 bytes from localhost (::1): icmp_seq=30 ttl=64 time=0.012 ms
30 packets transmitted, 30 received, 0% packet loss, time 30197ms
rtt min/avg/max/mdev = 0.010/0.022/0.073/0.013 ms
ping -4 -s 1460 localhost
1468 bytes from localhost (127.0.0.1): icmp_seq=30 ttl=64 time=0.016 ms
30 packets transmitted, 30 received, 0% packet loss, time 30128ms
rtt min/avg/max/mdev = 0.009/0.018/0.057/0.009 ms
## 联通家庭无线路由器介入
# ping 华盛顿的机器
ping -s 1460 5.157.36.1
1468 bytes from 5.157.36.1: icmp_seq=30 ttl=128 time=250 ms
30 packets transmitted, 30 received, 0% packet loss, time 29017ms
rtt min/avg/max/mdev = 244.350/249.898/277.650/6.300 ms
tcpdump的简介
TCPDump是一个强大的命令行网络抓包工具,用于捕获和分析网络上传输的数据包。它在多个操作系统上可用,并提供了广泛的功能和选项,用于监控和故障排除网络通信。
以下是TCPDump的一些主要特点和用途:
数据包捕获: TCPDump可以监视网络接口上的数据流量,并捕获经过接口的所有数据包。它可以捕获各种协议(如TCP、UDP、ICMP等)的数据包,并显示这些数据包的详细信息。
灵活的过滤器: TCPDump提供了强大的过滤器语法,允许你根据源地址、目标地址、端口号、协议等条件对捕获到的数据包进行过滤。这使你可以只关注特定类型的数据包,从而更好地理解和分析网络通信。
协议解析: TCPDump能够以人类可读的格式解析各种协议,包括以太网、IP、TCP、UDP、ICMP等。这使得你可以更好地理解和分析数据包的结构和内容。
存储和分析: TCPDump可以将捕获到的数据包保存到文件中,方便离线分析。同时,你可以使用其他工具(如Wireshark)来打开这些文件,并进行更深入的分析和调查网络问题。
远程捕获: TCPDump可以通过网络远程捕获数据包。你可以在一台计算机上运行TCPDump,并将捕获到的数据包发送到另一台计算机上进行分析。
总体而言,TCPDump是一个强大而灵活的网络抓包工具,适用于多种网络监控和故障排除场景。它的命令行界面可能对一些非技术用户来说有些复杂,但对于网络工程师和安全分析师来说,它是一个不可或缺的工具。
tcpdump的使用
# 将默认的监控到的数据写入到当前目录下的文件
tcpdump -w zhaobsh.cap
# 读取已经被抓取的文件
tcpdump -r zhaobsh.cap
# 详细信息
tcpdump -nnvv -s0 host 5.157.36.1
效果为:
[root@openeuler2203 ~]# tcpdump -nnvv -s0 host 5.157.36.1
dropped privs to tcpdump
tcpdump: listening on ens192, link-type EN10MB (Ethernet), snapshot length 262144 bytes
13:26:27.133002 IP (tos 0x0, ttl 64, id 4003, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.174.130 > 5.157.36.1: ICMP echo request, id 20027, seq 1, length 64
13:26:27.379515 IP (tos 0x0, ttl 128, id 65521, offset 0, flags [none], proto ICMP (1), length 84)
5.157.36.1 > 192.168.174.130: ICMP echo reply, id 20027, seq 1, length 64
13:26:28.134647 IP (tos 0x0, ttl 64, id 4008, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.174.130 > 5.157.36.1: ICMP echo request, id 20027, seq 2, length 64
tcpdump的一些参数说明
-i : 选择要捕获的接口,通常是以太网卡或无线网卡,也可以是 vlan 或其他特殊接口。如果该系统上只有一个网络接口,则无需指定。
-nn : 单个 n 表示不解析域名,直接显示 IP;两个 n 表示不解析域名和端口。这样不仅方便查看 IP 和端口号,而且在抓取大量数据时非常高效,因为域名解析会降低抓取速度。
-s0 : tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报文内容,可以使用 -s number, number 就是你要截取的报文字节数,如果是 0 的话,表示截取报文全部内容。
-v : 使用 -v,-vv 和 -vvv 来显示更多的详细信息,通常会显示更多与特定协议相关的信息。
port 80 : 这是一个常见的端口过滤器,表示仅抓取 80 端口上的流量,通常是 HTTP。
额外再介绍几个常用参数:
-p : 不让网络接口进入混杂模式。默认情况下使用 tcpdump 抓包时,会让网络接口进入混杂模式。一般计算机网卡都工作在非混杂模式下,此时网卡只接受来自网络端口的目的地址指向自己的数据。当网卡工作在混杂模式下时,网卡将来自接口的所有数据都捕获并交给相应的驱动程序。如果设备接入的交换机开启了混杂模式,使用 -p 选项可以有效地过滤噪声。
-e : 显示数据链路层信息。默认情况下 tcpdump 不会显示数据链路层信息,使用 -e 选项可以显示源和目的 MAC 地址,以及 VLAN tag 信息。例如:
-A 表示使用 ASCII 字符串打印报文的全部数据,这样可以使读取更加简单,方便使用 grep 等工具解析输出内容。-X 表示同时使用十六进制和 ASCII 字符串打印报文的全部数据。这两个参数不能一起使用。例如:
-w 选项用来把数据报文输出到文件:
Host 过滤器
Host 过滤器用来过滤某个主机的数据报文。例如:
该命令会抓取所有发往主机 1.2.3.4 或者从主机 1.2.3.4 发出的流量。如果想只抓取从该主机发出的流量,可以使用下面的命令:
Network 过滤器
Network 过滤器用来过滤某个网段的数据,使用的是 CIDR 模式。可以使用四元组(x.x.x.x)、三元组(x.x.x)、二元组(x.x)和一元组(x)。四元组就是指定某个主机,三元组表示子网掩码为 255.255.255.0,二元组表示子网掩码为 255.255.0.0,一元组表示子网掩码为 255.0.0.0。例如,
Proto 过滤器
Proto 过滤器用来过滤某个协议的数据,关键字为 proto,可省略。proto 后面可以跟上协议号或协议名称,支持 icmp, igmp, igrp, pim, ah, esp, carp, vrrp, udp 和 tcp。因为通常的协议名称是保留字段,所以在于 proto 指令一起使用时,必须根据 shell 类型使用一个或两个反斜杠(/)来转义。Linux 中的 shell 需要使用两个反斜杠来转义,MacOS 只需要一个。
Port 过滤器
Port 过滤器用来过滤通过某个端口的数据报文,关键字为 port。例如:
最基本也是最重要的信息就是数据报的源地址/端口和目的地址/端口,上面的例子第一条数据报中,源地址 ip 是 192.168.1.106,源端口是 56166,目的地址是 124.192.132.54,目的端口是 80。 > 符号代表数据的方向。
此外,上面的三条数据还是 tcp 协议的三次握手过程,第一条就是 SYN 报文,这个可以通过 Flags [S] 看出。下面是常见的 TCP 报文的 Flags:
[S] : SYN(开始连接)
[.] : 没有 Flag
[P] : PSH(推送数据)
[F] : FIN (结束连接)
[R] : RST(重置连接)
而第二条数据的 [S.] 表示 SYN-ACK,就是 SYN 报文的应答报文。
tcpdump -nn -A -s1500 -l | grep "User-Agent:"
tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'
本文主要介绍了 tcpdump 的基本语法和使用方法,并通过一些示例来展示它强大的过滤功能。将 tcpdump 与 wireshark 进行组合可以发挥更强大的功效,本文也展示了如何优雅顺滑地结合 tcpdump 和 wireshark。如果你想了解更多的细节,可以查看 tcpdump 的 man 手册。
一个完整版本的帮助
-A 以ASCII格式打印出所有分组,并将链路层的头最小化。
-c 在收到指定的数量的分组后,tcpdump就会停止。
-C 在将一个原始分组写入文件之前,检查文件当前的大小是否超过了参数file_size
中指定的大小。如果超过了指定大小,则关闭当前文件,然后在打开一个新的文件。参数 file_size
的单位是兆字节(是1,000,000字节,而不是1,048,576字节)。
-d 将匹配信息包的代码以人们能够理解的汇编格式给出。
-dd 将匹配信息包的代码以c语言程序段的格式给出。
-ddd 将匹配信息包的代码以十进制的形式给出。
-D 打印出系统中所有可以用tcpdump截包的网络接口。
-e 在输出行打印出数据链路层的头部信息。
-E 用spi@ipaddr algo:secret解密那些以addr作为地址,并且包含了安全参数索引值spi的IPsec ESP分组。
-f 将外部的Internet地址以数字的形式打印出来。
-F 从指定的文件中读取表达式,忽略命令行中给出的表达式。
-i 指定监听的网络接口。
-l 使标准输出变为缓冲行形式。
-L 列出网络接口的已知数据链路。
-m 从文件module中导入SMI MIB模块定义。该参数可以被使用多次,以导入多个MIB模块。
-M 如果tcp报文中存在TCP-MD5选项,则需要用secret作为共享的验证码用于验证TCP-MD5选选项摘要(详情可参考RFC 2385)。
-n 不把网络地址转换成名字。
-N 不输出主机名中的域名部分。例如,link.linux265.com 只输出link。
-t 在输出的每一行不打印时间戳。
-O 不运行分组分组匹配(packet-matching)代码优化程序。
-P 不将网络接口设置成混杂模式。
-q 快速输出。只输出较少的协议信息。
-r 从指定的文件中读取包(这些包一般通过-w选项产生)。
-S 将tcp的序列号以绝对值形式输出,而不是相对值。
-s 从每个分组中读取最开始的snaplen个字节,而不是默认的68个字节。
-T 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc远程过程调用)和snmp(简单网络管理协议;)。
-t 不在每一行中输出时间戳。
-tt 在每一行中输出非格式化的时间戳。
-ttt 输出本行和前面一行之间的时间差。
-tttt 在每一行中输出由date处理的默认格式的时间戳。
-u 输出未解码的NFS句柄。
-v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息。
-vv 输出详细的报文信息。
-w 直接将分组写入文件中,而不是不分析并打印出来。
-x 以16进制数形式显示每一个报文 (去掉链路层报头) . 可以显示较小的完整报文, 否则只显示snaplen个字节.
-xx 以16进制数形式显示每一个报文(包含链路层包头)。
-X 以16进制和ASCII码形式显示每个报文(去掉链路层报头)。
-XX 以16进制和ASCII吗形式显示每个报文(包含链路层报头)。
-y 设置tcpdump 捕获数据链路层协议类型
-Z 使tcpdump 放弃自己的超级权限(如果以root用户启动tcpdump, tcpdump将会有超级用户权限), 并把当前tcpdump的用户ID设置为user, 组ID设置为user首要所属组的ID