工具作用
Tcpdump是一款用于截取网络分组,并过滤输出分组内容的工具
它支持针对网络层、协议、主机、网络或端口的过滤,并提供 and、or、not等逻辑语句来帮助我们去掉无用的信息。
快速上手
客户端http请求
[eadp@eadp-dev-0001 ~]$ curl -v ****
* About to connect() to 127.0.0.1 port 8777 (#0)
* Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8777 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 127.0.0.1:8777
> Accept: */*
>
< HTTP/1.1 404
< Content-Type: text/html;charset=utf-8
< Content-Language: en
< Content-Length: 431
< Date: Fri, 03 Sep 2021 02:45:44 GMT
<
* Connection #0 to host 127.0.0.1 left intact
<!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 – Not Found</h1></body></html>
服务端抓包
tcpdump -n -i lo -A port 8777 (-A参数表示打印应用层ASC码)
-n:直接以 IP 及 Port Number 显示,而非主机名与服务名称;
-i:指定监听的网络接口;
- (注意,多网卡情况,一定要指定要抓取的网卡,不然会默认一个,可能就不是你想要的那个网卡)
- -i any 表示抓所有网卡
-A: 只输出ASCII码(推荐)
- 我倾向于只打印 ASCII 格式数据
- 像http协议,http协议头就要求是ASCII码,所以打印ASCII码就刚刚好
表达式:
- port 8777
- 指明端口号是8777。
三次握手包
[S] – SYN (开始连接)
[S.] 标记代表这个数据包是 SYN-ACK 数据包
[.]特殊点,是个占位符,没有其他flag被设置的时候就显示这个占位符,一般表示ack
客户端发http请求包
Flags [P.]
- 表示该TCP数据包携带了PSH(Push)和ACK(Acknowledgment)标志。具体来说:
- PSH (Push): 此标志被设置时,它告诉接收方应该立即将数据递交给应用程序,而不是等待缓冲区填满。这通常意味着发送方应用程序已经无法再发送更多数据,或者需要尽快处理这些数据。
- ACK (Acknowledgment): 代表确认标志。当这个标志被设置时,它指示确认号字段有效,也就是该TCP数据包是用来确认收到的数据的。一个带有ACK标志的数据包意味着它在响应之前某个数据包的传输并确认其接收。
[.]特殊点,是个占位符,没有其他flag被设置的时候就显示这个占位符,一般表示ack
服务端发送http返回值包
客户端发起关闭包
在tcpdump抓包输出中,Flags [F.] 表示该TCP数据包设置了FIN标志。具体来说:
- FIN (Finish): 当这个标志被设置时,它指示发送方已经完成了数据发送,并希望终止连接。接收方收到带有FIN标志的数据包后,通常会发送一个带有ACK标志的响应来确认接收,并且如果它也准备好了关闭连接,会回复一个带有FIN标志的包以关闭反向通道。
常用选项
- -l:使标准输出变为缓冲行形式;
- -c:抓包次数;
- -nn:直接以 IP 及 Port Number 显示,而非主机名与服务名称;
- -s :<数据包大小> 设置每个数据包的大小;
- -i:指定监听的网络接口;
- (注意,多网卡情况,一定要指定要抓取的网卡,不然会默认一个,可能就不是你想要的那个网卡)
- -r:从指定的文件中读取包;
- -w:输出信息保存到指定文件;
- -d:将匹配信息包的代码以人们能够理解的汇编格式给出;
- -e:在输出行打印出数据链路层的头部信息;
- -t:在输出的每一行不打印时间戳;
- -v :输出稍微详细的报文信息;--vv则输出更详细信息
- 详细信息有三个等级,你可以通过在命令行增加 v 标记的个数来获取更多的信息
- tcpdump -vvv -c 1
- -XX 标记打印出 16 进制和 ASCII 码格式的数据包(不推荐)
- 因为16进制和ascii对应起来,变成强制换行了,排版太乱
- -A只输出ASCII码(推荐)
- 我倾向于只打印 ASCII 格式数据
- 像http协议,http协议头就要求是ASCII码,所以打印ASCII码就刚刚好
[表达式]说明
表达式指正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表达式的条件,则会捕获该报文。
1. 关于类型的关键字:
- 主要包括
- host
- host 210.27.48.2
- 指明 210.27.48.2是一台主机
- 如果没有指定类型,缺省的类型是host
- net
- net 202.0.0.0
- 指明202.0.0.0是一个网络addr
- port
- port 23
- 指明端口号是23。
2. 确定传输方向的关键字:
- 主要包括
- src
- src 210.27.48.2
- 指明ip包中源addr是 210.27.48.2
- 如果没有指明 方向关键字,则缺省是src or dst关键字
- dst
- dst net 202.0.0.0
- 指明目的网络addr是202.0.0.0
- dst or src
- dst and src
3. 协议的关键字:
- 主要包括
- fddi
- Fddi指明是在FDDI (分布式光纤数据接口网络)上的特定的网络协议,实际上它是”ether”的别名,fddi和ether 具有类似的源addr和目的addr,所以可以将fddi协议包当作ether的包进行处理和分析。 如果没有指定任何协议,则tcpdump 将会 监听所有协议的信息包。
- ip
- arp
- rarp
- tcp
- udp
4. 三种逻辑运算:
- 与运算
- 'and','&&'
- 或运算
- 'or' ,'||'
- 非运算
- 'not ' '! '
5. 其他重要的关键字:
- gateway, broadcast, less(小于), greater(大于)
tcp状态说明
不同类型的数据包有不同类型的标记
- [S] – SYN (开始连接)
- [S.] 标记代表这个数据包是 SYN-ACK 数据包
- [.] – 没有标记
- [.]特殊点,是个占位符,没有其他flag被设置的时候就显示这个占位符,一般表示ack
- [P] – PSH (数据推送)
- Flags [P.]
- PSH Push我们上面解释过,接收方接收到P位的flag包需要马上将包交给应用层处理,一般我们在http request的最后一个包里都能看到P位被设置
- [F] – FIN (结束连接)
- [R] – RST (重启连接)
常用例子
抓指定端口的包,输出ASC码
tcpdump -n -i lo -A port 8777 (-A参数表示打印应用层ASC码)
-n:直接以 IP 及 Port Number 显示,而非主机名与服务名称;
-i:指定监听的网络接口;
- (注意,多网卡情况,一定要指定要抓取的网卡,不然会默认一个,可能就不是你想要的那个网卡)
- -i any 表示抓所有网卡
-A: 只输出ASCII码(推荐)
- 我倾向于只打印 ASCII 格式数据
- 像http协议,http协议头就要求是ASCII码,所以打印ASCII码就刚刚好
表达式:
- port 8777
- 指明端口号是8777。
抓发往ip端口的http包,输出ASC码
tcpdump -n -i lo -A dst 192.168.0.5 and port 8777 (-A参数表示打印应用层ASC码)
-i:指定监听的网络接口;
- (注意,多网卡情况,一定要指定要抓取的网卡,不然会默认一个,可能就不是你想要的那个网卡)
- -i any 表示抓所有网卡
表达式:
- dst 192.168.0.5 and port 8777
抓取两台主机之间的包
获取主机172.16.252.47和主机172.16.0.1之间通信的数据包
tcpdump -n -i any host 172.16.252.47 and 172.16.0.1
-i:指定监听的网络接口;
- (注意,多网卡情况,一定要指定要抓取的网卡,不然会默认一个,可能就不是你想要的那个网卡)
- -i any 表示抓所有网卡
表达式:
- host 172.16.252.47 and 172.16.0.1
tcpdump抓包数据导出给wireshark使用
1、tcpdump port 80 -w aa.cap #抓卡网上的包,可以通过-i选项指定网卡,如eth0
2、然后通过wineshark的过滤语法来找到相应的数据包。这样就可以免掉一些重复的动作,而且更直观 http.host == "xxx"