服务器维护,服务器代维,安全设置,漏洞扫描,入侵检测服务

dirtysea 发表于 2012-8-17 18:36:18

解決Linux NAT ip_conntrack: table full的方法

<DIV>
<P>原本 Linux NAT 用得好好的, 沒想到幾天前卻出現了無法上網的情況, 而系統記錄也出現了這樣的訊息:</P>
<P>ip_conntrack: table full, dropping packet.</P>
<P>後來才知道, Linux NAT 的 ip_conntrack 模組會記錄 tcp 通訊協定的 established connection 記錄, 而且預設 timeout 時間長達五天 (432,000 秒), 因此只要 LAN 中有人使用 P2P 軟體 (如: eDonkey、BT...) 就容易發生這種問題.</P><BR>
<P><FONT color=#ffff00>解決方法 (1): 加大 ip_conntrack_max 值</FONT></P>
<BLOCKQUOTE>
<P>查出原本的 ip_conntrack_max 值:<BR>指令: <FONT color=#00ffff>cat /proc/sys/net/ipv4/ip_conntrack_max</FONT></P>
<P>寫入理想的數值 (每一個 ip_conntrack buffer 會佔用 292 Bytes)<BR>指令: <FONT color=#00ffff>echo "數值" &gt; /proc/sys/net/ipv4/ip_conntrack_max</FONT><BR>例如: <FONT color=#00ff00>echo "81920" &gt; /proc/sys/net/ipv4/ip_conntrack_max</FONT><BR>這個效果是暫時的, 如果要每次開機都使用新的數值, 需將上述指令寫入 /etc/rc.d/rc.local<BR>或是在 /etc/sysctl.conf 加入: <FONT color=#ff00ff>net.ipv4.ip_conntrack_max = 數值</FONT><BR>或使用指令: <FONT color=#00ffff>sysctl -w net.ipv4.ip_conntrack_max=數值</FONT></P></BLOCKQUOTE>
<P><FONT color=#ffff00>解決方法 (2): 降低 ip_conntrack timeout 時間</FONT></P>
<BLOCKQUOTE>
<P>重設 ip_conntrack_tcp_timeout_established (原值: 432000, 單位: 秒)<BR>指令: <FONT color=#00ffff>echo "數值" &gt; /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established</FONT><BR>例如: <FONT color=#00ff00>echo "600" &gt; /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established</FONT></P>
<P>開機自動設置的作法同方法(1).</P></BLOCKQUOTE>
<P><FONT color=#ffff00>其他相關指令:</FONT></P>
<BLOCKQUOTE>
<P>查看目前 ip_conntrack buffer 使用狀況<BR>指令: <FONT color=#00ffff>grep conn /proc/slabinfo</FONT></P>
<BLOCKQUOTE>
<P>結果實例: ip_conntrack 3024 4090 384 409 409 1 (各值說明如下)</P>
<TABLE id=table1 style="BORDER-COLLAPSE: collapse" cellPadding=3 border=0>
<TBODY>
<TR>
<TD align=right>ip_conntrack</TD>
<TD>the cache name</TD></TR>
<TR>
<TD align=right>3024</TD>
<TD>the number of currently active objects</TD></TR>
<TR>
<TD align=right>4090</TD>
<TD>the total number of available objects</TD></TR>
<TR>
<TD align=right>384</TD>
<TD>the size of each object in bytes</TD></TR>
<TR>
<TD align=right>409</TD>
<TD>the number of pages with at least one active object</TD></TR>
<TR>
<TD align=right>409</TD>
<TD>the total number of allocated pages</TD></TR>
<TR>
<TD align=right>1</TD>
<TD>the number of pages per slab are given</TD></TR></TBODY></TABLE>
<P>man slabinfo 可查詢詳細說明.</P></BLOCKQUOTE>
<P>查出目前 ip_conntrack 記錄最多的前五名 IP<BR>指令: <FONT color=#00ffff>cat /proc/net/ip_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort | uniq -c | sort -nr | head -n 5</FONT></P>
<BLOCKQUOTE>
<P>結果實例:</P>
<TABLE id=table2 style="BORDER-COLLAPSE: collapse" cellPadding=3 border=0>
<TBODY>
<TR>
<TD align=right>2816</TD>
<TD>192.168.1.100</TD></TR>
<TR>
<TD align=right>14</TD>
<TD>163.30.85.129</TD></TR>
<TR>
<TD align=right>6</TD>
<TD>220.132.142.175</TD></TR>
<TR>
<TD align=right>6</TD>
<TD>127.0.0.1</TD></TR>
<TR>
<TD align=right>4</TD>
<TD>218.187.5.223</TD></TR></TBODY></TABLE>
<P>由此可知, 192.168.1.100 佔用了絕大多數的 buffer, 推斷這個 IP 的 User 可能使用了 P2P 軟體.</P></BLOCKQUOTE></BLOCKQUOTE></DIV>
页: [1]
查看完整版本: 解決Linux NAT ip_conntrack: table full的方法