首页/网络/抓包与流量分析速查/tcpdump 抓 SYN 建连请求

tcpdump 抓 SYN 建连请求

抓取建连相关报文(SYN、SYN-ACK):用于统计连接尝试、观察握手是否被回应、判断是否有 SYN 重传或半开连接。

抓 SYN 在做什么

抓建连请求有两种写法:tcp[tcpflags] = tcp-syn 只匹配纯 SYN,也就是没有置 ACK 位的建连请求;tcp[tcpflags] & tcp-syn != 0 匹配所有出现过 SYN 位的报文,包含服务端回的 SYN-ACK。前者的价值在精确:一台服务器上每秒可能流过成千上万个包,只看建连请求能把数据量压到最低,最适合回答「客户端到底有没有发起连接」。后者适合看建连全貌,两种写法对应两个不同的问题。

基本信息

纯 SYNtcp[tcpflags] = tcp-syn,只有 SYN 位
含 SYN 的报文tcp[tcpflags] & tcp-syn != 0,SYN 与 SYN-ACK 都命中
只看 SYN-ACKtcp[tcpflags] = tcp-syn|tcp-ack
Wireshark 等价写法tcp.flags.syn == 1 && tcp.flags.ack == 0
标志位数值FIN=0x01、SYN=0x02、RST=0x04、PSH=0x08、ACK=0x10

典型使用场景

  • 用户报连不上时先确认请求有没有发出,纯 SYN 就能给出结论
  • 统计某端口每秒建连次数,判断是正常业务还是扫描与压测
  • 排查半开连接:服务端收了 SYN 却回不出 SYN-ACK 时,纯 SYN 会明显多于 SYN-ACK
  • 观察客户端重试行为:同一源端口出现多个纯 SYN 且间隔递增即为重传
  • 识别健康检查:负载均衡与监控会周期性产生 SYN,统计前先按来源剔除

常用示例

常用示例
tcpdump -i eth0 -nn -c 20 'tcp[tcpflags] = tcp-syn'                 # 只看纯 SYN
tcpdump -i eth0 -nn 'dst port 443 and tcp[tcpflags] = tcp-syn'      # 只看发往 443 的建连请求
tcpdump -i eth0 -nn 'tcp[tcpflags] = tcp-syn|tcp-ack'              # 只看服务端应答
tcpdump -i eth0 -nn -ttt 'tcp[tcpflags] = tcp-syn' -c 10           # 加相对时间看重传间隔
tcpdump -nn -r a.pcap 'src host 10.0.0.9 and tcp[tcpflags] & tcp-syn != 0' | wc -l   # 离线统计
tcpdump -i eth0 -nn 'net 10.10.0.0/16 and tcp[tcpflags] = tcp-syn' # 只看某网段发起的建连

四种写法对照

写法匹配什么判读用途
tcp[tcpflags] = tcp-syn只有 SYN 位,没有 ACK建连请求,统计请求量必须用它
tcp[tcpflags] = tcp-syn|tcp-ackSYN 与 ACK 同时置位服务端应答,与纯 SYN 配对看是否成对
tcp[tcpflags] & tcp-syn != 0只要含 SYN 位就算一次抓齐请求与应答,看整体节奏
tcp[tcpflags] & (tcp-syn|tcp-fin|tcp-rst) != 0建连与拆除相关报文看连接生命周期,不关心数据内容
纯 SYN 与 SYN-ACK 的数量差两个计数相减差值明显说明有请求没被应答,需要继续定位
判断请求有没有被应答,最省事的办法是同一抓包点上分别数纯 SYN 与 SYN-ACK:两者数量接近说明握手基本成对,纯 SYN 明显多出来就是没被应答的那部分。
用 & 与 != 0 的写法会把 SYN-ACK 一并抓进来。如果目的是统计建连请求数,用这种写法会让结果偏大,必须改用等于号写法。

与连接状态对照

与连接状态对照
ss -s | head -5                      # 看各状态连接计数
netstat -s | grep -i -A2 listen      # 观察建连相关统计是否异常增长
sysctl net.ipv4.tcp_syn_retries      # 客户端重试次数,决定多久后放弃

判读要点

  • 只有纯 SYN 而没有对应的 SYN-ACK:请求到了服务端或没到,要结合服务端抓包区分
  • 纯 SYN 数量与 SYN-ACK 数量大致相等:握手正常,问题在后续数据传输或应用处理
  • 同一源端口出现多个纯 SYN:客户端在重传,说明上行方向有丢包或服务端不回
  • SYN 大量来自少数源地址且端口分散:典型的端口扫描特征,值得交给安全侧确认

与 SYN 相关的异常

  • 半开连接堆积:服务端收到大量 SYN 但来不及回,多是半连接队列偏小或遭遇洪水攻击
  • 只有 SYN 没有 SYN-ACK 也没有 RST:请求在路径上被静默丢弃,属于防火墙类行为特征
  • SYN 的窗口为 0 或 MSS 异常小:说明是特定客户端或中间设备改写过的报文,判读要谨慎
  • 同一源地址在多个目的端口上快速发 SYN:扫描或客户端连接风暴,需要确认业务是否正常
  • SYN 与 SYN-ACK 时间差稳定但很大:多数是距离造成的正常往返时延,不要误判为服务慢

易错点

  • 混用 & 与 = 两种写法会让统计结果偏差,数请求量必须用等于号写法
  • 负载均衡与监控的健康检查会产生大量 SYN,统计前不排除会把正常心跳算成用户请求
  • 抓包点看不到回程时,纯 SYN 与 SYN-ACK 的数量对比会失真,关键问题要两端同时抓
  • 只看到 SYN 不能证明服务端口有问题:目标地址写错、路由不可达同样只会看到 SYN
  • 中间设备可能改写 SYN 的选项字段,不能仅凭 MSS 或窗口缩放推断发送端身份

数据来源与参考

  • man 8 pcap-filter
  • RFC 9293(TCP 建连)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌