tcpdump过滤syn包应使用tcp[tcpflags] == tcp-syn语法,精确匹配仅syn置位(值为2)的包,避免字符串匹配;syn-ack则用tcp[tcpflags] == tcp-syn|tcp-ack或tcp[13] == 18。

直接用 tcpdump 过滤 SYN 包,核心是利用 TCP 标志位匹配,而不是靠字符串搜索(如 Flags[S]),因为后者依赖输出格式、易出错且无法用于写入文件后的离线分析。
用 tcpdump 原生语法过滤 SYN 包
SYN 包的 TCP 标志位中,只有 SYN 位被置 1,其余(ACK、FIN、RST 等)为 0。对应二进制值为 2(即 00000010)。
推荐写法(兼容性好、语义清晰):
tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn) != 0 and tcp[tcpflags] == (tcp-syn)'- 更简洁常用写法:
tcpdump -i eth0 'tcp[tcpflags] == tcp-syn'
说明:
-
tcp[tcpflags]表示取 TCP 头部中的标志字节(第 13 字节,从 0 开始计) -
tcp-syn是 tcpdump 内置符号,等价于数值 2 -
== tcp-syn精确匹配仅 SYN 置位的包(排除 SYN-ACK、SYN-FIN 等复合情况)
过滤 SYN-ACK(服务端响应)
三次握手中,服务器回复的包是 SYN 和 ACK 同时置位,对应值为 18(2 + 16)。
命令示例:
tcpdump -i eth0 'tcp[tcpflags] == tcp-syn|tcp-ack'- 或用数值:
tcpdump -i eth0 'tcp[13] == 18'
注意:tcp-syn|tcp-ack 是 tcpdump 支持的位或写法,比硬编码数字更可读、不易出错。
实用增强组合
单抓 SYN 包常需结合上下文,以下组合更贴近排查场景:
- 只看发往本机 80 端口的 SYN(疑似 Web 扫描或连接请求):
tcpdump -i eth0 'dst port 80 and tcp[tcpflags] == tcp-syn' - 排除本地回环和已知内网段,专注外网 SYN:
tcpdump -i eth0 'not host 127.0.0.1 and not net 192.168.0.0/16 and tcp[tcpflags] == tcp-syn' - 抓 100 个 SYN 包后停止,并保存为 pcap:
tcpdump -i eth0 -c 100 'tcp[tcpflags] == tcp-syn' -w syn-only.pcap
验证是否真抓到 SYN 包
运行后观察输出,合法 SYN 包行末应显示 Flags [S],例如:
若看到 [S.] 或 [S.].,说明 ACK 也被置位,属于 SYN-ACK 或重传异常,不属于纯 SYN。











