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 异常处理方法可以参考以下文章

格式

nf_conntrack 分为几个部分(ip_conntrack少了网络层两列)

协议信息以及状态 数据包Input四元组 数据包output四元组 flag options

协议信息以及状态

协议信息以及状态一共有

  1. 网络层名称,network layer protocol name
  2. 网络层代码, network layer protocol number
  3. 传输层名称,transmission layer protocol name
  4. 传输层代码,transmission layer protocol number.
  5. 有效期,seconds until the entry is invalidated
  6. 连接状态[仅限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 一共有

options

常见的选项

  • mark, 连接标识
  • zone, 连接标识组,不同zone的连接允许相同的id值
  • use

格式化工具

https://github.com/Lozy/pyconntrack

git-clone之后,使用如下

>>from pyconntrack import NFConntrack
>>conntrack = NFConntrack()
>>conntrack.fetch_conntrack()
>>conntrack.forward("", "")
>>conntrack.server("", "")
>>conntrack.client("", "")

轻松将nf_conntrack内容解析为json