【TCP/IP】【调试】丢包、流不通、错包等问题查证手段系列之三——Netfilter hook函数

  • 🐚作者简介:花神庙码农(专注于Linux、WLAN、TCP/IP、Python等技术方向)
  • 🐳博客主页:花神庙码农 ,地址:https://blog.csdn.net/qxhgd
  • 🌐系列专栏:TCP/IP协议
  • 📰如觉得博主文章写的不错或对你有所帮助的话,还望大家三连支持一下呀!!! 👉关注✨、点赞👍、收藏📂、评论。
  • 如需转载请参考转载须知!!

Netfilter hook点概述

Netfilter全景图

在这里插入图片描述

二层hook示意图

在这里插入图片描述

三层hook示意图

在这里插入图片描述
加粗样式
在这里插入图片描述

hook调用示意图

在这里插入图片描述

Netfilter hook函数的应用场景

具体开发过程

  • 此处,仅以一个二层的hook点为例来说明。

Linux的module

  • 编写一个Linux的module,可以编译为独立的ko,也可直接编入内核;
  • 这部分可参考网上其他资料,类似下面的模式:
#ifndef __KERNEL__       
#define __KERNEL__
#endif
#ifndef MODULE       
#define MODULE
#endif

#include <linux/module.h>
#include <linux/kernel.h>

static int __init pkt_process_init(void) {       
    printk(KERN_ALERT "pkt_process_init called.\n");       
    return 0;
}

static void __exit pkt_process_exit(void) {       
    printk(KERN_ALERT "pkt_process_exit called\n");
}

module_init(pkt_process_init);
module_exit(pkt_process_exit);

编写钩子函数

  • 此处,可根据需要在br_pkt_hook_handle函数中,做一些报文的识别及处理工作。
static unsigned int br_pkt_hook_handle(const struct nf_hook_ops *ops, struct sk_buff *skb, const struct nf_hook_state *state) {
    struct ethhdr *eth;  
    struct iphdr *iph;          /* IPv4 header */
    struct tcphdr *tcph;        /* TCP header */
    struct udph *udph;
 	
 	if (!skb) {
    	return NF_ACCEPT;
    }
    
    eth = (struct ethhdr *) skb->data;
    iph = ip_hdr(skb);          
    if (iph->protocol == IPPROTO_TCP) {
        tcph = tcp_hdr(skb);       
    }
    else if (iph->protocol == IPPROTO_UDP) {
        udph= udp_hdr(skb);       
    }    

    /* other process */
}

注册钩子函数

static struct nf_hook_ops br_nf_ops_hooks[] = {
    {
        .hook       = br_pkt_hook_handle,
        .owner      = THIS_MODULE,
        .pf         = PF_BRIDGE,
        .hooknum    = NF_BR_FORWARD,
        .priority   = NF_BR_PRI_BRNF,
    },
};

static int __init pkt_process_init(void) {       
    printk(KERN_ALERT "pkt_process_init called.\n");       

	for (i = 0; i < ARRAY_SIZE(br_nf_ops_hooks); i++) {
    	if ((nf_register_hook(&br_nf_ops_hooks[i])) < 0) {
        	printk("[%s:%d] nf_register_hook register failed!\n", __FUNCTION__, __LINE__);    
    	}
	}
    return 0;

去注册钩子

static void __exit pkt_process_exit(void) {       
    printk(KERN_ALERT "pkt_process_exit called\n");
    for (i = 0; i < ARRAY_SIZE(br_nf_ops_hooks); i++) {
        if ((nf_unregister_hook(&br_nf_ops_hooks[i])) < 0) {
            printk("[%s:%d] nf_register_hook register failed!\n", __FUNCTION__, __LINE__);    
        }
    }
}

如本文对你有些许帮助,欢迎大佬支持我一下,您的支持是我持续创作的不竭动力
支持我的方式

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
TCP/IP协议是一种常用的网络通信协议栈,包含了多个层次的协议。其中包括网络接口层、网络层、传输层和应用层等。 网络接口层是TCP/IP协议栈中的最底层,负责处理数据在物理网络中的传输,包括数据链路层和物理层。在网络接口层,数据被封装成帧,通过网络接口卡(NIC)发送到目标主机。 网络层是TCP/IP协议栈的第二层,主要负责网络之间的通信,包括IP协议、ARP协议和路由协议等。IP协议是网络层的核心协议,它负责将数据包从源主机发送到目标主机。在发送数据包之前,IP会先检查Netfilter LOCAL_OUT钩子,根据配置执行iptables相关设置,然后执行IP路由,寻找下一跳的IP地址。 传输层是TCP/IP协议栈的第三层,提供可靠的端到端通信,主要包括TCP协议和UDP协议。TCP协议提供面向连接的可靠传输,通过三次握手建立连接,保证数据的可靠性和有序性。UDP协议则是一种无连接的传输协议,适用于一些对传输延迟要求较低的应用场景。 应用层是TCP/IP协议栈的最上层,包含各种应用协议,例如HTTP协议、FTP协议、SMTP协议等。应用层协议定义了数据的具体格式和传输规则,使不同的应用程序能够进行通信和数据交换。 总结起来,TCP/IP协议栈包括了网络接口层、网络层、传输层和应用层等多个层次的协议,通过这些协议实现了网络通信和数据传输。其中,网络接口层处理物理网络传输,网络层负责网络之间的通信和路由,传输层提供可靠的端到端通信,应用层定义了各种应用协议。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [计算机网络笔记、面试八股(一)—— TCP/IP网络模型](https://blog.csdn.net/weixin_41683971/article/details/129212811)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [TCPIP协议栈之数据包如何穿越各层协议(绝对干货)](https://blog.csdn.net/qq_40989769/article/details/129539739)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花神庙码农

你的鼓励是我码字的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值