Linux nf_conntrack(三)-本地外出报文

本文详细解析了内核中关于本地报文(NF_INET_LOCAL_OUT)的连接跟踪处理,指出ipv4_conntrack_local函数的核心是调用nf_conntrack_in进行连接建立,与外来报文处理类似但位置不同。
摘要由CSDN通过智能技术生成

背景       

        最近在学习了解内核中关于连接跟踪的相关处理,众所周知,内核中连接跟踪处理依附于Netfilter内核架构,通过在内核协议栈报文处理过程中不同的HOOK点(钩子)设置HOOK处理函数,实现连接跟踪相关处理,相关定义如下:

static const struct nf_hook_ops ipv4_conntrack_ops[] = {
	{
		.hook		= ipv4_conntrack_in,
		.pf		= NFPROTO_IPV4,
		.hooknum	= NF_INET_PRE_ROUTING,
		.priority	= NF_IP_PRI_CONNTRACK,
	},
	{
		.hook		= ipv4_conntrack_local,
		.pf		= NFPROTO_IPV4,
		.hooknum	= NF_INET_LOCAL_OUT,
		.priority	= NF_IP_PRI_CONNTRACK,
	},
	{
		.hook		= nf_confirm,
		.pf		= NFPROTO_IPV4,
		.hooknum	= NF_INET_POST_ROUTING,
		.priority	= NF_IP_PRI_CONNTRACK_CONFIRM,
	},
	{
		.hook		= nf_confirm,
		.pf		= NFPROTO_IPV4,
		.hooknum	= NF_INET_LOCAL_IN,
		.priority	= NF_IP_PRI_CONNTRACK_CONFIRM,
	},
};

        之前基于接收报文简单介绍了连接建立(ipv4_conntrack_in)与连接确认(nf_confirm)的处理过程,关于本机外出报文连接相关处理还不清楚,这里进一步学习完善。

本机外出报文

          从上述hook操作的相关定义可知,本机外出报文的连接处理对应HOOK点NF_INET_LOCAL_OUT,处理函数为ipv4_conntrack_local();

        首先确认下调用位置,__ip_local_out()函数是本机外出报文(L3报文)的必经之路,在函数__ip_local_out()内部存在如下代码:

return nf_hook(NFPROTO_IPV4, NF_INET_LOCAL_OUT,
		       net, sk, skb, NULL, skb_dst(skb)->dev, dst_output);

        接下来我们重点分析下 ipv4_conntrack_local()函数处理逻辑  。

 ipv4_conntrack_local函数 

        函数具体处理逻辑如下:

static unsigned int ipv4_conntrack_local(void *priv,
					 struct sk_buff *skb,
					 const struct nf_hook_state *state)
{
    /* 分片报文处理,从这里看如果分片报文走到这里要么已建立连接,要么不建连接直接返回 */
	if (ip_is_fragment(ip_hdr(skb))) { /* IP_NODEFRAG setsockopt set */
		enum ip_conntrack_info ctinfo;
		struct nf_conn *tmpl;

		tmpl = nf_ct_get(skb, &ctinfo);
		if (tmpl && nf_ct_is_template(tmpl)) {
			/* when skipping ct, clear templates to avoid fooling
			 * later targets/matches
			 */
			skb->_nfct = 0;
			nf_ct_put(tmpl);
		}
		return NF_ACCEPT;
	}
    
    /* 建立连接的核心处理函数 */
	return nf_conntrack_in(skb, state);
}

           从上述代码可以看出ipv4_conntrack_local函数的核心处理为调用nf_conntrack_in()函数,和外来报文建立连接的后续处理逻辑一致,具体可参考之前的博客:nf_conntrack(一)-连接建立

        由此可见,本机外出报文、外来报文建立连接的处理过程是相似的,只是报文处理的位置有所不同。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值