注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

itoedr的it学苑

记录从IT文盲学到专家的历程

 
 
 

日志

 
 

iptables nf_conntrack表溢出问题的优化  

2013-11-06 15:02:55|  分类: xtables应用 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
现     象:ip_conntrack: table full, dropping packet.

 解决方法:IP_conntrack 表示连接跟踪数据库(conntrack database),代表NAT机器跟踪连接的数目,连接跟踪表能容纳多少记录是被一个变量控制的,他可由内核中的ip- sysctl函数配置。每一个跟踪连接表会占用350字节的内核存储空间,时间一长就会把默认的空间填满,那么默认空间时多少?

我以centos为例在内 存为64MB的机器上时4096,内存为128MB是 8192,内存为256MB是16376,

那末就能在/proc/sys/net/ipv4/ip_conntrack_max里查看、配置。
        例如:增加到81920,能够用以下命令: 


         echo "81920" > /proc/sys/net/ipv4/ip_conntrack_max
         那样配置是不会保存的,要重启后保存能够在/etc/sysctl.conf中加:
         net.ipv4.ip_conntrack_max = 655350
          net.ipv4.ip_conntrack_tcp_timeout_established = 1200
         按照此方法改变后一切正常,要是在满了能够加大其值.

修改/proc/sys/net/ipv4/下的一些参数...不让连接存活的时间过长,因为很多都只是http,短连接接到响应就关闭连接了,但是ip_conntrack仍然需要保存。

sysctl  -p即可。


另:对于 CONNTRACK_MAX,其计算公式:CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (ARCH / 32)

比如一个 64 位 48G 的机器可以同时处理 48*1024^3/16384/2 = 1572864 条 netfilter 连接。

对于大于 1G 内存的系统,默认的 CONNTRACK_MAX 是 65535。

对于 HASHSIZE,默认的有这样的转换关系:
        CONNTRACK_MAX = HASHSIZE * 8
         这表示每个链接列表里面平均有 8 个 conntrack 条目。其真正的计算公式如下:
          HASHSIZE = CONNTRACK_MAX / 8 = RAMSIZE (in bytes) / 131072 / (ARCH / 32)
        比如一个 64 位 48G 的机器可以存储 48*1024^3/131072/2 = 196608 的buckets(连接列表)。

对于大于 1G 内存的系统,默认的 HASHSIZE 是 8192。


注:不过最好使用以下方式改写如下:sysctl -w net.nf_conntrack_max=100000

其它:关于nf_conntrack_max的参数调优。

       1)可以通过 echo 直接修改目前系统 CONNTRACK_MAX 以及 HASHSIZE 的值:


         $ sudo su -c "echo 100000 > /proc/sys/net/netfilter/nf_conntrack_max"
        $ sudo su -c "echo 50000 > /proc/sys/net/netfilter/nf_conntrack_buckets"

        2) 还可以缩短 timeout 的值:

        $ sudo su -c "echo 600 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established"

       3)使用 raw 表,不跟踪连接
       iptables 中的 raw 表跟包的跟踪有关,基本就是用来干一件事,通过 NOTRACK 给不需要被连接跟踪的包打标记,也就是说,如果一个连接遇到了 -j NOTRACK,conntrack 就不会跟踪该连接,raw 的优先级大于 mangle, nat, filter,包含  PREROUTING 和 OUTPUT 链。
       当执行 -t raw 时,系统会自动加载 iptable_raw 模块(需要该模块存在)。raw 在 2.4 以及 2.6 早期的内核中不存在,除非打了 patch,目前的系统应该都有支持:
$ sudo iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT
$ sudo iptables -t raw -A PREROUTING -p tcp -m multiport --dport 80,81,82 -j NOTRACK
$ sudo iptables -t raw -A OUTPUT -p tcp -m multiport --sport 80,81,82 -j NOTRACK

  评论这张
 
阅读(208)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017