首页 > 代码库 > iptables之ip_conntrack模块

iptables之ip_conntrack模块

 ip_conntrack模块:



1,基本概念:

-允许的最大跟踪连接条目:CONNTRACK_MAX
-存储跟踪连接条目列表的哈西表的大小:HASHSIZE
-每个哈西表的条目(叫一个bucket),包含了一个链接起来的跟踪连接条目
-哈希表大小HASHSIZE,表现为 条目bucket的多少,在iptables启动时在日志中会显示。

spacer.gifwKiom1N_HNLSGqBHAAERZbkF6lE170.jpg


kernel 用 ip_conntrack 模块来记录 iptables 网络包的状态,并把每条记录保存到 table 里(这个 table 在内存里,可以通过/proc/net/ip_conntrack 查看当前已经记录的总数),如果网络状况繁忙,比如高连接,高并发连接等会导致逐步占用这个 table 可用空间,一般这个 table 很大不容易占满并且可以自己清理,table 的记录会一直呆在 table 里占用空间直到源 IP 发一个 RST 包,但是如果出现被攻击、错误的网络配置、有问题的路由/路由器、有问题的网卡等情况的时候,就会导致源 IP 发的这个 RST 包收不到,这样就积累在 table 里,越积累越多直到占满,满了以后 iptables 就会丢包,出现外部无法连接服务器的情况。内核会报如下错误信息:kernel: ip_conntrack: table full, dropping packet.

在/proc/net/ip_conntrack中,每一个跟踪连接表会占用304字节的内核存储空间,时间一长就会把默认的空间填满,那么默认空间时多少?我以redhat为例在内存为64MB的机器上时4096,内存为128MB是 8192,内存为256MB是16376,可以通过查看/proc/sys/net/ipv4/ip_conntrack_max文件得知系统最大值。

案例如下:

[root@yd_82_231 netfilter]# cat /var/log/messages|grep conn   
Nov 28 13:18:20 yd_82_231 kernel: ip_conntrack version 2.4 (8192 buckets, 65536 max) - 304 bytes per conntrack
Nov 29 14:48:25 yd_82_231 kernel: ip_conntrack version 2.4 (8192 buckets, 65536 max) - 304 bytes per conntrack
Nov 29 14:50:13 yd_82_231 kernel: ip_conntrack version 2.4 (8192 buckets, 65536 max) - 304 bytes per conntrack

需要注意的事项:

-conntrack最大数量.叫做conntrack_max

-存储这些conntrack的hash表的大小,叫做hashsize

当conntrack入口数大于conntrack_max时,在hash表中每一个conntrack list中的存储的入口将不可控.(conntrack_mark/hashsize 为每个list所能存储的入口的数量)

hash表存在于固定的的不可swap的内存中. conntrack_mark决定占用多少这些不可swap的内存.

缺省的hashsize

——————————–

conntrack_max=hashsize*8

i386中 hashsize=conntrack_max/8=ramsize(in bytes)/131072=ramsize(in MegaBytes)*8.

所以32位pc,512M内存可以存512*1024^2/128/1024=512*8=4096(连接池list)

但是正确的算法是:

hashsize=conntrack_max/8=ramsize(in bytes)/131072/(x/32)

2,当使用iptables时,启用如下两种功能会启用ip_conntrack模块:

 1,使用nat功能 

 2  使用 -m stat选项

3,当在/etc/sysconfig/iptables-config或者其他配置文件加载如下模块:IPTABLES_MODULES="ip_conntrack_netbios_ns"

 

3,和ip_conntrack相关的内核参数及相关作用(如下这些文件,当ip_conntrack模块启用时才有)

/proc/net/ip_conntrack  这个内存中的文件保存了所有的conntrack记录

/proc/sys/net/ipv4/ip_conntrack_max 或者/proc/sys/net/ipv4/netfilter/ip_conntrack_max     2.6内核中,这两个文件改变任何一个都生效。系统支持的conntrack的最大记录数

/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established   系统默认全部清空conntrack记录的时间

/proc/sys/net/ipv4/netfilter/ip_conntrack_buckets  系统默认的buckets数


4,这个模块导致的问题

如果是高吞吐的服务,最好不要使用这个模块,因为启用这个模块之后/proc/net/ip_conntrack文件的记录数很快会超限,然后系统就会出现丢包,/var/log/messages中也会出现table full,dropping packets的报错。一般缓解办法为:

适当调大/proc/sys/net/ipv4/ip_conntrack_max 的值及减少/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established的值。



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



本文出自 “佳” 博客,请务必保留此出处http://leejia.blog.51cto.com/4356849/1416407