1 / 26

Linux Kernel 2.4.* 中 conntrack 原理和应用

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

liseli
Download Presentation

Linux Kernel 2.4.* 中 conntrack 原理和应用

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Linux Kernel 2.4.*中conntrack原理和应用 张焕杰 中国科学技术大学网络信息中心 james@ustc.edu.cn

  2. 内容 • 简单理解Linux kernel 2.4.*中的netfilter/iptables框架 • 2.4.*中conntrack原理 • 扩展应用

  3. 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

  4. 5个HOOK位置

  5. 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.

  6. Netfilter • Iptables是netfilter上的应用nat mangle filter • Conntrack实现连接跟踪

  7. Netfilter/iptables • 可以实现完整的基于连接跟踪的包过滤防火墙 • 支持包过滤,双向地址转换 • 连接跟踪的处理与NAT处理分离,更加模块化

  8. Connection track原理 • 根据数据包的内容,记录各个连接的状态 • 是状态包过滤防火墙和NAT必需的功能 • 状态表

  9. 2.4中的conntrack

  10. 关键数据结构 • 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

  11. 关键数据结构 • Conntrack • 引用计数 • 原方向的tuple、应答方向的tuple • 状态 • 超时时间 • 其他信息

  12. HASH • Conntrack中2个方向的tuple被hash后,根据hash结果放到对应的链表中 • 方便快速查找 • 查找tuple是否存在,只要对tuple做hash,到对应的链表中查找,O(1)复杂度 • 如果构造tuple使得hash冲突,查找最坏变成O(N)复杂度,可以用来DOS攻击

  13. Conntrack处理过程 • 对进入包处理系统的packet(PRE_ROUTING、LOCAL_OUT) • 根据packet内容生成tuple • 查找系统中是否有该tuple的记录 • 如果不存在 • 新建立一个conntrack记录,生成反向的tuple记录 • 调用对应的协议的数据包处理程序 • TCP:状态跟踪 • UDP:延长超时时间 • ICMP:2个方向的icmp包相等,直接删除conntrack信息

  14. Conntrack处理过程 • 对从离开包处理系统的packet(POST_ROUTING、LOCAL_IN) • 如果conntrack中的2个tuple不在链表中,增加到链表中 • 整个处理过程中被DROP的包,不会走到这里,对应的conntrack的引用数为0时conntrack信息被删除 • 超时处理 • 删除conntrack记录

  15. 其他过程 • Alter_reply_tuple修改反方向包 • NAT处理代码通知conntrack处理代码,将来应答的tuple会改变 • Helper程序 • 对特定应用数据的特殊处理 • Ftp等 • Expect相关连接处理 • Ftp的cmd和data连接是相关的

  16. Conntrack的问题 • HASH性能问题 • 可能会造成DoS攻击 • 总的conntrack数量有限,遭到DoS攻击 • 每个conntrack大约占用400byte • Icmp、TCP SYN、UDP超时60秒 • 10kpps,60秒600k conntrack 240M 内存 • DROP包时性能问题 • 每个包都要产生一个conntrack记录,在数据包被DROP时释放conntrack记录,浪费CPU时间

  17. Conntrack扩展 • Conntrack日志 • 发送一个连接的如下信息到日志服务器 • Start_time、end_time • Proto、srcip、dstip、sport、dport、pkts、byts • Nsrcip、ndstip、nsport、ndport、rpkts、rbyts • State • 连接数限制 • 限制一个IP占用的conntrack数量

  18. Conntrack日志 • Conntrack增加一些信息 • Start_time,end_time,统计数据 • 在conntrack的超时处理过程中,使用udp协议把这些信息发送给日志服务器 • Conntrack的处理中增加对以上信息的修改 • 新的conntrack设置start_time • 每个数据包修改统计数据和end_time

  19. URL记录 • 增加一个对tcp 80端口处理的helper程序 • 对tcp的数据包进行处理,恢复其中的URL • 如果特意将URL分到不同的包中,或者使用keep-alive,记录不全

  20. 性能 • 内存占用 • 每个conntrack多占用了大约24byte,增加10%的内存 • 处理 • O(1)复杂度 • DROP的数据包不会引发超时过程,因此DROP的包没有日志 • 可以考虑限制不确认的conntrack的发送速率

  21. 连接数限制 • 简单限制 • 限制一个IP占用的总数和最多处理确认状态的总数 • 仅仅对出去的连接限制 • Struct Iplimit • Maxtotal 最多总数 • Total 当前总数 • MaxAssure 最多确认的连接数 • Assure 当前确认的连接数

  22. 数据结构 • LocalNetwork • Netaddr • Netmask • Limit * iplimit 根据netmask动态分配的内存 • LocalNetwork • 202.38.64.0 • 255.255.224.0 • Limit (8192*sizeof(iplimit)) • LocalNetwork用数组存放,限制在10个左右

  23. 增加的处理 • 生成一个新conntrack时,增加total,如果total=maxtotal,丢弃数据包 • 释放conntrack时,减少total,如果有assure标记,减少assure • 对tcp数据包 • 首次进入established状态时,增加assure,设置assure标记,如果assure=maxassure,丢弃数据包 • 离开established状态时,减少assure,清除assure标志

  24. 控制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

  25. 性能分析 • 占用内存 • 每个IP地址占用16字节,1个B地址占用1M字节 • 每个conntrack多占用1个字节(assure标记) • 处理 • O(1)

  26. 连接限制问题 • 可以伪造别的IP地址发送数据包,耗尽连接数

More Related