核心是让心跳节奏精准匹配防火墙真实空闲超时值:先实测确认超时值(如tcpdump抓RST/FIN或ss -i查突变),再分层设置内核Keepalive(如240s/30s/3)与双向响应的应用层心跳(≤超时值70%),Nginx需配齐keepalive、HTTP/1.1、Connection清空及socket探测参数,并伪装心跳包、引入随机抖动,最后用tcpdump闭环验证。

核心是让心跳节奏精准匹配防火墙真实空闲超时值,既不能晚于断连时刻,也不能过于频繁引发误判。
先实测确认防火墙真实超时值
别信文档或默认值,必须实测。用 tcpdump 抓包观察:最后一次业务数据发出后,多久出现 RST 或 FIN;或用 ss -i 查看 retrans 和 rto 的突变点。常见值有:企业防火墙多为 300 秒,云厂商 NAT 网关常为 30–180 秒,部分严格环境低至 60 秒。若用了 Nginx/HAProxy 等代理,还要检查其 timeout client/server 配置——它们可能比底层设备更短,成了实际瓶颈。
分层设心跳:内核 + 应用双保活
单靠某一层不可靠:
- 内核 Keepalive 作兜底:启用 SO_KEEPALIVE,并调低参数,例如:
net.ipv4.tcp_keepalive_time = 240(4 分钟启动探测)
net.ipv4.tcp_keepalive_intvl = 30(每 30 秒重探)
net.ipv4.tcp_keepalive_probes = 3(最多探 3 次即断) - 应用层心跳必须双向响应:只发不等回包等于没发;服务端收到后须立即返回 ACK/PONG,客户端收到才算一次有效心跳
- 应用层心跳间隔 ≤ 防火墙超时的 70%:若实测为 300 秒,就设 ≤200 秒;若为 90 秒,则设 ≤60 秒
Nginx 代理场景必须配齐四要素
仅开 proxy_socket_keepalive on 不起作用:
- upstream 块中启用连接池:keepalive 64;
- 显式声明 HTTP/1.1:proxy_http_version 1.1;
- 清空 Connection 头:proxy_set_header Connection "";
- 参数化开启探测:proxy_socket_keepalive on 240s 10s 3;(240 秒空闲后开始,每 10 秒一次,3 次无响应即清理)
同时同步调优系统级参数:tcp_keepalive_time=300、tcp_keepalive_intvl=10、tcp_keepalive_probes=3,否则 Nginx 探测可能被内核忽略。
绕过防火墙深度检测的实用技巧
很多设备会识别并丢弃“非业务特征”的心跳包:
- 伪装成合法业务帧:HTTP 代理中用 OPTIONS /health HTTP/1.1 并加 X-Keepalive: 1 头;TCP 透传代理可模拟 MQTT 的 PINGREQ/PINGRESP 或嵌入 TLS 握手片段
- 引入随机抖动:心跳周期加 ±10% 浮动(如设定 60 秒,实际在 54–66 秒间发送),避免被流量分析引擎识别为固定探测行为
- 验证是否生效:不能只看配置或日志,必须用 tcpdump 抓包确认 TCP 层是否真有 KEEPALIVE+ACK 流量发出

















