网络分析工具-tcpdump

文章目录


前言

当遇到网络疑难问题的时候,抓包是最基本的技能,通过抓包才能看到网络底层的问题


一、tcpdump基础

tcpdump是一个常用的网络分析工具。它基于libpcap,利用内核中的AF_PACKET套接字,抓取网络接口中传输的网络包。

我们对网卡进行抓包的时候,会使得网卡进入"混杂模式",所谓混杂模式就是让网卡接收所有到达网卡的报文,因为默认情况下,不是给自己的报文网卡是不要的,要么丢弃要么转发,反正不读取内容,而进入混杂模式后,就可以看一眼报文内容了。

使用tcpdump命令可以使网卡自动进入混杂模式,这一点可以从dmesg系统日志中看到:

311135.760098\] device eth0 entered promiscuous mode \[311142.852087\] device eth0 left promiscuous mode ### 官网链接 https://www.tcpdump.org/manpages/tcpdump.1.html ### 命令选项详解 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d3acb41a0209479aa1bf62b7aba20bcd.png) * -i 指定网络接口(如 eth0 bond0)any表示所有接口 * -n 不对IP地址进行域名解析,直接显示IP,避免执行dns lookup * -nn 不对IP地址和端口号进行名称解析。 * -c xx捕获包的数量 * -A 以ASCII码方式显示每一个数据包(不显示链路层头部信息). 在抓取包含网页数据的数据包时, 可方便查看数据 * -l 基于行的输出,便于你保存查看,或者交给其它工具分析,例如 管道符 tcpdump -l \| tee dat * -s tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报文内容,可以使用 -s number, number 就是你要截取的报文字节数,如果是 0 的话,表示截取报文全部内容。 **控制时间显示** * -t 在每行的输出中不输出时间 * -tt 在每行的输出中会输出时间戳 * -ttt 输出每两行打印的时间间隔(以毫秒为单位) * -tttt 在每行打印的时间戳之前添加日期的打印(此种选项,输出的时间最直观) **控制详细内容输出** * -v:产生详细的输出. 比如包的TTL,id标识,数据包长度,以及IP包的一些选项。同时它还会打开一些附加的包完整性检测,比如对IP或ICMP包头部的校验和。 * -vv:产生比-v更详细的输出. 比如NFS回应包中的附加域将会被打印, SMB数据包也会被完全解码。(摘自网络,目前我还未使用过) * -vvv:产生比-vv更详细的输出。比如 telent 时所使用的SB, SE 选项将会被打印, 如果telnet同时使用的是图形界面,其相应的图形选项将会以16进制的方式打印出来(摘自网络,目前我还未使用过) * -w 写入数据到文件 * -r 读取文件 * -Q 选择是入方向还是出方向的数据包,可选项有:in, out, inout,也可以使用 --direction=\[direction\] 这种写法 * -S 使用绝对序列号,而不是相对序列号 * -D 显示主机所有可用网络接口的列表 * -e 每行的打印输出中将包括数据包的数据链路层头部信息 ### 常规过滤规则 由于tcpdump是把经过网卡的报文全部都抓出来,所以数量是非常大的,各种乱七八糟的报文都有,是没办法定位问题的,所以tcpdump一定要配合过滤条件使用。这里只讲平时用得到的几个关键参数,再详细的自己谷歌百度,反正我一般情况下用用是够了的。 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/65845897bfbf4d1184545325e8adb85a.png) ### tcpdump输出 > 时间戳 协议 源地址,源端口 \> 目的地址, 目的端口 网络包详细信息 TCP Packets TCP报头的控制部分有8位: CWR \| ECE \| URG \| ACK \| PSH \| RST \| SYN \| FIN \[S\] SYN(开始连接) \[.\] ACK \[P\] PSH(推送数据) \[F\] FIN(结束连接) \[R\] RST(重置连接) \[S.\] 也表示\[SYN-ACK\], SYN的应答报文 \[U\] URG \[W\] CWR \[E\] ECE ## 一、tcpdump实践 ### HTTP协议 抓取HTTP GET 流量: > $ tcpdump -s 0 -A -vv 'tcp\[((tcp\[12:1\] \& 0xf0) \>\> 2):4\] = 0x47455420' 抓取HTTP POST流量: > $ tcpdump -s 0 -A -vv 'tcp\[((tcp\[12:1\] \& 0xf0) \>\> 2):4\] = 0x504f5354' 从HTTP请求头中提取HTTP用户代理: > $ tcpdump -nn -A -s1500 -l \| grep "User-Agent:" 提取HTTP 请求的主机名和路径: > tcpdump -i docker0 -nn -tttt -v -s0 -l \| grep -Ei "POST /\|GET /\|HOST:" 提取HTTP请求的信息【密码,Cookie, Token等】: 先用POST请求,然后找到登录的URI,使用grep 找到上下20行,找到Post参数。 > tcpdump -s 0 -A -vv 'tcp\[((tcp\[12:1\] \& 0xf0) \>\> 2):4\] = 0x504f5354' \| grep -i 'POST /api/auth/login' -C20 抓取eth0接口42050端口的请求,request和respones > tcpdump -i eth0 -A -s 0 'tcp port 42050 and (((ip\[2:2\] - ((ip\[0\]\&0xf)\<\<2)) - ((tcp\[12\]\&0xf0)\>\>2)) != 0)' ### ICMP 抓取ICMP报文 > tcpdump -n icmp 非 ECHO/REPLY 类型的 ICMP 通过排除 echo 和 reply 类型的数据包使抓取到的数据包不包括标准的 ping 包: > tcpdump 'icmp\[icmptype\] != icmp-echo and icmp\[icmptype\] != icmp-echoreply' ### 状态抓包 RST状态的包 > tcpdump -i eth0 -nn port 34997 and 'tcp\[tcpflags\]\&tcp-rst != 0' *** ** * ** ***

相关推荐
BingoGo15 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack15 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
Jony_2 天前
高可用移动网络连接
网络协议
chilix2 天前
Linux 跨网段路由转发配置
网络协议
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理4 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php