一 nf_conn结构体分析
对于nf_conn的分析主要是针对3.6内核,相对于之前的结构体有很大的变化。先看一下新的结构体的定义
其中有一个结构体nf_conntrack_expect,它到底是有什么作用呢。比如我们常用的FTP协议,在经过带有NAT的路由器的时候我们经常听到FTP穿透功能,为什么FTP要进行穿透呢。那么首先得从FTP的原理入手:
FTP两种工作模式:主动模式(Active FTP)和被动模式(Passive FTP)
在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,然后开放N+1号端口进行监听,并向服务器发出PORT
N+1命令。服务器接收到命令后,会用其本地的FTP数据端口(通常是20)来连接客户端指定的端口N+1,进行数据传输。
在被动模式下,FTP库户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,同时会开启N+1号端口。然后向服务器发送PASV命令,通知服务器自己处于被动模式。服务器收到命令后,会开放一个大于1024的端口P进行监听,然后用PORT
P命令通知客户端,自己的数据端口是P。客户端收到命令后,会通过N+1号端口连接服务器的端口P,然后在两个端口之间进行数据传输。
举例: 主动模式当我们PC通过NAT的路由器连接外部的网络的过程中,如果NAT未被特殊处理的话,比如sr_port:1200,
dst_port 21,NAT完成之后可能就成为src_port:1300, dst_port
21,当服务器传输数据的时候他只会根据收到的包,将端口+1,这样,数据传输的话就靠src_port 21, dst_port
1301,这样就没法到达PC端了。
因此针对这种情况,linux
kernel使用了nf_conntrack_expect这种方法,针对特殊的端口,比如FTP,通过下面的代码对conn进行了处理,有兴趣可以具体分析一下:
exp->expectfn
= nf_nat_follow_master;
二 结构体联系图
上面的几个重要的结构体,他们的组织图大体如下:
三 nf_conn的初始化流程
首先要初始化nf_conn变量,那么就要从init_conntrack进行分析
然后根据连接的五元组数据,进行exp的查找,如果exp有相应的helper,将它通过nf_conn进行绑定,创建con_helper结构体。
执行到这里就到了上面FTP的expectfn函数,对ct进行了处理。
总结:
对于conntrack里面几个重要的结构体nf_conn
nf_conn_help nf_conntrack_expect,可以通过仔细分析一下NAT
FTP部分,加深对于三个结构体联系的理解。