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

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

Netfilter hook点概述


Netfilter全景图



二层hook示意图



三层hook示意图





hook调用示意图



Netfilter hook函数的应用场景


  • 如果仅需判断报文是否经过了某个hook点,则采用【TCP/IP】【调试】丢包、流不通、错包等问题查证手段系列之二——防火墙这一节的方式即可,没有必要单独写钩子函数。


  • 有时需要查看报文的内容,如需确认报文内容是否正确,或希望匹配特定报文做些动作(如截取dns报文、dhcp报文等),此时,可以考虑使用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__);    
        }
    }
}
相关文章
|
6月前
|
机器学习/深度学习 人工智能 网络协议
TCP/IP五层(或四层)模型,IP和TCP到底在哪层?
TCP/IP五层(或四层)模型,IP和TCP到底在哪层?
111 4
|
5月前
|
网络协议 Java 程序员
TCP/IP协议栈是网络通信基础,Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用
【6月更文挑战第23天】 **TCP/IP协议栈是网络通信基础,它包含应用层(HTTP, FTP等)、传输层(TCP, UDP)、网络层(IP)、数据链路层(帧, MAC地址)和物理层(硬件信号)。Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用,如Socket和ServerSocket用于客户端和服务器通信。**
54 3
|
监控 网络协议 网络架构
IP协议【图解TCP/IP(笔记九)】
IP协议【图解TCP/IP(笔记九)】
144 0
|
域名解析 网络协议
IP协议, TCP协议 和DNS 服务分别是干什么的?
大家好,我是阿萨。昨天讲解了网络四层协议[TCP/IP协议族分为哪4层?]今天我们学习下IP 协议, TCP 协议和DNS 协议分别是干什么的。
294 0
IP协议, TCP协议 和DNS 服务分别是干什么的?
|
网络协议 网络架构
六、TCP/IP模型 和 5层参考模型
六、TCP/IP模型 和 5层参考模型
六、TCP/IP模型 和 5层参考模型
|
网络协议
TCP/IP协议族有哪些?
大家好,我是阿萨。昨天我们学习了[URI 和URL 的区别是什么?]了解了URI 和URL的区别。 学习HTTP, 绕不开TCP/IP,那么TCP/IP 协议族分为哪4层?
315 0
TCP/IP协议族有哪些?
|
网络协议 网络性能优化 网络安全
网络协议报文理解刨析篇二(再谈Http和Https), 加上TCP/UDP/IP协议分析(理解着学习), 面试官都惊讶你对网络的见解(2)
网络协议报文理解刨析篇二(再谈Http和Https), 加上TCP/UDP/IP协议分析(理解着学习), 面试官都惊讶你对网络的见解(2)
网络协议报文理解刨析篇二(再谈Http和Https), 加上TCP/UDP/IP协议分析(理解着学习), 面试官都惊讶你对网络的见解(2)
|
域名解析 网络协议 安全
网络协议报文理解刨析篇二(再谈Http和Https), 加上TCP/UDP/IP协议分析(理解着学习), 面试官都惊讶你对网络的见解(1)
网络协议报文理解刨析篇二(再谈Http和Https), 加上TCP/UDP/IP协议分析(理解着学习), 面试官都惊讶你对网络的见解(1)
网络协议报文理解刨析篇二(再谈Http和Https), 加上TCP/UDP/IP协议分析(理解着学习), 面试官都惊讶你对网络的见解(1)
|
网络协议 算法 网络性能优化
网络入门基础模型, 网络大体框架, TCP/IP协议栈, 各种局域网和广域网刨析 (以图解的方式推开网络大门)
网络入门基础模型, 网络大体框架, TCP/IP协议栈, 各种局域网和广域网刨析 (以图解的方式推开网络大门)
网络入门基础模型, 网络大体框架, TCP/IP协议栈, 各种局域网和广域网刨析 (以图解的方式推开网络大门)
|
存储 运维 网络协议
深入浅出:这次终于能把 TCP/IP 协议搞明白了
深入浅出:这次终于能把 TCP/IP 协议搞明白了
深入浅出:这次终于能把 TCP/IP 协议搞明白了