配置CONNTRACK_MAX
---------------------
跟踪连接的条目是存储在链接的表中的,因此最大的跟踪链接条目(CONNTRACK_MAX)能够很容易的动态调整。
linux内核2.4.23之前,使用:
# echo $CONNTRACK_MAX > /proc/sys/net/ipv4/ip_conntrack_max
linux内核2.4.23之后,使用:
# echo $CONNTRACK_MAX > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
这里$CONNTRACK_MAX是个整数。
配置HASHSIZE
----------------
因为数学上的原因,哈西表占有固定的大小。因此HASHSIZE必须在哈西表被创建和开始填充之前就确定。
在linux内核2.4.21之前,必须使用素数作为哈西表的大小,而且要确保这个哈西表能够有效并通用。非素数的奇数或其他的数值都是强烈不推荐使用的,因为这样哈西的分配不能达到最优化的状态。
从linux内核2.4.21(更有2.6内核)跟踪连接使用jenkins2b算法,这样就能够使用任何的数值,但是使用2^n次方运作的最有效。
假如netfilter的跟踪连接是被编译进内核中的,哈西表的大小就能够在编译的时候配置,或(2.6内核之后)能够作为一个启动选项ip_conntrack.hashsize=$HASHSIZE。
假如netfilter的跟踪连接是编译成一个模块,哈西表的大小能够在加载模块的时候配置,使用下面的命令:
# modprobe ip_conntrack hashsize=$HASHSIZE
这里$HASHSIZE是个整数。
一个理想的例子:只做防火墙的机器
------------------------------------
在理想的例子中,您有一台机器只做包过滤和NAT(也就是说,基本上没有用户空间的使用,至少不会有象代理这样会不断的耗费内存空间的东西......)
netfilter跟踪连接使用的内核内存大小是:
size_of_mem_used_by_conntrack (以bytes记) =
CONNTRACK_MAX * sizeof(struct ip_conntrack)
HASHSIZE * sizeof(struct list_head)
-这里:sizeof(struct ip_conntrack)能够有很大的区别,依赖于机器的体系架构,内核版本和编译时间的配置。要想知道他的大小,能够查看ip_conntrack初始化时候kenel的日志信息。sizeof(struct ip_conntrack)在i386架构、 2.6.5内核上大约是300bytes,但是在2.6.10的内核上,这个值能够在352至192bytes之间变化!
-sizeof(struct list_head) = 2 * size_of_a_pointer
在i386上,size_of_a_pointer是4bytes。
因此在i386,2.6.5内核上,size_of_mem_used_by_conntrack大约是CONNTRACK_MAX * 300 HASHSIZE * 8 (bytes)。
假如我们使HASHSIZE = CONNTRACK_MAX(假如我们将大部分的内存用来做防火墙的工作,参见“修改 CONNTRACK_MAX和HASHSIZE”部分),在i386架构、2.6.5内核上, size_of_mem_used_by_conntrack大概是CONNTRACK_MAX * 308 bytes。
现在我们假定您使用512M的内存拿来做一个只做防火墙的机器,并且使用128MB以外的内存来做跟踪连接,对于使用终端模式只做防火墙来说应该是足够的大的,例如:
您能够同时配置CONNTRACK_MAX和HASHSIZE大致如下:
(512 - 128) * 1024^2 / 308 =~ 1307315 (instead of 32768 for CONNTRACK_MAX,
and 4096 for HASHSIZE by default)。
对于linux2.4.21(和linux2.6),哈西算法最好使用“2的次方”大小(之前是使用素数)。
因此在这里我们能够将CONNTRACK_MAX和HASHSIZE配置成1048576(2^20)。
这样,您能够存储默认值32倍的跟踪连接条目,而且能够得到更好的跟踪连接性能。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




