nf_conntrack 调优
nf_conntrack 调优
netfilter
netfilter是linux内在的一个软件框架,用来管理网络数据包。
netfilter提供了5个hook来进行管理网络包。如下图:
- PREROUTING, 所有包都会经过这个hook
- LOCAL INPUT, 进入本机的包会经过这个hook
- FORWARD, 不进入本机的包,做转发的包会经过这个hook
- LOCAL OUTPUT, 从本机出去的包会经过这个hook
- POSTROUTING, 所有出去的包都会经过这个hook
netfilter进行包的管理,则需要记录每个连接的状态信息。这就是nf_conntrack的工作了。
nf_conntrack
nf_conntrack是netfilter的一个子系统。它记录了每个连接的状态信息。
nf_conntrack记录的信息包括,源ip、端口,目标ip、端口,连接状态,协议等。
连接状态包含以下几种:
- NEW, 新创建的连接,发起连接方发出包后,还没收到回包,都处理这种状态。
- ESTABLISHED, 已建立的连接,发起连接后,收到回包,这时处理已连接状态。
- RELATED, 与其他连接相关联,其他的连接与此连接有关联。如ftp的控制连接和数据连接。
- INVALID, 非法的连接,比如包的行为不合法。
nf_conntrack需要保存这些信息在它自己的数据结构中。其数据结构如下:
它是一个开链的哈希表,链表是一个双向表。每个哈希节点称为一个bucket,计算出同样哈希值的连接放到链表里连起来。 每个节点记录了请求方向、响应方向的消息。
哈希表的大小,也就是说哈希表的节点数,由nf_conntrack_buckets配置。
nf_conntrack能跟踪的最大连接数由nf_conntrack_max配置。