這幾天我們的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