nf_conntrack (ip_conntrack) 格式详解
nf_conntrack(ip_conntrack) 格式详解
关于
nf_conntrack模块(/proc/net/nf_conntrack
) 在Linux kernel 2.6.15 被引入,支持ipv4和ipv6,取代只支持ipv4的ip_conntrack (Linux 内核为4.9x开始,ip_conntrack已经去除)。
当防火墙iptables/nftables 配置了 state
或者 nat
, nf_conntrack模块会被激活,用以来记录当前连接的状态。
由于nf_conntrack会记录当前系统所有协议连接的状态,所以对于高流量高并发平台,nf_conntrack: table full, dropping packet
这种错误并不少见。关于这个异常,以及有大量的文章总结处理方法,大概的策略有
- 对于没有使用nat的平台,不使用state,那么nf_conntrack不会激活。
- 修改内核参数。(注意,对于超高流量的平台,不断的修改连接数上限终究会遇到
内存
瓶颈。)- net.netfilter.nf_conntrack_buckets
- net.netfilter.nf_conntrack_max
- net.nf_conntrack_max
- 使用 iptables raw表,绕过nf_conntrack 记录机制。
本来重点在于分解 nf_conntrack,相关 nf_conntrack
异常处理方法可以参考以下文章
- kisops # nf_conntrack: table full, dropping packet. 终结篇
- keithmork # nf_conntrack: table full, dropping packet
格式
nf_conntrack 分为几个部分(ip_conntrack少了网络层两列)
协议信息以及状态
数据包Input四元组
数据包output四元组
flag
options
协议信息以及状态
协议信息以及状态一共有
- 网络层名称,network layer protocol name
- 网络层代码, network layer protocol number
- 传输层名称,transmission layer protocol name
- 传输层代码,transmission layer protocol number.
- 有效期,seconds until the entry is invalidated
- 连接状态[仅限TCP],connection state
Input/Output 四元组关系
- 对于非NAT 转发, 四元组对应关系如下
Input与Ouput的数据是相反的。其中进入Input的 src, sport 是客户端发起连接的信息。
- 对于NAT转发,由于Iptables/nftables 作为转发连接的中转,需要维护连接双方的四元组信息。
其中dest 为当前nat转发的ip地址,input 链中的 dport为 nat 连接的端口。而output链中的dport对应input链中的 sport (标识用户,当服务端回传数据的时候,根据该端口即可快速定位到客户端src)
flag标识
flag 一共有
- [ASSURED], 确认建立连接, 如果,在这个状态下数据停止了传输,则这条记录会有一个计时器,也就是记录中的第三个字段 – 有效期,上面这条记录的第三个字段是179,代表当前的ASSURED状态还能够保持179秒,如果还有新的数据包经过,那么计时器会被重新设置成缺省的180秒,如果在180秒内都没有流量,那么这条状态记录就会从状态表中被删除。
- [UNREPLIED], 代表这是一个状态为NEW的数据包,当这条连接的回应数据包到达防火墙后,防火墙立即将修改这条状态记录。标记为 UNREPLIED,会被优先丢弃。
options
- mark, 连接标识
- zone, 连接标识组,不同zone的连接允许相同的id值
- use
格式化工具
git-clone之后,使用如下
>>from pyconntrack import NFConntrack
>>conntrack = NFConntrack()
>>conntrack.fetch_conntrack()
>>conntrack.forward("", "")
>>conntrack.server("", "")
>>conntrack.client("", "")
轻松将nf_conntrack内容解析为json