Linux 遇到 nf_conntrack: table full, dropping packet 解法

系統平常跑得很正常,為何灌了 Docker 後,dmesg 開始出現下述的訊息:

  • nf_conntrack: table full, dropping packet

要怎麼解決呢?

Linux 遇到 nf_conntrack: table full, dropping packet 解法

主要是問題在於 Docker 灌了後,預設會開啟 nf_conntrack 追蹤功能(因為 Docker 系統內部都是走 NAT,想要追蹤每個連線,不過這不是必要的),而追蹤連線的條數越來越多(量大的話),來不及消耗掉,就會滿載,滿載就會出現此訊息。

先講我的解法

  1. sudo iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT
  2. sudo iptables -L # 確認有此 "ACCEPT all -- anywhere anywhere state UNTRACKED" 行
  3. 若上述執行太多次,會顯示很多行,可以用下述刪除
    • sudo iptables -D FORWARD -m state --state UNTRACKED -j ACCEPT

此篇文章列了幾種解法:解決 nf_conntrack: table full, dropping packet 的幾種思路

  1. 移除 nf_conntrack 模組
    1. 移除前先注意 iptables 有沒有使用到 state 模組的規則
      • ex: -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
    2. sudo modprobe -r xt_NOTRACK nf_conntrack_netbios_ns nf_conntrack_ipv4 xt_state
    3. sudo modprobe -r nf_conntrack
  2. 調整 /proc conntrack 等等的數字 (/etc/sysctl.conf),增加 CONNTRACK_MAX 與 HASHSIZE 的值 並且縮短 timeout 值
    • $ sudo su -c "echo 100000 > /proc/sys/net/netfilter/nf_conntrack_max" #
    • $ sudo su -c "echo 50000 > /proc/sys/net/netfilter/nf_conntrack_buckets"
    • $ sudo su -c "echo 600 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established"
    • vim /etc/sysctl.conf # 增加下述
      • net.netfilter.nf_conntrack_max = 655350
      • net.netfilter.nf_conntrack_tcp_timeout_established = 1200
    • $ sudo sysctl -p
  3. 使用 raw 表,不跟蹤連接
    • $ sudo iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT
    • $ sudo iptables -t raw -A PREROUTING -p tcp -m multiport --dport 80,81,82 -j NOTRACK
    • $ sudo iptables -t raw -A PREROUTING -p tcp -m multiport --sport 80,81,82 -j NOTRACK
  4. 註:上述解法建議挑 1、3。2 的解法治標不治本,量大一樣會有問題

相關網頁

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料