1. 程式人生 > >解決 Linux NAT ip conntrack table full 的方法

解決 Linux NAT ip conntrack table full 的方法

2005年06月16日

解決 Linux NAT ip_conntrack: table full 的方法

原本 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_conntrackthe cache name
3024the number of currently active objects
4090the total number of available objects
384the size of each object in bytes
409the number of pages with at least one active object
409the total number of allocated pages
1the 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

結果例項:

2816192.168.1.100
14163.30.85.129
6220.132.142.175
6127.0.0.1
4218.187.5.223

由此可知, 192.168.1.100 佔用了絕大多數的 buffer, 推斷這個 IP 的 User 可能使用了 P2P 軟體.

 

參考資料:

相關網頁:

Posted by Jamyy at 2005年06月16日 12:53

Trackback Pings

TrackBack URL for this entry:http://cha.homeip.net/cgi-bin/mt/mt-tb.cgi/93

» ip_conntrack buffer overflow from 我的生活 我的懶洋洋剛剛家裡網路掛點,本來想直接把NAT reset了事,手癢接上kvm看了一下,出現 ip_conntrack table full的錯誤,沒看過這是什麼東西的我,很直覺的進 /proc/sys/net找,果然有個ip_conntrack_max的屬性。原始大 [Read More]

Tracked on 2006年03月25日 21:36

Comments

ip_conntrack_tcp_timeout_established 高版本核心才有,好像是 2.4.27 以上RH7.3 的核心是 2.4.18AS3 的核心是 2.4.21我用的核心是 2.4.31

我的是RH9.0和As3.0 的也米有那個檔案,不過借問下,用語句sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=600 &> /dev/null可以實現不??

Posted by: 天涯小築 at 2006年11月10日 17:27

另查了幾個引數給參考:1.儘量用/dev/shm來放資料;2.開啟了arp代理 (這個我是從某個國外站看的,說的是看了後效率更好!??)3.#可以改變滑動視窗的大小echo "1" > /proc/sys/net/ipv4/tcp_window_scaling

4.修改核心共享記憶體限制為256M,預設是32Mecho 268435456 >/proc/sys/kernel/shmallecho 268435456 >/proc/sys/kernel/shmmax

5。#可使用的代理埠echo "1024 65000" > /proc/sys/net/ipv4/ip_local_port_range

6。#重新整理flush引數echo "100 1200 128 512 15 5000 500 1884 2">/proc/sys/vm/bdflush

7.#禁止廣播和ping入echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcastsecho "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

8。/proc/sys/net/ipv4/netfilter/ip_conntrack_max 改大

Posted by: 天涯小築 at 2006年11月10日 17:30

謝謝您提供這些寶貴的資訊~

關於 ip_conntrack_tcp_timeout_established 的問題這個專案是 kernel 2.4.23 以後才有的執行 modprobe ip_nat_ftp 之後就能在 /proc/sys/net/ipv4/netfilter 裡面找到這個檔案

kernel.org 的 http://www.kernel.org/pub/linux/kernel/v2.4/ChangeLog-2.4.23 有提到:Jozsef Kadlecsik:o [NETFILTER]: Make conntrack timeouts become sysctls

4.2.23 以前的 sysctl 無法使用這個鍵值 (會出現 unknown key 的錯誤)