目錄
- 一、核心概念
- 1. **TCP 連接狀態跟蹤**
- 2. **參數作用**
- 二、默認值與典型場景
- 1. **默認值**
- 2. **典型場景**
- 三、如何調整該參數
- 1. **查看當前值**
- 2. **臨時修改(重啟后失效)**
- 3. **永久修改**
- 四、相關參數與配合優化
- 1. **其他 TCP 狀態超時參數**
- 2. **與應用層超時配合**
- 五、常見問題與解決
- 1. **長時間空閑連接中斷**
- 2. **conntrack 表占用過多內存**
- 3. **與 NAT 結合的問題**
- 六、性能影響分析
- 1. **縮短超時的優勢**
- 2. **過長超時的風險**
- 七、總結
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
是優化網絡性能和資源利用率的重要步驟。