tcpdump抓包用法

1、抓取任意网卡接口的包:

tcpdump -i any -nn port 80

上述命令的意思是:抓取所有网卡中源端口或目的端口为 80 的数据包,并以数字形式显示 IP 地址和端口号,不进行域名、服务名解析

参数逐项详解:

参数含义
tcpdumpLinux/Unix 下常用抓包工具,基于 libpcap,使用 BPF 过滤表达式。
-i any指定抓包接口为 any。在 Linux 上表示抓取所有网络接口上的流量,包括物理网卡、虚拟网卡等。any 是伪接口,链路层类型通常是 Linux cooked capture,不是普通 Ethernet 头;并且 any 通常不进入混杂模式。
port 80BPF 过滤表达式。匹配源端口或目的端口为 80 的包,等价于:src port 80 or dst port 80。通常是 TCP/UDP 端口;如果只想抓 TCP 80,应写 tcp port 80。
-nn实际是两个 -n 叠加。第一个 n 禁止把 IP 地址反解为主机名;第二个 n 禁止把端口号反解为服务名。例如端口 80 显示为 80,而不是 http。同时可减少 DNS/服务查询带来的延迟。

本地通过浏览器访问49.224:80端口,举例如下:

[root@www ~]# tcpdump -i any port 80 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
1. 15:56:52.637193 IP 10.9.4.253.50796 > 192.168.49.224.80: Flags [S], seq 2351164921, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
2. 15:56:52.637385 IP 192.168.49.224.80 > 10.9.4.253.50796: Flags [S.], seq 107526675, ack 2351164922, win 64240, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
3. 15:56:52.638340 IP 10.9.4.253.59150 > 192.168.49.224.80: Flags [S], seq 2621911150, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
4. 15:56:52.638377 IP 192.168.49.224.80 > 10.9.4.253.59150: Flags [S.], seq 2193990366, ack 2621911151, win 64240, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
5. 15:56:52.638813 IP 10.9.4.253.50796 > 192.168.49.224.80: Flags [.], ack 1, win 255, length 0
6. 15:56:52.639121 IP 10.9.4.253.59150 > 192.168.49.224.80: Flags [.], ack 1, win 255, length 0
7. 15:56:52.639582 IP 10.9.4.253.50796 > 192.168.49.224.80: Flags [P.], seq 1:571, ack 1, win 255, length 570: HTTP: GET / HTTP/1.1
8. 15:56:52.639617 IP 192.168.49.224.80 > 10.9.4.253.50796: Flags [.], ack 571, win 498, length 0
9. 15:56:52.640250 IP 192.168.49.224.80 > 10.9.4.253.50796: Flags [P.], seq 1:352, ack 571, win 498, length 351: HTTP: HTTP/1.1 302 Moved Temporarily
10. 15:56:52.658744 IP 10.9.4.253.50796 > 192.168.49.224.80: Flags [P.], seq 571:1150, ack 352, win 254, length 579: HTTP: GET /sign-sys/ HTTP/1.1
11. 15:56:52.659308 IP 192.168.49.224.80 > 10.9.4.253.50796: Flags [P.], seq 352:7652, ack 1150, win 494, length 7300: HTTP: HTTP/1.1 200 OK
12. 15:56:52.659566 IP 192.168.49.224.80 > 10.9.4.253.50796: Flags [P.], seq 7652:13492, ack 1150, win 494, length 5840: HTTP
13. :56:52.659726 IP 192.168.49.224.80 > 10.9.4.253.50796: Flags [P.], seq 13492:14565, ack 1150, win 494, length 1073: HTTP
14. 15:56:52.659869 IP 10.9.4.253.50796 > 192.168.49.224.80: Flags [.], ack 3272, win 255, length 0
15. 15:56:52.659869 IP 10.9.4.253.50796 > 192.168.49.224.80: Flags [.], ack 7652, win 255, length 0
16. 15:56:52.660047 IP 10.9.4.253.50796 > 192.168.49.224.80: Flags [.], ack 10572, win 255, length 0
17. 15:56:52.660047 IP 10.9.4.253.50796 > 192.168.49.224.80: Flags [.], ack 13492, win 255, length 0
18. 15:56:52.660180 IP 10.9.4.253.50796 > 192.168.49.224.80: Flags [.], ack 14565, win 251, length 0
19. 15:56:52.726180 IP 10.9.4.253.50796 > 192.168.49.224.80: Flags [P.], seq 1150:1644, ack 14565, win 251, length 494: HTTP: GET /sign-sys/css/app.593b4c90.css HTTP/1.1
20. 15:56:52.730263 IP 192.168.49.224.80 > 10.9.4.253.50796: Flags [P.], seq 14565:29165, ack 1644, win 491, length 14600: HTTP: HTTP/1.1 200 OK
21. 15:56:52.730594 IP 192.168.49.224.80 > 10.9.4.253.50796: Flags [P.], seq 29165:31230, ack 1644, win 491, length 2065: HTTP
22. 15:56:52.731043 IP 10.9.4.253.50796 > 192.168.49.224.80: Flags [.], ack 24785, win 255, length 0
23. 15:56:52.731229 IP 10.9.4.253.50796 > 192.168.49.224.80: Flags [.], ack 31230, win 255, length 0
24. 15:56:52.734447 IP 192.168.49.224.80 > 10.9.4.253.50796: Flags [P.], seq 31230:50210, ack 1644, win 491, length 18980: HTTP
25. 15:56:52.734787 IP 192.168.49.224.80 > 10.9.4.253.50796: Flags [P.], seq 50210:69190, ack 1644, win 491, length 18980: HTTP
26. 15:56:52.734978 IP 192.168.49.224.80 > 10.9.4.253.50796: Flags [.], seq 69190:70650, ack 1644, win 491, length 1460: HTTP

第一阶段:TCP 三次握手(建立连接),1-6行:实际是完成了2次并发TCP连接,1、2、5行为一次,3、4、6行为一次

  • [S]:客户端发送 SYN 包,请求建立连接。携带了 MSS(最大报文段长度 1460)、wscale 8(窗口缩放因子)、sackOK(支持选择性确认)等 TCP 选项
  • [S.]:服务器回复 SYN-ACK,携带自己的序列号和 wscale 7
  • [.]:客户端回复纯 ACK 确认。连接建立完成

    第二阶段:HTTP 请求与 302 重定向(业务逻辑),服务器和客户端开始进行 HTTP 对话

    • 第7行:客户端 50796 发起请求:length 570: HTTP: GET / HTTP/1.1,说明客户端在请求网站的根目录 /
    • 第 8 行:服务器回复 ACK,确认收到请求
    • 第 10 行:服务器返回响应:length 351: HTTP: HTTP/1.1 302 Moved Temporarily,服务器告诉客户端:“你要找的根目录被临时移动了(通常是因为 HTTP 跳转 HTTPS,或者跳转到带有区域/语言前缀的路径)”
    • 第 13 行:客户端 50796 根据 302 的提示,发起第二次请求:length 579: HTTP: GET /sign-sys/ HTTP/1.1,说明页面最终落脚点在 /sign-sys/ 这个路径
    • 第 14 行:服务器回复 ACK,剩下的其他行以此类推

    符号讲解:

    1、[S] —— SYN (Synchronize Sequence Numbers)

    • 中文含义:同步序列号
    • 实际作用:发起连接请求
    • 场景:当客户端想要和服务器建立连接时,会发送带有 S 标志的包。相当于在敲门:“喂,你在吗?我想和你建立连接,我的初始序号是 XXX”。

    2、[S.] —— SYN + ACK (Synchronize + Acknowledge)

    • 中文含义:同步 + 确认
    • 注意:tcpdump 用英文句号 . 来代表 ACK(确认)标志,这是为了输出界面更简洁
    • 实际作用:同意连接并回复
    • 场景:服务器收到 [S] 后,会回复一个 [S.] 包。相当于服务器开门回应:“我在,我同意建立连接,我的初始序号是 YYY,我也收到了你刚才的序号 XXX”

    3、[.] —— ACK (Acknowledge)

    • 中文含义:确认
    • 实际作用:表示“我收到了”。它相当于日常聊天里的“点头”或“嗯”一声,证明数据安全送达,没有携带任何业务数据(所以你看后面常常跟着 length 0)
    • 三次握手最后一步:客户端回复 [.],表示我收到你的同意了,连接正式建立
    • 数据接收确认:你截图中后半段连续出现好几行 [.],这是客户端在向服务器确认:“你发来的前面 7300 字节我收到了”、“前面 13492 字节我也收到了”。