一、ip_conntrack模块介绍:

ip_conntrack 是Linux NAT一个跟踪连接条目的模块记录着允许的跟踪连接条目ip_conntrack 模块会记录 tcp 通讯协议的 established connection 记录, 而且预设 timeout 时间长达五天 (432,000 秒).所以局域网中当有人使用p2p类的软件就很容易使ip_conntrack达到最大值…也由此造成:

ip_conntrack: table full, dropping packet.  的错误提示..网关丢弃数据包..网络中断..

具体解决办法如下几种:

1.加大ip_conntrack_max设定值
#modprobe ip_conntrack 需提前加载ip_conntrack模块
#echo “986400″ > /proc/sys/net/ipv4/ip_conntrack_max 数值具体多大应计算得出
开机使用新数值..有三种办法:
除vi /etc/rc.local外亦有:
#vi /etc/sysctl.conf 加入: net.ipv4.ip_conntrack_max = 986400
#sysctl -w net.ipv4.ip_conntrack_max=986400

2.减小ip_conntrack timeout 的时限 默认5天即432000s

ip_conntrack_tcp_timeout_established 值默认432000s 即5天
#echo “3600″ > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
开机使用同于上例
#vi /etc/sysctl.conf 加入: net.ipv4.ip_tcp_timeout_established = 3600
#sysctl -w net.ipv4.ip_tcp_timeout_established=3600

3、为防止重启Iptables后变为默认,还需修改模块参数:

vim/etc/modprobe.conf #添加以下内容

options ip_conntrack hashsize=12800        #值为102400/8


-允许的最大跟踪连接条目,在这篇文档中我们叫作CONNTRACK_MAX
-存储跟踪连接条目列表的哈西表的大小,在这篇文档中我们叫做HASHSIZE(下面是这个结构的描述)

CONNTRACK_MAX是在内核内存中netfilter可以同时处理的“任务”(连接跟踪条目)。

一个跟踪连接的条目是存储在一个链接起来的列表的一个节点上,每个列表都是一个哈西表的元素。因此每个哈西表的条目(也叫一个桶-bucket)包含了一个链接起来的跟踪连接条目。
要访问一个特定包的跟踪连接条目,内核必须:
-针对一个包中的已经定义的一些字符计算哈西值。这是一个不间断的计算。
  这个哈西值就会被当作哈西表的索引来使用,而跟踪连接条目的列表就存储在这里。
-反复的查看链接列表中的跟踪连接条目以找到匹配的那一个。
  这是一个耗资源的操作,依赖于列表的大小(也依赖于列表中被操作的跟踪连接条目的位置)。

哈西表包含了HASHSIZE大小的链接条目。当条目满的时候(总的跟踪连接条目数达到了CONNTRACK_MAX),理想状态下,每个列表(在最优化的条件下)将包含大约CONNTRACK_MAX/HASHSIZE的条目数。

不管你是否有连接,哈西表都将占用一个固定大小的非交换内核内存。但是最大连接跟踪条目会检测最多可以存储多少条目(globally into the linked lists),也就是说他们最多可以占用多少的内核内存。


在i386架构上,HASHSIZE = CONNTRACK_MAX / 8

4、iptables raw表解决ip_conntrack: table full, dropping

RAW 表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链 上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.

RAW表可以应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度。

iptables -A INPUT -m state --state UNTRACKED,ESTABLISHED,RELATED -j ACCEPT

iptables -t raw -A PREROUTING -p tcp --dport80 -j NOTRACK

iptables -t raw -A OUTPUT -p tcp --sport80 -j NOTRACK

5、举例说明:

通过ip_conntrack buffer 使用状况查出局域网中进行p2p下载的主机

查看目前 ip_conntrack buffer 使用状况
  #grep conn /proc/slabinfo

结果实例: ip_conntrack 5918 8140 384 10 1:tunables 54 27 0:slabdata 814 814 0 (各值说明如下)

ip_conntrack the cache name
  5918 the number of currently active objects
  8140 the total number of available objects
  384 the size of each object in bytes
  814 the number of pages with at least one active object
  814 the total number of allocated pages
  1 the 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 -5

结果实例:

2987 192.168.1.30
  334 192.168.1.52
  166 192.168.1.56
   99 192.168.1.43
   84 192.168.1.46

由此可知, 192.168.1.30占用了绝大多数的ip_connect buffer,推断这个IP的User可能使用了P2P软件

推荐一个清除某IP链接的方法:通过过滤ip_conntrack表得到ESTABLISHED状态过多的ip,用hping工具将这些ip从表中清理掉…

下载: http://www.hping.org/download.html
安装: ./configure;make;make install

hping清理IP链接脚本:(此脚本修改链接状态为closed)

#!/bin/sh

if [ -z $1 ] ; then
            echo “NO INPUT IP”
            exit
    fi
    grep -E “^tcp .{10,25}ESTABLISHED src=$1 ” /proc/net/ip_conntrack | while read line; do

S_IP=`echo $line | awk ‘{print substr($5,5)}’`
    S_SOCK=`echo $line | awk ‘{print substr($7,7)}’`
    D_IP=`echo $line | awk ‘{print substr($6,5)}’`
    D_SOCK=`echo $line | awk ‘{print substr($8,7)}’`
    echo “$S_IP:$S_SOCK $D_IP:$D_SOCK”
    hping2 $D_IP -R -s $S_SOCK -p $D_SOCK -a $S_IP -k -c 1 > /home/huaying/1.log 2>&1 &
    done

附:linux NAT 性能优化常用设置…

#echo “1024 65000″ > /proc/sys/net/ipv4/ip_local_port_range

#echo “100 1200 128 512 15 5000 500 1884 2″>/proc/sys/vm/bdflush

#echo “1″ > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
#echo “1″ > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

#echo “1048576″ > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
#echo “1″ > /proc/sys/net/ipv4/ip_forward

#echo “268435456″ >/proc/sys/kernel/shmall
#echo “536870912″ >/proc/sys/kernel/shmmax
#echo “600″ > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
#echo “1024″ > /proc/sys/net/ipv4/neigh/default/gc_thresh1
#echo “2048″ > /proc/sys/net/ipv4/neigh/default/gc_thresh2
#echo “4096″ > /proc/sys/net/ipv4/neigh/default/gc_thresh3
#echo “52428800″ > /proc/sys/net/ipv4/route/max_size

#echo “1″ > /proc/sys/net/ipv4/conf/all/proxy_arp
#echo “1″ > /proc/sys/net/ipv4/tcp_window_scaling

二、iptables连接跟踪(Connection tracking)

每个网络连接包括以下信息:源地址、目的地址、源端口和目的端口,叫作套接字对(socket pairs);协议类型、连接状态(TCP协议)和超时时间等。防火墙把这些信息叫作状态(stateful),能够检测每个连接状态的防火墙叫作状态包 过滤防火墙。它除了能够完成简单包过滤防火墙的包过滤工作外,还在自己的内存中维护一个跟踪连接状态的表,比简单包过滤防火墙具有更大的安全性。
      iptables中的状态检测功能是由state选项来实现的。对这个选项,在iptables的手册页中有以下描述:
      state          这个模块能够跟踪分组的连接状态    --state state
      这里,state是一个用逗号分割的列表,表示要匹配的连接状态。有效的状态选项包括:

INVAILD,表示分组对应的连接是未知 的;

ESTABLISHED,表示分组对应的连接已经进行了双向的分组传输,也就是说连接已经建立;

NEW,表示这个分组需要发起一个连接,或者说,分组对应的连接在两个方向上都没有进行过分组传输;

RELATED,表示分组要发起一个新的连接,但是这个连接和一个现有的连接有关,例如:FTP的数据传输 连接和控制连接之间就是RELATED关系。
       对于本地产生分组,在PREROUTING或者OUTPUT链中都可以对连接的状态进行跟踪。在进行状态检测之前,需要重组分组的分片。这就是为什么在iptables中不再使用ipchains的ip_always_defrag开关。

1、  UDP和TCP连接的状态表由/proc/net/ip_conntrack进行维护。稍后我们再介绍它的内容。状态表能够保存的最大连接数保存在/proc/sys/net/ipv4/ip_conntrack_max中。它取决于硬件的物理内存。
       iptables的连接跟踪(Connection tracking),是如何工作的?
      首先了解一下netfilter框架。如果要在两个网络接口之间转发一个分组,这个分组将以以下的顺序接收规则链的检查:
      1) PREROUTING链
       如果必要对这个分组进行目的网络地址转换(DNAT)和mangle处理。同时,iptables的状态检测机制将重组分组,并且以以下某种方式跟踪其状态:
      分组是否匹配状态表中的一个已经实现(ESTABLISHED)的连接。它是否是和状态表中某个UDP/TCP连接相关(RELATED)的一个ICMP分组。这个分组是否要发起一个新(NEW)的连接。如果分组和任何连接无关,就被认为是无效(INVALID)的。
      2) FORWARD链
       把分组的状态和过滤表中的规则进行匹配,如果分组与所有的规则都无法匹配,就使用默认的策略进行处理。
      3) POSTROUTING链
       如果有必要,就对分组进行源网络地址转换(SNAT),
注意:所有的分组都必须和过滤表的规则进行比较。如果你修改了规则,要拒绝所有的网络流量,那么即使分组的状态匹配状态表中的一个ESTABLISHED条目,也将被拒绝。

下面,我们对UDP、TCP和ICMP三个协议分别进行分析。
   2、UDP连接
       UDP(用户数据包协议)是一种无状态协议,以为这个协议没有序列号。不过,这并不意味着我们不能跟踪UDP连接。虽然没有序列号,但是我们还可以使用其它的一些信息跟踪UDP连接的状态。下面是状态表中关于UDP连接的条目:
               udp 17 19 src=192.168.1.2 dst=192.168.1.50 sport=1032 dport=53 [UNREPLIED] src=192.168.1.50             dst=192.168.1.2 sport=53 dport=1032 use=1
        这个状态表项只有在iptables过滤规则允许建立新的连接时,才能建立。以下的规则可以产生这类状态表项,这两条规则只允许向外的UDP连接:

iptables -A INPUT -p udp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -P udp -m state --state NEW,ESTABLISHED -j ACCEPT

上面的状态表项包含如下信息:连接的协议是UDP(IP协议号17)。这个状态表项还有19秒中就超时。发起连接方向上的源、目的地址和源、目的端口。应答方向上的源、目的地址和源、目的端口。这个连接使用UNREPLIED标记,表示还没有收到应答。

UDP连接的超时时间在/usr/src/linux /net/ipv4/netfilter/ip_conntrack_proto_udp.c文件中设置,如果改变了这个值,需要重新编译Linux内核源代码才能生效。下面是UDP连接超时时间的相关的源代码:
#define UDP_TIMEOUT (30*HZ)
#define UDP_STREAM_TIMEOUT (180*HZ)

一个UDP请求等待应答的时间是30*HZ(这个值一般是30秒)。在上面的例子中,等待的时间已经消耗了11秒,还剩余19秒,如果在这段时间之内没有 收到应答分组,这个表项就会被删除。一旦收到了应答,这个值就被重置为30,UNREPLIED标志也被删除。这个表项编程如下形式:
    udp 17 28 src=192.168.1.2 dst=192.168.1.50 sport=1032 dport=53 src=192.168.1.50 dst=192.168.1.2 sport=53 dport=1032 use=1

如果在这一对源、目的地址和源、目的端口上,发生了多个请求和应答,这个表项就作为一个数据流表项,它的超时时间是180秒。这种情况下,这个表项就变成如下形式:
      udp 17 177 src=192.168.1.2 dst=192.168.1.50 sport=1032 dport=53 src=192.168.1.50 dst=192.168.1.2 sport=53 dport=1032 [ASSURED] use=1
      这时我们看到这个表项使用ASSURED标志。一旦连接表项使用ASSURED标志,那么即使在网络负沉重的情况下,也不会被丢弃。如果状态表已经饱和,当新的连接到达时,使用UNREPLIED标志的表项会受被丢弃。

3、TCP连接(被*** 的大户人家)
        一个TCP连接是通过三次握手的方式完成的。首先,客户程序发出一个同步请求(发出一个SYN分组);接着,服务器端回应一个SYN|ACK分组;最后返回一个ACK分组,连接完成。整个过程如下所示:
Client     |     Server
SYN --->;
        <--- SYN+ACK
ACK --->;
        <--- ACK
ACK --->;
      .........
      .........

SYN和ACK是由TCP分组头的标志决定的。在每个TCP分组头还有32位的序列号和应答号用于跟踪会话。

为了跟踪一个TCP连接的状态,你需要使用下面这样的规则 :
iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT

一旦一个初始SYN分组进入OUTPUT链,并且输出规则允许这个分组建立一个新的连接,是通过linux Client端进行连接,状态表的相关表项将如下所示:
        tcp 6 119 SYN_SENT src=140.208.5.62 dst=207.46.230.218 sport=1311 dport=80 [UNREPLIED] src=207.46.230.218 dst=140.208.5.62 sport=80 dport=1311 use=1

其中,TCP连接状态是SYN_SENT,连接被标记为UNREPLIED。
        Server端收到后返回SYN+ACK
        现在,Clinet端等待SYN+ACK分组的响应。一旦得到响应,这个TCP连接表项就变为:
       tcp 6 57 SYN_RECV src=140.208.5.62 dst=207.46.230.218 sport=1311 dport=80 src=207.46.230.218 dst=140.208.5.62 sport=80 dport=1311 use=1

连接的状态变为SYN_RECV,UNREPLIED标志被清除。

现在等待完成握手的ACK分组。ACK分组到达后,首先对其序列号进行一些检查,如果正确,就把这个连接的状态变为ESTABLISHED,并且使用ASSURED标记这个连接。这时,这个连接的状态如下所示:
          tcp 6 431995 ESTABLISHED src=140.208.5.62 dst=207.46.230.218 sport=1311 dport=80 src=207.46.230.218 dst=140.208.5.62 sport=80 dport=1311 [ASSURED] use=1

了解了TCP连接的状态。现在,分析一下TCP连接的链路跟踪检测。实际上,状态表只知道NEW、ESTABLISHED、RELATED和INVALID

要注意:链路跟踪检测的状态不等于TCP状态。当一个SYN分组的响应SYN+ACK分组到达,Netfilter的状态检测模块就会认为连接已经建立。但是,这时还没有完成三次握手,因此TCP连接还没有建立。
       另外,包过滤规则不能删除状态表中的表项,只有连接超时,对应的状态表项才会被删除。ACK分组能够建立一个NEW状态表项 。向防火墙之后一台并不存在主机发送ACK分组,并不会返回RST分组,可以证明这个结论。因此,你需要使用以下的规则明确新的TCP连接应该是SYN分组建立的:
                iptables -A INPUT -p tcp !--syn -m state --state NEW -j DROP
这样可以阻止空会话的继续进行。

超时

所谓状态表项的超时值是指每个表项存在的最大时间,这些超时值的大小在/usr/src/linux/net/ipv4/netfilter/ip_conntrack_proto_tcp.c文件中设置。以下是相关的代码:

static unsigned long tcp_timeouts[]
= { 30 MINS, /* TCP_CONNTRACK_NONE, */
   5 DAYS, /* TCP_CONNTRACK_ESTABLISHED, */
   2 MINS, /* TCP_CONNTRACK_SYN_SENT, */
   60 SECS, /* TCP_CONNTRACK_SYN_RECV, */
   2 MINS, /* TCP_CONNTRACK_FIN_WAIT, */
   2 MINS, /* TCP_CONNTRACK_TIME_WAIT, */
   10 SECS, /* TCP_CONNTRACK_CLOSE, */
   60 SECS, /* TCP_CONNTRACK_CLOSE_WAIT, */
   30 SECS, /* TCP_CONNTRACK_LAST_ACK, */
   2 MINS, /* TCP_CONNTRACK_LISTEN, */
};

4、.ICMP
          在iptables看来,只有四种ICMP分组,这些分组类型可以被归为NEW、ESTABLISHED两类:

ECHO请求(ping,8 和ECHO应答(ping,0)。
时间戳请求(13)和应答(14)。
信息请求(15)和应答(16)。
地址掩码请求(17)和应答(18 。

这些ICMP分组类型中,请求分组属于NEW,应答分组属于ESTABLISHED。而其它类型的ICMP分组不基于请求/应答方式,一律被归入RELATED。

一个简单的例子:
iptables -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED, RELATED -j ACCEPT
iptables -A INPUT -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT
这链条规则进行如下的过滤:
    一个ICMP echo请求是一个NEW连接。因此,允许ICMP echo请求通过OUTPUT链。
    当对应的应答返回,此时连接的状态是ESTABLISED,因此允许通过INPUT链。而INPUT链没有NEW状态,因此不允许echo请求通过INPUT链。也就是说,这两条规则允许内部主机ping外部主机,而不允许外部主机ping内部主机。
    一个重定向ICMP(5)分组不是基于请求/应答方式的,因此属于RELATED。INPUT和OUTPUT链都允许RELATED状态的连接,因此重定向(5)分组可以通过INPUT和OUTPUT链。

转载于:https://blog.51cto.com/wushank/1264758

iptables连接跟踪ip_conntrack相关推荐

  1. linux视频教程 iptables 跟踪,linux – 了解iptables中的连接跟踪

    我在对iptables中的状态/连接跟踪做了一些澄清. >这两条规则有什么区别? iptables -A FORWARD -m state –state ESTABLISHED,RELATED ...

  2. linux 连接跟踪nf_conntrack 与 NAT和状态防火墙

    本文主要记录对于连接跟踪以及其主要应用的NAT和状态iptables的学习内容 连接跟踪 什么是连接跟踪? 连接跟踪是Linux内核中引入的nf_conntrack 模块所实现的功能,同时支持IPv4 ...

  3. Linux nf_conntrack连接跟踪的实现

    连接跟踪,顾名思义,就是识别一个连接上双方向的数据包,同时记录状态.下面看一下它的数据结构: struct nf_conn {         /* Usage count in here is 1 ...

  4. Linux Kernel TCP/IP Stack — L3 Layer — netfilter 框架 — conntrack(CT,连接跟踪)

    目录 文章目录 目录 CT CT CT(conntrack,connection tracking,连接跟踪),顾名思义,就是跟踪(并记录)连接的状态,是许多网络应用的基础.例如:iptables.L ...

  5. 一文读懂 Linux 下单机实现百万并发的内核黑科技:连接跟踪(Conntrack)

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 本文介绍连接跟踪(connection tracking,conntrack,CT)的原理,应用,及其在 Linu ...

  6. netfilter连接跟踪(conntrack)详述

    1 连接跟踪来龙去脉 1.1 什么是连接跟踪 连接跟踪顾名思义是对网络连接跟踪,如果将网络比作 高速路 ,连接跟踪就像是高速路里的路上的检查站.摄像头一起的组合,可以记录下你在什么地方进的高速.什么地 ...

  7. Linux网络之连接跟踪(conntrack)

    连接跟踪是很多网络服务和应用的基础.例如,kubernetes的service,ServiceMesh sidecar,4层负载均衡软件LVS/IPVS,容器网络,OpenvSwitch,OpenSt ...

  8. linux进行端口跟踪,(五)洞悉linux下的Netfilteriptables:如何理解连接跟踪机制?【上】...

    其实PRE_ROUTING和LOCAL_OUT点可以看作是整个netfilter的入口,而POST_ROUTING和LOCAL_IN可以看作是其出口.在只考虑连接跟踪的情况下,一个数据包无外乎有以下三 ...

  9. 连接跟踪(connection tracking,conntrack,CT)

    连接跟踪(connection tracking,conntrack,CT) 原文连接:http://arthurchiao.art/blog/conntrack-design-and-impleme ...

最新文章

  1. 如何选择真正的万兆防火墙?
  2. 关于Java中何时使用static和工具类相关知识
  3. boost::spirit模块将 QString 数据类型用作 Qi 属性的测试程序
  4. 喵哈哈村的魔法考试 Round #10 (Div.2) B
  5. leetcode刷题正则表达式
  6. yolo v4模型训练过程(超详细)
  7. 2017-本命年总结
  8. winload.exe 数字签名无法验证解决方法
  9. 微信.gif表情包保存到本地
  10. 使用JIRA搭建本地项目管理工具
  11. php单页菜单,纯CSS3单页切换导航菜单界面设计
  12. 怎么在删除计算机里面搜索记录,Win7如何删除我的电脑搜索栏里面的搜索记录介绍三种删除win7搜索记录的方法...
  13. 【愚公系列】2022年10月 使用win11系统自带远程桌面,远程控制VMware中Windows虚拟机系统
  14. 鸿蒙归蝶的反弹,诛仙鸿蒙副本怎么过
  15. 入职两年申请涨薪3K被拒,是我平时好脸给多了?转身立马裸辞走人...
  16. 搭建DVWA出现错误:DVWA System error - config file not found.
  17. Java卸载删除(2023最强版)
  18. 【深入UCSC Genome Brower】他山之石
  19. 哥大暴跌16名!2023 USNews 全美大学排名发布!
  20. hdu-1225-Football Score

热门文章

  1. 实验三编程、编译、连接、跟踪
  2. 切图工具优化的几点总结
  3. h5实现手机端等级进度条
  4. JS弹出窗口窗口的位置和大小
  5. [原]请留心asp:Image控件中的ImageUrl属性
  6. JavaScript从入门到精通[文章列表联接]
  7. LINUX 下构建OpenGL ES 3.0
  8. 基于稀疏表示的人脸识别 (SRC,LASRC,RASL,MRR)
  9. 撑起整个互联网的7大开源技术
  10. [转]Git详解之五 分布式Git