转载自:http://www.361way.com/%E5%86%8D%E7%9C%8Bnf_conntrack-table-full%E9%97%AE%E9%A2%98/2404.html

一年前,我写过一篇博文叫 ————  ip_conntrack: table full问题 ,当时是在squid应用主机上最先发现了该问题,也于当时,深刻了解到iptables的这个报错,会造成拒绝服务的问题。其后iptables重启 (重启会将该hash表存的值清空)、proc参数优化,临时解决了该问题 。并未进行细一步的研究 。随着centos 由5.X升级到6.X ,该模块的名字也由ip_conntrack变成了nf_conntrack 。两者的区别是,前者只支持ipv4,而后者增加了对ipv6的支持。

由于公司自身的推广到位,流量出现了倍增 。于是公司决定另选了两个机房,每个机房各放置一台主机做squid cache加速 。而运行过程中一直有一个小问题,就是偶尔会出现丢包的问题。当于以为是IDC的问题,一直让IDC去查原因,IDC那边并未查到原因 。这个问题就暂时搁置了。

同于又由于受近期金价暴跌的影响,网站流量由平时的80M/s 直接上升到250M/s ,这个ping丢包的问题变的尤为明显。而将加速应用指到数据机房的squid上时。同现出现了ping丢包的问题,这个不得不从自身找原因了。通过/var/log/message查看,发现老面孔 ———— ip_conntrack: table full 。看到该错误,首先关闭了iptables 。过了一两分钟后,神奇的丢包问题没了。汗 ……

至此开始真正开始关注此问题。总结了下网上对该问题的处理方式有三种。

方法一:修改参数法

这个方法我在一年前就已经用过。如下:

vim /etc/sysctl.conf#加大 ip_conntrack_max 值net.ipv4.ip_conntrack_max = 393216net.ipv4.netfilter.ip_conntrack_max = 393216#降低 ip_conntrack timeout时间net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120

增加完以上内容后,通过sysctl -p 使配置生效 。不过该方法有两个缺点:一是重启iptables后,ip_conntrack_max值又会变成65535默认值,需要重新sysctl -p ;另一个是该法治标不治本,在高并发时,很快又会悲剧重演。

方法二:使用RAW表,跳过记录法

首先先认识下什么是raw表?做什么用的?

iptables有5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING,4个表:filter,nat,mangle,raw 。

4个表的优先级由高到低的顺序为:raw-->mangle-->nat-->filter

举例来说:如果PRROUTING链上,即有mangle表,也有nat表,那么先由mangle处理,然后由nat表处理 。

RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了。
RAW表可以 style="color:#E53333;">应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度 。

具体操作方法如下:

1、修改/etc/sysconfig/iptables 文件中的-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED, UNTRACKED -j ACCEPT 行。增加红色字体中的部分,保存并restart iptables 。

2、运行下面的语句:

iptables -t raw -A PREROUTING -p tcp -m multiport --dports 80,3128 -j NOTRACK
iptables -t raw -A PREROUTING -p tcp -m multiport --sports 80,3128 -j NOTRACK
iptables -t raw -A OUTPUT -p tcp -m multiport --dports 80,3128 -j NOTRACK
iptables -t raw -A OUTPUT -p tcp -m multiport --sports 80,3128 -j NOTRACK

如果只是一个端口,改为下面的语句:

iptables -t raw -A PREROUTING -p tcp -m tcp --dport 80 -j NOTRACK
iptables -t raw -A OUTPUT -p tcp -m tcp --sport 80 -j NOTRACK
iptables -t raw -A PREROUTING -p tcp -m tcp --sport 80 -j NOTRACK
iptables -t raw -A OUTPUT -p tcp -m tcp --dport 80 -j NOTRACK

注:第1步很重要,如果第1处没改,执行后面的语句会造成相应的端口不能访问。我使用该方法时,就因为没有执行第一步的操作,造成web访问不能使用。

方法三:移除模块法

[root@localhost log]# /sbin/lsmod | egrep 'ip_tables|conntrack'nf_conntrack_ipv6       8748  2nf_defrag_ipv6         12182  1 nf_conntrack_ipv6
nf_conntrack           79453  2 nf_conntrack_ipv6,xt_state
ipv6                  322541  209 ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6

执行上面的语句,不难发现state模块和nf_conntrack之间是有依赖关系的。所以想要卸载nf_conntrack模块的话,必须也要把state模块移除,不然,其会自动启用nf_conntrack模块。

操作方法如下:

1、先将/etc/sysconfig/iptables 中包含state的语句移除,并restart iptables 。

2、执行语句

modprobe -r xt_NOTRACK nf_conntrack_netbios_ns nf_conntrack_ipv4 xt_state
modprobe -r nf_conntrack

执行完查看/proc/net/ 下面如果没用了 nf_conntrack ,就证明模块移除成功了。

总结:

以上三种方法种,如果像web这样的操作访问量并发不大的情况下,建议通过第一种方法实现。因为nf_conntrack模块的作用不仅仅只用于记录状态,iptables还可以通过对该模块的使有达到动态过滤的作用。如我在用ab动测试的一台服务器上进行并发模拟时,在/var/log/message里发现如下的日志:

Apr 22 15:21:46 localhost kernel: possible SYN flooding on port 80. Sending cookies.Apr 22 15:22:46 localhost kernel: possible SYN flooding on port 80. Sending cookies.

而此时iptables会智能的将发动SYN flood***的IP暂时拒绝掉:

[root@localhost ~]# ab -c 500 -n 5000 "http://192.168.10.177/"This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Copyright 2006 The Apache Software Foundation, http://www.apache.org/Benchmarking 192.168.10.177 (be patient)apr_socket_recv: Connection reset by peer (104)Total of 68 requests completed

如上所以,我用ab操作时,其就会收到apr_socket_recv 的错误提示 。我在网上查询到其具体实现的原理如下:

传统的防火墙只能进行静态过滤,而 iptables 除了这个基本的功能之外还可以进行动态过滤,即可以对连接状态进行跟踪,通常称为 conntrack 。 但这不意味着它只能对 TCP 这样的面向连接的协议有效,它还可以对 UDP, ICMP 这种无连接的协议进行跟踪,我们下面马上就会看到。

iptables 中的连接跟踪是通过 state 模块来实现的,是在PREROUTING 链中完成的,除了本地主机产生的数据包,它们是在 OUTPUT 链中完成。 它把“连接”划分为四种状态:NEW, ESTABLISHED, RELATED 和 INVALID。连接跟踪当前的所有连接状态可以通过 /proc/net/nf_conntrack 来查看(注意,在一些稍微旧的 Linux 系统上是 /proc/net/ip_conntrack)。

当 conntrack 第一次看到相关的数据包时,就会把状态标记为 NEW ,比如 TCP 协议中收到第一个 SYN 数据包。当连接的双方都有数据包收发并且还将继续匹配到这些数据包时,连接状态就会变为 ESTABLISHED 。而 RELATED 状态是指一个新的连接,但这个连接和某个已知的连接有关系,比如 FTP 协议中的数据传输连接。INVALID 状态是说数据包和已知的任何连接都不匹配。

当然,仅仅利用iptables conntrack自动实现syn flood 等DDOS***时很弱的。而现成的动态过滤和DDOS防护的方法是很多的。比如netstat脚本实现,iptalbes限制每秒进行连接数,nginx/apache的连接数限制模块及fail2ban日志分析法………… ,所以在具有以上防护的情况下,非常推荐将web 、squid/varnish等应用所在的服务器配置为RAW方式 。我在现网一台150M/S 的cache server上将80和3128两个端口全部NOTRACK之后,conntrack hash表由瞬满直线下降到只有几百条。

最后,最不推荐使用的第三种方法,因为第三种方法会将state模块也一块儿移除掉。

参考页面:

http://jaseywang.me/2012/08/16/%E8%A7%A3%E5%86%B3-nf_conntrack-table-full-dropping-packet-%E7%9A%84%E5%87%A0%E7%A7%8D%E6%80%9D%E8%B7%AF/

http://wiki.khnet.info/index.php/Conntrack_tuning

http://blog.zol.com.cn/2608/article_2607945.html

http://wangcong.org/articles/learning-iptables.cn.html

http://pc-freak.net/blog/resolving-nf_conntrack-table-full-dropping-packet-flood-message-in-dmesg-linux-kernel-log/

http://blog.csdn.net/dog250/article/details/7262619

转载于:https://blog.51cto.com/shanker/1742620

再看nf_conntrack: table full问题相关推荐

  1. linux 路由跟踪表满错误 nf_conntrack: table full, dropping packet 原理解决方法

    netfilter/conntrack 相关内核参数往往是用 Linux 服务器的互联网小公司业务量上去之后遇到的第 3 个"新手怪".(第 1 位:进程可用的 FD 不足,第 2 ...

  2. qtdesigner怎么实现菜单栏跳转_3种公众号菜单栏设置类型,手把手教你做,不会的话那就再看一遍...

    常见的菜单栏设置怎么去设置呢?在我们的公众号左侧的菜单栏中,你可以找到我们的自定义菜单,这个功能,点击进去之后,你就可以看到菜单的内容,它可以有三种类型可选:一种叫发送消息,一种叫跳转网页,一种叫跳转 ...

  3. 长得类似铁甲小宝的机器人_铁甲小宝:小时候只顾看机器人忽略重点,长大后再看:是我太天真...

    铁甲小宝:小时候只顾看机器人忽略重点,长大后再看:是我太天真 铁甲小宝相亲大家都是看过的,作为早期的三大人特摄之一,铁甲小宝针对的完全就是儿童,小时候我们也是很喜欢这部作品,只是现在在荧幕上已经很难看 ...

  4. OpenCV学习笔记(四十一)——再看基础数据结构core OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年 OpenCV学习笔记(四十三)——存取像素值操作汇总co

    OpenCV学习笔记(四十一)--再看基础数据结构core 记得我在OpenCV学习笔记(四)--新版本的数据结构core里面讲过新版本的数据结构了,可是我再看这部分的时候,我发现我当时实在是看得太马 ...

  5. android 智能指针的学习先看邓凡平的书扫盲 再看前面两片博客提升

    android 智能指针的学习先看邓凡平的书扫盲 再看前面两片博客提升 转载于:https://www.cnblogs.com/jeanschen/p/3507512.html

  6. 再看数据库——(2)视图

    概念 *是从用户使用数据库的观点来说的. *从一个或多个表(视图)中导出来的 *一个虚表,或者说查询表 为什么要用视图呢? 一是简单,看到的就是需要的.视图不仅可以简化用户对数据的理解,也可以简化他们 ...

  7. 以前看书时记得一些笔记(二),很早了,现在再看都有些看不懂了

    MFC学习: 1.CObject类为MFC总类,该类下面有一个重要的类CCmdTarget.而CCmdTarget类下面又有四个重要的继承类,分别为:CWinThread.CDocument.CDoc ...

  8. 再看结构体对齐与小端联合问题

    再看结构体对齐与小端联合问题 @(组成原理) 先再次回看一道题目的分析. (2012.15)某计算机存储器按字节编址,采用小端方式存放数据.假定编译器规定int型和short型长度分别为32位和16位 ...

  9. 【发布】哔哩哔哩bilibili替换旧版播放(稍后再看)

    今天上B站发现强制界面新版了,连旧版切换按钮也隐藏了,目前还能通过[稍后再看]来切换旧版,随便写了个脚本,油猴新建脚本,添加以下 Greasy Fork地址: https://greasyfork.o ...

最新文章

  1. AC自动机 + 概率dp + 高斯消元 --- HDU 5955 or 2016年沈阳icpc H [AC自动机 + 概率dp + 高斯消元]详解
  2. 如何在Hadoop上运行TensorFlow【部署】
  3. 蓝牙协议分析_BLE地址类型
  4. OSChina 周一乱弹 —— 深入浅出讲技术
  5. openmp使用经验
  6. es6 之 generator(-)
  7. 搜狐校园“情感分析×推荐排序“算法大赛 AutoX方案 转载poteman
  8. tx2使用远程开机后分辨率不正确
  9. 企业微信api接口,企业微信开发sdk
  10. 视频教程-金蝶K3 WISE 视频教程-ERP
  11. python哪里下载-python从哪下载
  12. 电脑故障维修判断指导大全(联想内部文件)[网络转载]
  13. Java笔记 - 黑马程序员_04(枚举,异常,Collection,List,Set)
  14. 浅谈python深拷贝和浅拷贝
  15. java中jmod是什么,modulo - j中mod的语法是什么
  16. 2022京东618活动有哪些玩法?京东618优惠福利有哪些?
  17. 推荐5款经过时间验证的神级软件
  18. 使用Unity Tilemap来制作2D类地图
  19. 简单理解ASCLL码
  20. 智能楼宇计算机网络,[计算机应用] 智能楼宇D的计算机网络研究和设计

热门文章

  1. Dan Gillmor总结微软付费平息纠纷历史
  2. 百度地图 点聚合_强强联合聚能网约车场景 首汽约车为百度地图“站台”
  3. 怎么获取请求头中的origin信息_委托单位代办汇算清缴时无法获取到我的专项附加扣除信息怎么办?...
  4. Linux的命令行界面简介
  5. H5-Dooring可视化搭建平台的新技能
  6. 函数调用过程详解:函数栈帧的创建与销毁
  7. python log文件_Python logging基本使用
  8. 打印机在计算机里被删掉,不小心把设置里打印机删掉了怎么办
  9. 差分阻抗为多少_谈谈差分信号
  10. H - Cow Contest POJ - 3660(Floyd 传递闭包)