目录
net.netfilter.nf_conntrack_tcp_timeout_established
是 Linux 内核中控制 TCP 已建立连接在连接跟踪系统(conntrack)中保持时间 的参数。该参数直接影响系统资源占用和防火墙/NAT 对长时间空闲连接的处理方式。
一、核心概念
1. TCP 连接状态跟踪
- Linux 的 conntrack 系统会记录 TCP 连接的整个生命周期(SYN_SENT → ESTABLISHED → FIN_WAIT → TIME_WAIT)。
- ESTABLISHED 状态表示连接已成功建立,数据正在传输。
2. 参数作用
net.netfilter.nf_conntrack_tcp_timeout_established
定义了 ESTABLISHED 状态的 TCP 连接在 conntrack 表中保留的最大空闲时间。当连接连续空闲超过此时间:
- conntrack 会删除该连接记录
- 后续数据包可能被防火墙视为新连接,需重新验证规则
- 若使用 NAT,可能导致连接中断
二、默认值与典型场景
1. 默认值
- 大多数 Linux 发行版默认值为 43,200 秒(即 12 小时)。
2. 典型场景
场景 | 建议值 | 说明 |
---|---|---|
普通 Web 应用 | 1800-3600 秒 | Web 会话通常不会持续超过 1 小时,缩短超时可释放资源 |
数据库连接(如 MySQL) | 28,800 秒 | MySQL 默认超时为 8 小时,需与应用配置匹配 |
VPN 连接 | 86,400 秒 | VPN 会话可能需要持续一整天,避免频繁重连 |
高并发服务器 | 300-900 秒 | 通过快速回收资源应对大量短连接 |
三、如何调整该参数
1. 查看当前值
sysctl net.netfilter.nf_conntrack_tcp_timeout_established
2. 临时修改(重启后失效)
# 设置为 1 小时(3600 秒)
sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=3600
3. 永久修改
编辑 /etc/sysctl.conf
或 /etc/sysctl.d/
目录下的配置文件:
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
保存后执行:
sudo sysctl -p
四、相关参数与配合优化
1. 其他 TCP 状态超时参数
参数名 | 作用 | 默认值 |
---|---|---|
net.netfilter.nf_conntrack_tcp_timeout_syn_sent |
SYN_SENT 状态超时(未收到 SYN_ACK) | 120 秒 |
net.netfilter.nf_conntrack_tcp_timeout_syn_recv |
SYN_RECV 状态超时(半开连接) | 60 秒 |
net.netfilter.nf_conntrack_tcp_timeout_time_wait |
TIME_WAIT 状态超时 | 120 秒 |
net.netfilter.nf_conntrack_tcp_timeout_close_wait |
CLOSE_WAIT 状态超时 | 60 秒 |
2. 与应用层超时配合
确保 conntrack 超时值 大于等于 应用层超时设置,避免意外中断:
- MySQL:
wait_timeout
参数默认 28,800 秒(8 小时) - HTTP 代理:如 Nginx 的
keepalive_timeout
默认 75 秒 - SSH:
ClientAliveInterval
和ClientAliveCountMax
控制连接保持
五、常见问题与解决
1. 长时间空闲连接中断
- 症状:SSH/数据库/VPN 等长时间空闲后无法继续通信
- 可能原因:
- conntrack 超时小于应用层设置
- 中间设备(如防火墙)提前关闭了连接
- 解决:
# 增加 conntrack 超时时间 sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=86400 # 或配置应用层保活机制(如 SSH 的 ClientAliveInterval)
2. conntrack 表占用过多内存
- 症状:系统内存使用率高,conntrack 条目数增长快
- 解决:
# 缩短已建立连接的超时时间 sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=1800 # 30 分钟 # 结合自动清理脚本 conntrack -D -o time # 删除最旧的连接
3. 与 NAT 结合的问题
- 症状:NAT 环境下,长时间空闲后连接无法恢复
- 解决:
- 增加 conntrack 超时
- 启用应用层保活(如 TCP keepalive):
sysctl -w net.ipv4.tcp_keepalive_time=1800 # 30 分钟发送一次 keepalive sysctl -w net.ipv4.tcp_keepalive_probes=5 # 连续 5 次失败才断开
六、性能影响分析
1. 缩短超时的优势
- 减少 conntrack 表内存占用
- 降低哈希表冲突概率,提升查找效率
- 更快释放系统资源
2. 过长超时的风险
- 占用大量内存,可能导致
conntrack table full
错误 - 空闲连接累积,影响防火墙性能
- 僵尸连接无法及时清理
七、总结
- 参数作用:控制已建立 TCP 连接在 conntrack 表中的最大空闲时间。
- 调优原则:
- 根据应用特性设置合理超时(通常 30 分钟到 8 小时)
- 确保与应用层超时参数匹配
- 高并发场景下优先缩短超时以释放资源
- 监控建议:
# 查看当前 ESTABLISHED 连接数量 conntrack -L -s <源IP> | grep ESTABLISHED | wc -l # 监控 conntrack 内存使用 watch -d "cat /proc/sys/net/netfilter/nf_conntrack_count"
合理配置 net.netfilter.nf_conntrack_tcp_timeout_established
是优化网络性能和资源利用率的重要步骤。