2007/08/26

解決ip_conntrack: table full 的方法

昨天在做實驗的時候發現一個問題
dmesg一直出現下面這個訊息:

ip_conntrack: table full, dropping packet.


原來在linux核心2.6.18的netfileter會記錄tcp 通訊協定的 established connection 記錄,
而且預設 timeout 時間長達五天 (432,000 秒)

在網路上有人提供這個方法:

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

查出原本的 ip_conntrack_max 值:
指令: cat /proc/sys/net/ipv4/ip_conntrack_max

寫入理想的數值 (每一個 ip_conntrack buffer 會佔用 292 Bytes)
指令: echo "數值" > /proc/sys/net/ipv4/ip_conntrack_max
例如: echo "81920" > /proc/sys/net/ipv4/ip_conntrack_max
這個效果是暫時的, 如果要每次開機都使用新的數值, 需將上述指令寫入/etc/sysctl.conf 加入: net.ipv4.netfilter.ip_conntrack_max = 數值

另外在
http://support.imagestream.com/Resolving_ip_conntrack_table_full_Errors.html
建議設定為262144, 如果設定數值太大會浪費記憶體空間.

另外還有一個解決方法:

解決方法 (2): 降低 ip_conntrack timeout 時間

重設 ip_conntrack_tcp_timeout_established (原值: 432000, 單位: 秒)
指令: echo "數值" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
例如: echo "600" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established