NAT 会话空闲超时是什么
NAT 网关做地址转换时要为每条会话维护一条映射表项,记录「内网地址端口 ↔ 公网地址端口」的对应关系。会话在设定的空闲时间内没有流量往来,这条表项就会被回收、端口归还池子。于是超时成了一个需要权衡的参数:太短,业务侧的长连接会在无数据时被静默断开,表现为周期性重连;太长,端口长期被不活跃的会话占着,高峰期新连接建不起来。
基本信息
| 机制 | SNAT 会话在空闲超时后被回收映射,端口归还地址池 |
|---|---|
| 默认值 | 由产品设定,常见区间为几十秒到数百秒 |
| 过短症状 | 长连接周期性断开,客户端频繁重连 |
| 过长症状 | 端口资源被闲置会话占用,新建连接失败率上升 |
| 调优依据 | 与业务心跳周期对齐,观察连接失败率与端口使用率 |
| 可调范围 | 各厂商不同,是否可自助调整以产品文档为准 |
典型使用场景
- 长连接业务(推送、WebSocket、数据库连接池)出现规律性断连
- 高并发出口在建连高峰失败,需要判断是否端口被占满
- 改造心跳周期前先确认 NAT 超时,避免心跳比超时还长
- 排查「空闲一段时间后第一个请求超时」的间歇性故障
- 按业务类型分出口:长连接与短连接分别走不同 NAT 实例
超时设置的影响
| 设置 | 对长连接的影响 | 对端口资源的影响 |
|---|---|---|
| 过短 | 空闲时被回收,出现周期性断连 | 回收快,端口压力小 |
| 默认 | 多数业务可用 | 平衡 |
| 过长 | 连接稳定 | 闲置会话占用端口,建连失败风险上升 |
| 极长 | 几乎不断 | 端口可能被彻底占满,影响整体可用性 |
观察空闲连接存活时长
观察空闲连接存活时长
timeout 600 nc -v <出口地址> 443 # 建立连接后保持空闲
date +%T # 记录开始时间
# 观察连接被断开的时间点,推算空闲超时的大致值
while true; do date +%T; ss -tn state established '( dport = :443 )' | wc -l; sleep 30; done
# 对照业务心跳周期:心跳必须明显短于空闲超时超时相关默认值与可调范围因厂商而异,具体以所在产品文档为准。调整前先确认业务侧心跳与重连逻辑是否健全——有重连兜底时,短超时的代价只是多几次握手。
为保住长连接把超时调得极大,短期问题消失但端口资源被长期占用,高峰期会以「大量新建连接失败」的形式集中爆发,且更难定位。