2.4.3 文件三nf_nat_core.c2.4.3.1 文件描述该文件的路径是linux-3.5.4/net/ipv4/netfilter/nf_nat_core.c。 该文件是nat机制的主要处理文件,涉及到最终的网络地址转换,包括原IP、原端口与目的IP、目的端口的转化。 2.4.3.2 主要变量及宏定义无 2.4.3.3 结构体定义1.nf_conntrack_tuple结构体:struct nf_conntrack_tuple {struct nf_conntrack_man src; struct { union nf_inet_addr u3; union { __be16 all; struct { __be16 port; } tcp; struct { __be16 port; } udp; struct { u_int8_t type, code; } icmp; struct { __be16 port; } dccp; struct { __be16 port; } sctp; struct { __be16 key; } gre; } u; u_int8_t protonum; u_int8_t dir; } dst; };
连接跟踪中获取数据报基本信息结构体,描述了数据包的来源或者去向,记录了ip、端口号、数据包的方向以及协议类型。 2.4.3.4 外部函数参见2.4.1和2.4.2 2.4.3.5 内部函数1.find_appropriate_src( )函数原型:static intfind_appropriate_src(struct net *net, u16 zone,const struct nf_conntrack_tuple *tuple,struct nf_conntrack_tuple *result,const struct nf_nat_ipv4_range *range) 函数参数:net表示网络名称,tuple表示连接跟踪的信息,result表示连接跟踪的信息 。 函数功能:用于确定ip地址、端口等是否在合适的范围,并且定义了一个nf_conn_nat结构的变量nat,结构体中的成员bysource是一个hash链表,把即将进行NAT操作的连接都放到这个hash表里。 返回值:成功返回0,反之返回1。 2.get_unique_tuple( ) 函数原型:static void get_unique_tuple(struct nf_conntrack_tuple *tuple,const struct nf_conntrack_tuple *orig_tuple,const struct nf_nat_ipv4_range *range,struct nf_conn *ct,enum nf_nat_manip_type maniptype) 函数参数:tuple表示连接跟踪的信息,oring表示已有连接跟踪的信息,ct表示连接状态信息,maniptype表示方向,进或者出。 函数功能:get_unique_tuple( )函数调用find_appropriate_src( )确定ip地址、端口等是否在合适的范围,并且定义了一个nf_conn_nat结构的变量nat,结构体中的成员bysource是一个hash链表,把即将进行NAT操作的连接都放到这个hash表里;从用find_best_ips_proto( )内网指定的地址范围中搜索一个最少使用的ip分给内网的机子;最后会调用nat协议的操作集调用unique_tuple成员函数。 返回值:无。 3.nf_nat_setup_info( ) 函数原型:unsigned int nf_nat_setup_info(struct nf_conn *ct, const struct nf_nat_ipv4_range *range,enum nf_nat_manip_type maniptype) 函数参数:ct表示连接状态信息,maniptype表示方向,进或者出。 函数功能:nf_nat_setup_info( )函数中调用get_unique_tuple( )来获取唯一的tuple五元组,之后函数返回到nf_nat_packet继续执行,最终调用manip_pkt( )来完成ip和端口的转换。返回值:返回1,代表数据包被接收。 4.manip_pkt( ) 函数原型:static boolmanip_pkt(u_int16_t proto,struct sk_buff *skb,unsigned int iphdroff,const struct nf_conntrack_tuple *target,enum nf_nat_manip_type maniptype) 函数参数:proto表示传输协议,skb表示传输的数据包,iphdroff表示ip头的偏移量,target表示目的处理信息,maniptype表示方向,进或者出。 函数功能:完成原ip、原端口到目的ip、目的端口的转换。 返回值:成功则返回1。 5.nf_nat_packet( ) 函数原型:unsigned int nf_nat_packet(struct nf_conn *ct,enum ip_conntrack_info ctinfo,unsigned int hooknum,struct sk_buff *skb) 函数参数:ct表示连接状态信息,hooknum表示钩子点的位置。 函数功能:根据nf_nat_setup_info做包处理。 返回值:数据包符合条件返回1,否则返回0。 6.nf_nat_protocol_register( ) 函数原型:int nf_nat_protocol_register(const struct nf_nat_protocol *proto) 函数参数:proto表示具体协议。 函数功能:有关nat处理的协议注册。 返回值:成功返回0,反之返回相应的错误码。 7.nf_nat_protocol_unregister( ) 函数原型:void nf_nat_protocol_unregister(const struct nf_nat_protocol *proto) 函数参数:proto表示具体协议。 函数功能:有关nat处理的协议注销。 返回值:无。 本文转载于微信公众号: Linux内核之旅(LinuxKernelTravel),更多微信文章请扫描关注公众号: |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|