Upload
liseli
View
327
Download
0
Embed Size (px)
DESCRIPTION
Linux Kernel 2.4.* 中 conntrack 原理和应用. 张焕杰 中国科学技术大学网络信息中心 [email protected]. 内容. 简单理解 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 - PowerPoint PPT Presentation
Citation preview
1
Linux Kernel 2.4.*Linux Kernel 2.4.*中中 conntrackconntrack 原理和应用原理和应用
张焕杰中国科学技术大学网络信息中心
3
Netfilter/iptablesNetfilter/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
5
netfilternetfilter 结果结果
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.
8
Connection trackConnection track 原理原理
根据数据包的内容,记录各个连接的状态是状态包过滤防火墙和 NAT必需的功能状态表
超时 协议 SRC Sport DST Dport state
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
12
HASHHASH
Conntrack中 2个方向的 tuple 被 hash后,根据 hash结果放到对应的链表中
方便快速查找– 查找 tuple是否存在,只要对 tuple 做 hash,到对应的链表中查找, O(1)复杂度
– 如果构造 tuple使得 hash冲突,查找最坏变成 O(N)复杂度,可以用来 DOS攻击
13
ConntrackConntrack 处理过程处理过程对进入包处理系统的
packet(PRE_ROUTING 、 LOCAL_OUT)– 根据 packet内容生成 tuple– 查找系统中是否有该 tuple的记录– 如果不存在
新建立一个 conntrack记录,生成反向的 tuple记录– 调用对应的协议的数据包处理程序
TCP:状态跟踪 UDP:延长超时时间 ICMP : 2个方向的 icmp包相等,直接删除 conntrack信息
14
ConntrackConntrack 处理过程处理过程对从离开包处理系统的
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
ConntrackConntrack 的问题的问题 HASH性能问题
– 可能会造成 DoS攻击总的 conntrack数量有限,遭到 DoS攻击
– 每个 conntrack大约占用 400byte– Icmp 、 TCP SYN 、 UDP超时 60秒– 10kpps , 60秒 600k conntrack 240M 内存
DROP包时性能问题– 每个包都要产生一个 conntrack记录,在数据包被
DROP时释放 conntrack记录,浪费 CPU时间
17
ConntrackConntrack 扩展扩展Conntrack日志
– 发送一个连接的如下信息到日志服务器 Start_time 、 end_time Proto 、 srcip 、 dstip 、 sport 、 dport 、 pkts 、 byt
s Nsrcip 、 ndstip 、 nsport 、 ndport 、 rpkts 、 rbyts State
连接数限制– 限制一个 IP占用的 conntrack数量
18
ConntrackConntrack 日志日志
Conntrack增加一些信息– Start_time , end_time,统计数据
在 conntrack的超时处理过程中,使用udp协议把这些信息发送给日志服务器
Conntrack的处理中增加对以上信息的修改– 新的 conntrack设置 start_time– 每个数据包修改统计数据和 end_time
19
URLURL 记录记录
增加一个对 tcp 80端口处理的 helper程序对 tcp的数据包进行处理,恢复其中的
URL如果特意将 URL分到不同的包中,或者使用 keep-alive,记录不全
20
性能性能
内存占用– 每个 conntrack多占用了大约 24byte,增加 1
0%的内存处理
– 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
控制控制 kernelkernel
/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