TCP三次握手是客户端与服务端建立连接的必要过程:客户端发SYN,服务端回SYN+ACK,客户端再发ACK;三次交互确保双向通信可靠、初始序列号同步,并防止历史报文引发的资源浪费。

可以通过 Shell 脚本调用 tcpdump 捕获 TCP 三次握手的 SYN、SYN-ACK 包,结合超时控制与包匹配逻辑,快速判断目标服务是否响应连接请求。关键不在于抓全流量,而是在有限时间窗口内确认至少一个有效握手完成。
一、明确判定逻辑:只捕获关键握手包
网络连通性在 TCP 层最直接的体现是目标端口能返回 SYN-ACK。因此脚本只需:
- 用
tcpdump过滤目标 IP 和端口的tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn(SYN)和tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn|tcp-ack(SYN-ACK) - 设置合理抓包时长(如 5 秒),避免无限等待
- 检查是否捕获到至少一个 SYN-ACK 包 —— 这代表远端已响应连接请求
二、基础可运行脚本示例
以下脚本接受目标 IP 和端口,启动 tcpdump 捕获 5 秒,检测是否存在 SYN-ACK:
#!/bin/bash
TARGET_IP=${1:-"127.0.0.1"}
TARGET_PORT=${2:-"80"}
TIMEOUT=5
启动 tcpdump 捕获 SYN 和 SYN-ACK,输出简明格式,超时退出
OUTPUT=$(timeout $TIMEOUT tcpdump -n -c 10 -i any "host $TARGET_IP and port $TARGET_PORT and (tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn or tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn|tcp-ack)" 2>/dev/null | grep -q "SYN.*ACK" && echo "success" || echo "fail")
if [ "$OUTPUT" = "success" ]; then echo "[OK] $TARGET_IP:$TARGET_PORT responded with SYN-ACK" exit 0 else echo "[FAIL] No SYN-ACK received from $TARGET_IP:$TARGET_PORT within $TIMEOUT seconds" exit 1 fi
说明:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
-c 10限制最多捕获 10 个包,防止缓存堆积 -
grep -q "SYN.*ACK"利用 tcpdump 默认输出中的文字标识快速判断(比解析 pcap 更轻量) -
timeout是核心,确保脚本不会卡住;若系统无 timeout 命令,可用( cmd & ) PID=$!; sleep $TIMEOUT; kill $PID 2>/dev/null替代
三、部署时增强健壮性的建议
实际部署中需考虑权限、环境差异和误判:
- 确保执行用户有
cap_net_raw权限或以 root 运行(sudo setcap cap_net_raw+ep /usr/sbin/tcpdump可免 root) - 指定网卡接口(如
-i eth0)比-i any更稳定,尤其在多网卡服务器上 - 避免仅依赖 SYN 包(客户端发出的 SYN 可能被防火墙丢弃但无反馈),SYN-ACK 才是服务端可达的强信号
- 可在调用前先 ping 通目标 IP(排除路由/ICMP 层问题),再测端口,分层定位更清晰
四、集成进 CI/CD 或健康检查的用法
例如在 Kubernetes 的 livenessProbe.exec 或 Ansible 的 command 模块中直接调用:
# 在 pod spec 中
livenessProbe:
exec:
command: ["/bin/sh", "-c", "/opt/bin/check-tcp-handshake.sh example.com 443"]
initialDelaySeconds: 30
periodSeconds: 10
或在部署后 shell 流程中:
./check-tcp-handshake.sh 10.10.20.5 8080 || { echo "Service unreachable"; exit 1; }
不复杂但容易忽略:SYN-ACK 的存在比应用层响应(如 HTTP 200)更快、更底层,适合部署初期快速验证网络栈连通性。只要三次握手能完成,基本说明防火墙放行、路由可达、服务进程已 bind 监听 —— 这正是部署后第一道“心跳”该检查的内容。










