抓 SYN 在做什么
抓建连请求有两种写法:tcp[tcpflags] = tcp-syn 只匹配纯 SYN,也就是没有置 ACK 位的建连请求;tcp[tcpflags] & tcp-syn != 0 匹配所有出现过 SYN 位的报文,包含服务端回的 SYN-ACK。前者的价值在精确:一台服务器上每秒可能流过成千上万个包,只看建连请求能把数据量压到最低,最适合回答「客户端到底有没有发起连接」。后者适合看建连全貌,两种写法对应两个不同的问题。
基本信息
| 纯 SYN | tcp[tcpflags] = tcp-syn,只有 SYN 位 |
|---|---|
| 含 SYN 的报文 | tcp[tcpflags] & tcp-syn != 0,SYN 与 SYN-ACK 都命中 |
| 只看 SYN-ACK | tcp[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-ack | SYN 与 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 时间差稳定但很大:多数是距离造成的正常往返时延,不要误判为服务慢