kernel: ip_conntrack: table full, dropping packet.

今日服務器流量監控發現2臺下載服務器流量愈來愈低,到最後居然直接連不上了。html

通知機房排除機房緣由以後,連上系統查看日誌,發現message裏面不少kernel: ip_conntrack: table full, dropping packet.報錯。sql

google了一下,發現也有其餘人遇到相似問題,原來是ip_conntrack(鏈接跟蹤表)中的數量過過多致使的,默認是65528。bash

wc -l /proc/net/ip_conntrack能夠統計當前有多少個,超過65528就會kernel報錯,cat /proc/sys/net/ipv4/ip_conntrack_max查看當前設置。服務器

解決辦法:
增長ip_conntrack_max設置,能夠在/etc/sysctl.conf文件中增長:
net.ipv4.ip_conntrack_max = 655280而後鍵入命令sysctl -p生效tcp

net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=86400     設置鏈接跟蹤表中失效時間爲1天,若是以爲一天仍是長的話能夠改成3600(一小時)或者600(10分鐘)ide

若是想當即降下來跟蹤表中的鏈接能夠嘗試使用如下辦法:
下載hping:
http://www.hping.org/download.html

./configure
make
make install

安裝後寫一個script.this

  
  
  
  
  1. #!/bin/bash  
  2. echo  
  3. echo "############################" 
  4. echo "# Edit by Youngh 2003.06.24 v1.1 " 
  5. echo "# Usage : clr_conns IpAddress" 
  6. echo "# This will clear all connections from this IP_Address" 
  7. echo "# Example:/root/clr_conns 10.0.3.3 " 
  8. echo "############################" 
  9. echo  
  10. if [ -z $1 ] ; then 
  11. exit  
  12. fi  
  13. grep -E "^tcp .{10,25}ESTABLISHED src=$1 " /proc/net/ip_conntrack | while read line ; do  
  14. S_IP=`echo $line | awk '{print substr($5,5)}'`  
  15. S_SOCK=`echo $line | awk '{print substr($7,7)}'`  
  16. D_IP=`echo $line | awk '{print substr($6,5)}'`  
  17. D_SOCK=`echo $line | awk '{print substr($8,7)}'`  
  18. echo "$S_IP:$S_SOCK $D_IP:$D_SOCK" 
  19. hping2 $D_IP -R -s $S_SOCK -p $D_SOCK -a $S_IP -k -c 1 >/dev/null 2>/dev/null &  
  20. done 
保存爲clr_conns.sh
用:sh clr_conns.sh IP
就能夠清除鏈接.
查看ip_conntrack前10位IP cat /proc/net/ip_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort | uniq -c | sort -nr | head -n 10  
相關文章
相關標籤/搜索