tcpdump抓三次握手关键在于精准过滤SYN、SYN+ACK、ACK标志位包:用tcp[tcpflags] & (tcp-syn|tcp-ack) != 0匹配三类报文,配合-S显示绝对序列号、-s 0全包捕获、-w保存文件;成功握手需满足seq/ack数值规律——第一包[S] seq=x ack=0,第二包[S.] seq=y ack=x+1,第三包[.] seq=x+1 ack=y+1。

直接用 tcpdump 抓三次握手包,关键不是“过滤所有 TCP 包”,而是精准定位 SYN、SYN+ACK、ACK 这三类标志位组合的报文。因为三次握手只涉及这三种特定状态,抓全了就能清晰还原连接建立过程。
只抓三次握手的标志位包
执行这条命令即可:
tcpdump -i any -nn -vv -S 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0 and port <端口号>'
-
替换为你目标服务的端口,比如80、443、22或10005 -
tcp[tcpflags] & (tcp-syn|tcp-ack) != 0表示:只要 TCP 标志位中包含 SYN 或 ACK(即SYN、SYN+ACK、ACK都命中),就保留该包 -
-S强制显示绝对序列号,避免相对序号干扰 seq/ack 的验证逻辑 -
-vv提供足够字段信息(如ack值、win、options),方便后续比对
如果已知目标 IP,推荐加上主机过滤,减少干扰:
tcpdump -i any -nn -vv -S 'host 192.168.1.100 and tcp[tcpflags] & (tcp-syn|tcp-ack) != 0 and port 80'
为分析更可靠,建议加两个实用选项
-
-s 0:捕获完整数据包,防止截断导致看不到 TCP 头部关键字段 -
-w handshake.pcap:保存为 pcap 文件,后续可用 Wireshark 仔细查看或多人协作分析
例如完整命令:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
tcpdump -i any -nn -vv -S -s 0 -w handshake.pcap 'host 192.168.1.100 and tcp[tcpflags] & (tcp-syn|tcp-ack) != 0 and port 80'
怎么确认抓到的就是完整三次握手?
看输出中连续三条符合以下规律的包(以客户端 10.0.0.5 访问服务端 10.0.0.10:80 为例):
- 第一条:
Flags [S],seq = x,ack = 0 - 第二条:
Flags [S.],seq = y,ack = x + 1 - 第三条:
Flags [.],seq = x + 1,ack = y + 1
只要这三组数值全部吻合,就说明握手成功、无丢包或重传干扰。
补充:想快速验证是否真有三次握手,可先抓纯 TCP 流量探路
tcpdump -i any -nn tcp port 80 -c 20
观察前几行是否有 [S] → [S.] → [.] 的连续出现。有,再用带标志位过滤的命令精抓;没有,说明目标未建连或端口不对。

















