260 likes | 860 Views
Linux Kernel 2.4.* 中 conntrack 原理和应用. 张焕杰 中国科学技术大学网络信息中心 james@ustc.edu.cn. 内容. 简单理解 Linux kernel 2.4.* 中的 netfilter/iptables 框架 2.4.* 中 conntrack 原理 扩展应用. Netfilter/iptables. Netfilter 是 Linux kernel 中对数据包进行处理的框架 定义了5个 HOOK 位置 NF_IP_PRE_ROUTING NF_IP_LOCAL_IN NF_IP_FORWARD
E N D
Linux Kernel 2.4.*中conntrack原理和应用 张焕杰 中国科学技术大学网络信息中心 james@ustc.edu.cn
内容 • 简单理解Linux kernel 2.4.*中的netfilter/iptables框架 • 2.4.*中conntrack原理 • 扩展应用
Netfilter/iptables • Netfilter是Linux kernel 中对数据包进行处理的框架 • 定义了5个HOOK位置 • NF_IP_PRE_ROUTING • NF_IP_LOCAL_IN • NF_IP_FORWARD • NF_IP_POST_ROUTING • NF_IP_LOCAL_OUT
netfilter结果 • NF_ACCEPT: continue traversal as normal. • NF_DROP: drop the packet; don't continue traversal. • NF_STOLEN: I've taken over the packet; don't continue traversal. • NF_QUEUE: queue the packet (usually for userspace handling). • NF_REPEAT: call this hook again.
Netfilter • Iptables是netfilter上的应用nat mangle filter • Conntrack实现连接跟踪
Netfilter/iptables • 可以实现完整的基于连接跟踪的包过滤防火墙 • 支持包过滤,双向地址转换 • 连接跟踪的处理与NAT处理分离,更加模块化
Connection track原理 • 根据数据包的内容,记录各个连接的状态 • 是状态包过滤防火墙和NAT必需的功能 • 状态表
关键数据结构 • Tuple • Proto、srcip、dstip、协议特定信息 • TCP、UDP: sport、dport • ICMP: type code • 原方向的tuple、应答方向的tuple(reply tuple) • 生成Reply tuple的过程(Invert tuple) • 调换srcip、dstip • 调用协议相关的inver_tuple处理 • TCP、UDP是调换sport、dport • ICMP是对type code处理,如8/0(ech request)的invert是0/0
关键数据结构 • Conntrack • 引用计数 • 原方向的tuple、应答方向的tuple • 状态 • 超时时间 • 其他信息
HASH • Conntrack中2个方向的tuple被hash后,根据hash结果放到对应的链表中 • 方便快速查找 • 查找tuple是否存在,只要对tuple做hash,到对应的链表中查找,O(1)复杂度 • 如果构造tuple使得hash冲突,查找最坏变成O(N)复杂度,可以用来DOS攻击
Conntrack处理过程 • 对进入包处理系统的packet(PRE_ROUTING、LOCAL_OUT) • 根据packet内容生成tuple • 查找系统中是否有该tuple的记录 • 如果不存在 • 新建立一个conntrack记录,生成反向的tuple记录 • 调用对应的协议的数据包处理程序 • TCP:状态跟踪 • UDP:延长超时时间 • ICMP:2个方向的icmp包相等,直接删除conntrack信息
Conntrack处理过程 • 对从离开包处理系统的packet(POST_ROUTING、LOCAL_IN) • 如果conntrack中的2个tuple不在链表中,增加到链表中 • 整个处理过程中被DROP的包,不会走到这里,对应的conntrack的引用数为0时conntrack信息被删除 • 超时处理 • 删除conntrack记录
其他过程 • Alter_reply_tuple修改反方向包 • NAT处理代码通知conntrack处理代码,将来应答的tuple会改变 • Helper程序 • 对特定应用数据的特殊处理 • Ftp等 • Expect相关连接处理 • Ftp的cmd和data连接是相关的
Conntrack的问题 • HASH性能问题 • 可能会造成DoS攻击 • 总的conntrack数量有限,遭到DoS攻击 • 每个conntrack大约占用400byte • Icmp、TCP SYN、UDP超时60秒 • 10kpps,60秒600k conntrack 240M 内存 • DROP包时性能问题 • 每个包都要产生一个conntrack记录,在数据包被DROP时释放conntrack记录,浪费CPU时间
Conntrack扩展 • Conntrack日志 • 发送一个连接的如下信息到日志服务器 • Start_time、end_time • Proto、srcip、dstip、sport、dport、pkts、byts • Nsrcip、ndstip、nsport、ndport、rpkts、rbyts • State • 连接数限制 • 限制一个IP占用的conntrack数量
Conntrack日志 • Conntrack增加一些信息 • Start_time,end_time,统计数据 • 在conntrack的超时处理过程中,使用udp协议把这些信息发送给日志服务器 • Conntrack的处理中增加对以上信息的修改 • 新的conntrack设置start_time • 每个数据包修改统计数据和end_time
URL记录 • 增加一个对tcp 80端口处理的helper程序 • 对tcp的数据包进行处理,恢复其中的URL • 如果特意将URL分到不同的包中,或者使用keep-alive,记录不全
性能 • 内存占用 • 每个conntrack多占用了大约24byte,增加10%的内存 • 处理 • O(1)复杂度 • DROP的数据包不会引发超时过程,因此DROP的包没有日志 • 可以考虑限制不确认的conntrack的发送速率
连接数限制 • 简单限制 • 限制一个IP占用的总数和最多处理确认状态的总数 • 仅仅对出去的连接限制 • Struct Iplimit • Maxtotal 最多总数 • Total 当前总数 • MaxAssure 最多确认的连接数 • Assure 当前确认的连接数
数据结构 • LocalNetwork • Netaddr • Netmask • Limit * iplimit 根据netmask动态分配的内存 • LocalNetwork • 202.38.64.0 • 255.255.224.0 • Limit (8192*sizeof(iplimit)) • LocalNetwork用数组存放,限制在10个左右
增加的处理 • 生成一个新conntrack时,增加total,如果total=maxtotal,丢弃数据包 • 释放conntrack时,减少total,如果有assure标记,减少assure • 对tcp数据包 • 首次进入established状态时,增加assure,设置assure标记,如果assure=maxassure,丢弃数据包 • 离开established状态时,减少assure,清除assure标志
控制kernel • /proc/iplimit/control • 写 • A 202.38.64.0 255.255.255.0 100 100 • C 202.38.64.1 100 200 • F 202.38.64.1 • D 202.38.64.0 255.255.255.0 • 读 • 202.38.64.0 202.38.64.39 100 0 100 0 • 202.38.64.40 202.38.64.40 100 1 100 1 • 202.38.64.41 202.38.64.166 100 0 100 0
性能分析 • 占用内存 • 每个IP地址占用16字节,1个B地址占用1M字节 • 每个conntrack多占用1个字节(assure标记) • 处理 • O(1)
连接限制问题 • 可以伪造别的IP地址发送数据包,耗尽连接数