NAT 超时为什么会断开业务
NAT 设备为每个经过转换的连接维护一条会话表项,表项有老化时间,一段时间没有报文就会过期删除。对短连接业务这没有问题,但长连接业务——空闲的 SSH 会话、数据库连接池、依赖心跳的语音注册——在空闲期内没有流量,表项到期被静默回收,下一条报文再进来时找不到映射,连接就被重建甚至直接失败。用户看到的典型现象是每隔几分钟断一次,而且很有规律。
基本信息
| 适用场景 | 长连接业务被中途断开 |
|---|---|
| 思科命令 | ip nat translation timeout 与 tcp-timeout、udp-timeout 分开设置 |
| 华为/H3C 思路 | 先看会话表里的剩余老化时间,再决定调参或改用应用侧心跳 |
| 关键权衡 | 超时过长会积累僵尸会话,超时过短会切断长连接 |
| 观察命令 | display nat session all、show ip nat translations |
典型使用场景
- 数据库连接池:空闲连接被回收后应用反复重连,业务出现间歇性失败
- 远程登录会话:SSH 空闲几分钟就断开,运维体验差
- 语音与视频业务:注册依赖周期性心跳,心跳间隔与老化时间冲突时掉线
- 监控与采集:长轮询连接被中断,采集出现数据缺口
- 容量治理:会话表接近上限时,既要把无效会话尽早老化,也要保住必要长连接
思科 IOS
思科 IOS
SW-CORE-01(config)# ip nat translation timeout 86400 ! 通用老化时间(秒)
SW-CORE-01(config)# ip nat translation tcp-timeout 86400 ! TCP 连接单独延长
SW-CORE-01(config)# ip nat translation udp-timeout 300 ! UDP 保持较短
SW-CORE-01# show ip nat translations | include tcp
SW-CORE-01# show run | include ip nat translation华为 VRP 与 H3C
华为 VRP 与 H3C
<Huawei> display nat session all ! 查看当前会话表
<Huawei> display nat session all verbose ! 观察剩余老化时间,判断是否偏短
! 会话老化参数随版本与平台不同,用命令补全确认后再改
<H3C> display nat session all
<H3C> display nat session verbose参数调整怎么权衡
| 方向 | 影响 | 适用判断 |
|---|---|---|
| 超时调长 | 长连接更稳定 | 会话表容量充足、业务有明显空闲期 |
| 超时调短 | 快速回收无效会话 | 会话表接近上限,短连接业务为主 |
| TCP 与 UDP 分开设 | 按业务特性分别优化 | TCP 业务多空闲、UDP 多短交互 |
| 应用侧心跳 | 从根本上维持会话活跃 | 无法修改设备参数或需长期解决 |
| 会话表容量 | 决定同时在线连接数上限 | 业务增长时往往先撞到这一项 |
调整超时前先在设备上看会话表的实际剩余老化时间,用它反推是设备老化太快还是应用侧根本没有保活机制。只看现象直接调参数,容易在错误的方向上花时间。
把超时时间设置得过长会让大量已失效的会话长期占用表项,新连接可能因为表满而建立失败。延长超时需要同时评估会话表容量,必要时从应用侧加心跳包维持连接。