首页 存档 技术 查看内容

Linux网络子系统安全性模块详细分析之文件nf_nat_core.c

2018-3-30 13:00 |来自: 互联网 400 0

摘要: 2.4.3 文件三nf_nat_core.c 2.4.3.1 文件描述 该文件的路径是linux-3.5.4/net/ipv4/netfilter/nf_nat_core.c。 该文件是nat机制的主要处理文件,涉及到最终的网络地址转换,包括原IP、原端口与目的IP、目的端口的 ...

2.4.3 文件三nf_nat_core.c

2.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),更多微信文章请扫描关注公众号:

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部