原本 Linux NAT 用得好好的, 沒想到幾天前卻出現了無法上網的情況, 而系統記錄也出現了這樣的訊息:
ip_conntrack: table full, dropping packet.
後來才知道, Linux NAT 的 ip_conntrack 模組會記錄 tcp 通訊協定的 established connection 記錄, 而且預設 timeout 時間長達五天 (432,000 秒), 因此只要 LAN 中有人使用 P2P 軟體 (如: eDonkey、BT...) 就容易發生這種問題.
解決方法 (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/rc.d/rc.local 或是在 /etc/sysctl.conf 加入: net.ipv4.ip_conntrack_max = 數值 或使用指令: sysctl -w net.ipv4.ip_conntrack_max=數值
解決方法 (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
開機自動設置的作法同方法(1).
其他相關指令:
查看目前 ip_conntrack buffer 使用狀況 指令: grep conn /proc/slabinfo
結果實例: ip_conntrack 3024 4090 384 409 409 1 (各值說明如下)
ip_conntrack |
the cache name |
3024 |
the number of currently active objects |
4090 |
the total number of available objects |
384 |
the size of each object in bytes |
409 |
the number of pages with at least one active object |
409 |
the total number of allocated pages |
1 |
the number of pages per slab are given |
man slabinfo 可查詢詳細說明.
查出目前 ip_conntrack 記錄最多的前五名 IP 指令: cat /proc/net/ip_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort | uniq -c | sort -nr | head -n 5
結果實例:
2816 |
192.168.1.100 |
14 |
163.30.85.129 |
6 |
220.132.142.175 |
6 |
127.0.0.1 |
4 |
218.187.5.223 |
由此可知, 192.168.1.100 佔用了絕大多數的 buffer, 推斷這個 IP 的 User 可能使用了 P2P 軟體. |