右鍵已鎖定
logo

解決 ip_conntrack: table full 的方法

這幾天我們的DNS server出現一整串下面這個訊息:

ip_conntrack: table full, dropping packet.

後來google才知道, Linux NAT 的 ip_conntrack 模組會記錄 tcp 通訊協定的 established connection 記錄, 而且預設 timeout 時間長達五天 (432000 秒), 因此只要 LAN 中有人使用 P2P 軟體 (如: eDonkey、BT…) 就容易發生這種問題.

首先確定你的linux有沒有載入模組

[root@rhel7 ~]# lsmod |grep ip_conn
ip_conntrack           53409  0 
nfnetlink              10713  1 ip_conntrack

如果沒有出現類似上面的訊息,就代表沒有載入,下面的設定檔會找不到,先把module載入

[root@rhel7 ~]# modprobe ip_conntrack

解決方法 (1): 加大 ip_conntrack_max 值

查出原本的 ip_conntrack_max 值:

[root@rhel7 ~]# cat /proc/sys/net/ipv4/ip_conntrack_max 

系統預設是記憶體(MB)x16
比如我電腦有1G記憶體,ip_conntrack_max 預設值就是 1024×16=16384
注意:每一個 ip_conntrack buffer 會佔用 292 Bytes
請不要隨便加到太大,會造成系統記憶體很快爆炸
以下數值只是範例,請依照自己的電腦狀況修改
將max加大到32768

[root@rhel7 ~]# echo "32768" > /proc/sys/net/ipv4/ip_conntrack_max 

這個效果是暫時的, 如果要每次開機都使用新的數值要編輯 sysctl.conf

[root@rhel7 ~]# vi /etc/sysctl.conf 

加入 net.ipv4.ip_conntrack_max = 32768
立刻載入設定檔

[root@rhel7 ~]# sysctl -p 

或是直接下這行指令

[root@rhel7 ~]# sysctl -w net.ipv4.ip_conntrack_max=32768 

解決方法 (2): 降低 ip_conntrack timeout 時間
此範例將原本432000秒縮成600秒,也就是一個小時就timeout

[root@rhel7 ~]# echo "600" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established 

或是永久加入系統設定檔

[root@rhel7 ~]# sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=600 

相關指令:

查出目前 ip_conntrack 記錄最多的前十名 IP

[root@rhel7 ~]#cat /proc/net/ip_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort | uniq -c | sort -nr | head -n 10
  15450 172.16.2.12
     45 255.255.255.255
     29 172.16.2.255
     10 208.76.45.53
      7 192.55.83.30
      6 192.12.94.30
      6 172.18.1.200
      5 65.55.37.62
      5 208.84.2.53
      5 192.42.93.30
660 次瀏覽