netfilter 讲解 ,讲的很好

2023-05-16

Netfilter为多种网络协议(IPv4、IPv6、ARP等)各提供了一套钩子函数。

在IPv4中定义了5个钩子函数,这些钩子函数在数据包流经协议栈的5个关键点被调用。

这就像有5个钓鱼台,在每个钓鱼台放了一个鱼钩(钩子函数),把经过的数据包钓上来,

然后根据自定义的规则,来决定数据包的命运:

可以原封不动的放回IPv4协议,继续向上层递交;可以进行修改,再放回IPv4协议;也可以直接丢弃。

Netfilter主要采用连接跟踪(Connection Tracking)、包过滤(Packet Filtering)、地址转换(NAT)、包处理

(Packet Mangling)四种技术。

 

(1) IP层的5个钓鱼台

 

[java] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. enum nf_inet_hooks {  
  2.     NF_INET_PRE_ROUTING,  
  3.     NF_INET_LOCAL_IN,  
  4.     NF_INET_FORWARD,  
  5.     NF_INET_LOCAL_OUT,  
  6.     NF_INET_POST_ROUTING,  
  7.     NF_INET_NUMHOOKS  
  8. };  

支持的协议类型:

[java] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. enum {  
  2.     NFPROTO_UNSPEC = 0,  
  3.     NFPROTO_IPV4 = 2,  
  4.     NFPROTO_ARP = 3,  
  5.     NFPROTO_BRIDGE = 7,  
  6.     NFPROTO_IPV6 = 10,  
  7.     NFPROTO_DECNET = 12,  
  8.     NFPROTO_NUMPROTO,  
  9. };  

 

(2) 钩子函数

[java] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. typedef unsigned int nf_hookfn(unsigned int hooknum,  
  2.                                struct sk_buff *skb,  
  3.                                const struct net_device *in,  
  4.                                const struct net_device *out,  
  5.                                int (*okfn) (struct sk_buff *));  
  6.   
  7. /* 处理函数返回值 */  
  8. #define NF_DROP 0 /* drop the packet, don't continue traversal */  
  9. #define NF_ACCEPT 1 /* continue traversal as normal */  
  10. #define NF_STOLEN 2 /* I've taken over the packet, don't continue traversal */  
  11. #define NF_QUEUE 3 /* queue the packet (usually for userspace handling) */  
  12. #define NF_REPEAT 4 /* call this hook again */  
  13. #define NF_STOP 5  
  14. #define NF_MAX_VERDICT NF_STOP  

 

(3) Netfilter实体

在使用Netfilter时,需要定义一个nf_hook_ops实例。

[java] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. struct nf_hook_ops {  
  2.     struct list_head list;  
  3.     /* User fills in from here down. */  
  4.     nf_hookfn *hook; /* 要注册的钩子函数 */  
  5.     struct module *owner;  
  6.     u_int8_t pf; /* 协议类型 */  
  7.     unsigned int hooknum; /* 哪个钓鱼台 */  
  8.     /* Hooks are ordered in asending priority. */  
  9.     int priority; /* 数值越小,优先级越高 */  
  10. };  
  11. typedef __u8 u_int8_t;  

 

(4) 注册与注销

[java] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* Functions to register/unregister hook points. */  
  2. int nf_register_hook(struct nf_hook_ops *reg);  
  3. void nf_unregister_hook(struct nf_hook_ops *reg);  

 

实现

 

Netfilter定义了一个全局链表:

[java] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. struct list_head nf_hooks[NFPROTO_NUMPROTO][NF_MAX_HOOKS];  
  2. EXPORT_SYMBOL(nf_hooks);  
  3. static DEFINE_MUTEX(nf_hook_mutex);  

 

(1) 注册函数

注册函数会把nf_hook_ops放入nf_hooks相应的位置中。

[java] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. int nf_register_hook(struct nf_hook_ops *reg)  
  2. {  
  3.     struct nf_hook_ops *elem;  
  4.     int err;  
  5.   
  6.     err = mutex_lock_interruptible(&nf_hook_mutex);  
  7.     if (err < 0)  
  8.         return err;  
  9.   
  10.     list_for_each_entry(elem, &nf_hooks[reg->pf][reg->hooknum], list) {  
  11.         if (reg->priority < elem->priority)  
  12.             break;  
  13.     }  
  14.   
  15.     list_add_rcu(&reg->list, elem->list.prev); /* 把netfilter实例添加到队列中 */  
  16.     mutex_unlock(&nf_hook_mutex);  
  17.     return 0;  
  18. }  

 

(2) 注销函数

[java] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void nf_unregister_hook(struct nf_hook_ops *reg)  
  2. {  
  3.     mutex_lock(&nf_hook_mutex);  
  4.     list_del_rcu(&reg->list); /* 把netfilter实例从队列中删除 */  
  5.     mutex_unlock(&nf_hook_mutex);  
  6.     synchronize_net();  
  7. }  

 

(3) 内核接口

内核的Netfilter钩子函数调用:

NF_HOOK

    |--> NF_HOOK_THRESH

               |--> nf_hook_thresh

                         |--> nf_hook_slow

                                   |--> nf_iterate

[java] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. static inline int NF_HOOK(uint8_t pf, unsigned int hook, struct sk_buff *skb,  
  2.     struct net_device *in, struct net_device *out, int (*okfn)(struct sk_buff *))  
  3. {  
  4.     /* INT_MIN表示要调用钓鱼台的所有钩子函数 */  
  5.     return NF_HOOK_THRESH(pf, hook, skb, in, out, okfn, INT_MIN);   
  6. }  
  7.   
  8. static inline int NF_HOOK_THRESH(uint8_t pf, unsigned int hook, struct sk_buff *skb,  
  9.     struct net_device *in, struct net_device *out, int (*okfn)(struct sk_buff *), int thresh)  
  10. {  
  11.     int ret = nf_hook_thresh(pf, hook, skb, in, out, okfn, thresh);  
  12.     if (ret == 1)  
  13.         ret = okfn(skb); /* 如果skb没被处理掉,调用此函数 */  
  14.   
  15.     return ret;  
  16. }  
[java] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * nf_hook_thresh - call a netfilter hook 
  3.  * Returns 1 if the hook has allowed the packet to pass. 
  4.  * The function okfn must be invoked by the caller in this case. 
  5.  * Any other return value indicates the packet has been consumed by the hook. 
  6.  */  
  7. static inline int nf_hook_thresh(u_int8_t pf, unsigned int hook, struct sk_buff *skb,  
  8.     struct net_device *indev, struct net_device *outdev, int (*okfn)(struct sk_buff *), int thresh)  
  9. {  
  10. #ifndef CONFIG_NETFILTER_DEBUG  
  11.     /* 如果协议pf的hook点上没有已注册的nf_hook_ops实例,直接返回1 */  
  12.     if (list_empty(&nf_hooks[pf][hook]))  
  13.         return 1;  
  14. #endif  
  15.   
  16.     return nf_hook_slow(pf, hook, skb, indev, outdev, okfn, thresh);  
  17. }  
  18.    
  19. /* Returns 1 if okfn() needs to be executed by the caller, -EPERM for NF_DROP, 0 otherwise. */  
  20. int nf_hook_slow(u_int8_t pf, unsigned int hook, struct sk_buff *skb, struct net_device *indev,  
  21.     struct net_device *outdev, int (*okfn)(struct sk_buff *), int hook_thresh)  
  22. {  
  23.     struct list_head *elem;  
  24.     unsigned int verdict;  
  25.     int ret = 0;  
  26.   
  27.     /* We may already have this, but read-locks nest anyway */  
  28.     rcu_read_lock();  
  29.   
  30.     elem = &nf_hooks[pf][hook];  
  31. next_hook:  
  32.     verdict = nf_iterate(&nf_hooks[pf][hook], skb, hook, indev, outdev, &elem, okfn, hook_thresh);  
  33.   
  34.     if (verdict == NF_ACCEPT || verdict == NF_STOP) {  
  35.         ret = 1;  
  36.     } else if (verdict == NF_DROP) {  
  37.         kfree_skb(skb);  
  38.         ret = -EPERM;  
  39.     } else if ((verdict & NF_VERDICT_MASK) == NF_QUEUE) {  
  40.         if (! nf_queue(skb, elem, ph, hook, indev, outdev, okfn, verdict >> NF_VERDICT_BITS))  
  41.             goto next_hook;  
  42.     }  
  43.   
  44.     rcu_read_unlock();  
  45.   
  46.     return ret;  
  47. }  
[java] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. unsigned int nf_iterate(struct list_head *head, struct sk_buff *skb, unsigned int hook,  
  2.     const struct net_device *indev, const struct net_device *outdev, struct list_head **i,  
  3.     int (*okfn)(struct sk_buff *), int hook_thresh)  
  4. {  
  5.     unsigned int verdict;  
  6.   
  7.     /*  
  8.      * The caller must not block between calls to this function because of risk of 
  9.      * continuing from deleted element. 
  10.      */  
  11.     list_for_each_continue_rcu(*i, head) {  
  12.         struct nf_hook_ops *elem = (struct nf_hook_ops *) *i;  
  13.   
  14.         /* 优先级>=hook_thresh的都会被执行 */  
  15.         if (hook_thresh > elem_priority)  
  16.             continue;  
  17.   
  18.         verdict = elem->hook(hook, skb, indev, outdev, okfn); /* 已注册的执行函数 */  
  19.   
  20.         if (verdict != NF_ACCEPT) {  
  21. #ifdef CONFIG_NETFILTER_DEBUG  
  22.             if (unlikely((verdict & NF_VERDICT_MASK) > NF_MAX_VERDICT)) {  
  23.                 NFDEBUG("Evil return from %p(%u).\n", elem->hook, hook);  
  24.                 continue;  
  25.             }  
  26. #endif  
  27.   
  28.             if (verdict != NF_REPEAT)  
  29.                 return verdict;  
  30.             *i = (*i)->prev;  
  31.         }  
  32.     }  
  33.   
  34.     return NF_ACCEPT;  
  35. }  

 

使用

 

以下是一个简单的模块,加载到一个HTTP服务器上。

通过在PRE_ROUTING处注册my_hookfn,改变接收数据包的源IP为8.8.8.8(Google DNS server)。

当客户端向服务器发送一个请求时,肯定收不到服务器的响应:)

[java] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <linux/netfilter.h>  
  2. #include <linux/init.h>  
  3. #include <linux/module.h>  
  4. #include <linux/netfilter_ipv4.h>  
  5. #include <linux/ip.h>  
  6. #include <linux/inet.h>  
  7.   
  8. /** 
  9.  * Hook function to be called. 
  10.  * We modify the packet's src IP. 
  11.  */  
  12. unsigned int my_hookfn(unsigned int hooknum,  
  13.     struct sk_buff *skb,  
  14.     const struct net_device *in,  
  15.     const struct net_device *out,  
  16.     int (*okfn)(struct sk_buff *))  
  17. {  
  18.     struct iphdr *iph;  
  19.     iph = ip_hdr(skb);  
  20.   
  21.     /* log the original src IP */  
  22.     printk(KERN_INFO"src IP %pI4\n", &iph->saddr);  
  23.   
  24.     /* modify the packet's src IP */  
  25.     iph->saddr = in_aton("8.8.8.8");  
  26.   
  27.     return NF_ACCEPT;  
  28. }  
  29.   
  30. /* A netfilter instance to use */  
  31. static struct nf_hook_ops nfho = {  
  32.     .hook = my_hookfn,  
  33.     .pf = PF_INET,  
  34.     .hooknum = NF_INET_PRE_ROUTING,  
  35.     .priority = NF_IP_PRI_FIRST,  
  36.     .owner = THIS_MODULE,  
  37. };  
  38.   
  39. static int __init sknf_init(void)  
  40. {  
  41.     if (nf_register_hook(&nfho)) {  
  42.         printk(KERN_ERR"nf_register_hook() failed\n");  
  43.         return -1;  
  44.     }  
  45.     return 0;  
  46. }  
  47.   
  48. static void __exit sknf_exit(void)  
  49. {  
  50.     nf_unregister_hook(&nfho);  
  51. }  
  52.   
  53. module_init(sknf_init);  
  54. module_exit(sknf_exit);  
  55. MODULE_AUTHOR("zhangsk");  
  56. MODULE_LICENSE("GPL");  


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

netfilter 讲解 ,讲的很好 的相关文章

  • firewalld和netfilter

    setenforce 0 临时关闭selinux vi etc selinux config 永久关闭selinux需要修改这个配置文件 将SELINUX 61 enforcing修改为SELINUX 61 disabled getenfo
  • Netfilter笔记-02

    Netfilter说白了就是针对不同的协议 xff08 协议类型和hook节点我们上一章已经讲过 xff09 在kernel中放置了不同的hook节点 xff0c 等数据包sk buff xff0c 到来的时候 xff0c 要给hook节点
  • netfilter

    通俗的说 xff0c netfilter的架构就是在整个网络流程的若干位置放置了一些检测点 xff08 HOOK xff09 xff0c 而在每个检测点上登记了一些处理函数进行处理 xff08 如包过滤 xff0c NAT等 xff0c 甚
  • 使用 eBPF 技术跟踪 Netfilter 数据流

    1 网络层数据流向与 Netfilter 体系 图 1 1 为网络层内核收发核心流程图 xff0c 在函数流程图中我们可以看到 Netfliter 在其中的位置 xff08 图中深色底纹圆角矩形 xff09 图中对应的 hook 点有 5
  • netfilter 讲解 ,讲的很好

    Netfilter为多种网络协议 xff08 IPv4 IPv6 ARP等 xff09 各提供了一套钩子函数 在IPv4中定义了5个钩子函数 xff0c 这些钩子函数在数据包流经协议栈的5个关键点被调用 这就像有5个钓鱼台 xff0c 在每
  • SYNPROXY抵御DDoS攻击的原理和优化

    序 又到了周末 我又要必须写点什么了 周末依然加班 感谢周末上班平日休息的老婆分担了几乎所有家务 一切依然 然而这些对我来讲都不是个事儿 事实上我是希望取消一切节假日和周末的 所谓的周末和节假日是我一直以来觉得出自 圣经 里面最荒唐的东西
  • 利用conntrack-tools 工具查看系统追踪连接信息

    1 简介 conntrack tools 是一套Linux用户空间连接跟踪工具 用于系统管理员进行交互连接跟踪系统 它包括了用户空间的守护进程conntrackd和命令行界面conntrack 2 安装 下载连接 https pkgs or
  • 如何使用 netfilter 挂钩在内核空间中回显数据包?

    我想在内核空间中回显一个数据包 我在这台机器上运行一个 echo 服务器 端口为 6000 现在 客户端在另一台机器上运行 向回显服务器发送数据 现在 我想做的是从内核空间回显数据包 我不想用数据包打扰服务器 它会从内核空间默默地回显 我在
  • 使用 Linux netfilter 将源 IP 地址从 struct iphdr* 转换为等效字符串

    我想将使用 netfilter 捕获的数据包中的源和目标 IP 地址转换为 char 在我的 netfilter 挂钩函数中 我有 sock buff skb argument 2 of hook function ip header is
  • 如何跟踪Linux内核中的write系统调用?

    我正在尝试这样做 我通过 iperf 一种开源工具 从一台机器向另一台机器发送数据包 我想跟踪写入系统或发送调用 请帮助我做到这一点 如果有人可以指导通过 Ftrace 框架来跟踪系统调用 否则通过任何其他跟踪工具就太好了 困难的部分是准确
  • 来自 sk_buff 的 IP 地址

    我正在编写一个注册 netfilter 挂钩的内核模块 我试图通过使用来获取呼叫者的IP地址sk buff gt saddr成员 有没有办法获得人类可读的 IP 即 x x x x 格式 我找到了这个功能inet ntop 但它似乎在内核头
  • nf_conntrack_helper_register返回错误

    在内核中 如果我想重新启动我的 conntrack 寄存器 nf conntrack helper unregister sip i j redefinition of the sip i j parameters nf conntrack
  • 打印 TCP 数据包数据

    在TCP通信中 当数据包从以太网传输到网络 IP 层时 我想打印该数据包中存在的数据 我正在Linux上工作 我得到一些信息 它可以在 Linux 内核代码的帮助下完成 即在 Linux NAT 防火墙代码中 但是我从哪里可以获得内核源代码
  • 在不使用环回网络的情况下将数据包转发到同一主机中的服务

    我有这个 libnetfilter queue 应用程序 它根据某些 iptables 规则从内核接收数据包 在直接讨论我的问题之前 我提供了一个示例可行代码和其他工具来设置测试环境 以便我们的问题定义和可能的解决方案可以更加准确和稳健 以
  • 如何在 debian 64 位上从 tcphdr (sk_buff) 结构访问数据/有效负载?

    我正在开发一个小型防火墙 我必须从端口 80 http 检索每个 tcp 数据包的数据以进行解析 这段代码在 debian 32 位虚拟机上运行良好 我能够打印每个网页的标题 但是当我尝试加载内核模块并通过 http 端口传输一些数据时 它
  • 如何以编程方式动态管理 iptables 规则?

    我需要查询现有规则 以及能够轻松添加和删除规则 我还没有找到任何 API 来执行此操作 我缺少什么吗 我最接近的解决方案是使用iptables save iptables xml用于查询并手动调用 iptables 命令本身来添加 删除规则
  • 定义 Netfilter 挂钩函数的正确方法是什么?

    我正在编写一个内核模块 更具体地说 一个网络过滤器模块 适用于 Linux 我试图使其与各种内核兼容 但入口功能给我带来了麻烦 从 LXR 中 我可以看到nf hookfntypedef 在内核 3 13 中发生了变化 Linux 3 12
  • 哪个进程拥有给定的端口(Linux 内核)?

    我正在为 Linux 编写一个简单的应用程序层防火墙 目前没什么特别的 只是我需要的东西 由于 iptables 的所有者模块不够 我决定使用 libnetfilter queue 来实现 在我的防火墙 C C 应用程序 中的某个时刻 我需
  • Linux 中 NDIS 过滤器的类似物是什么?

    我正在研究一个as close to real time我在linux中尽可能地使用系统 并且需要在收到特定数据包后立即发送大约600 800字节的TCP数据包 为了获得最佳的延迟 我希望这个数据包直接从内核发送 而不是将接收到的数据包一直
  • 使用netfilter队列修改数据包?

    我目前正在尝试在用户空间中使用带有 libnetfilter queue 的代码来修改在 iptables 的 NFQUEUE 目标中排队的数据包 但是我不知道如何去做 我已将其设置为使用 NFQNL COPY PACKET 复制数据包 如

随机推荐

  • 奇偶校验(附代码实现)

    定义 奇偶校验 Parity Check 是一种校验代码传输正确性的方法 根据被传输的一组二进制代码的数位中 1 的个数是奇数或偶数来进行校验 采用奇数的称为奇校验 xff0c 反之 xff0c 称为偶校验 采用何种校验是事先规定好的 通常
  • libcurl在windows中编译和使用的说明文档(官方翻译)

    使用Visual C构建先决条件 本文档描述了如何编译 xff0c 构建和安装curl和libcurl 从使用Visual C构建工具的来源 要用VC构建 xff0c 你会 当然要先安装VC 所需的最低版本VC是6 xff08 Visual
  • odroid xu4安装ROS melodic+远程登录+Roboware 开发

    odroid xu4安装ROS melodic 43 远程登录 43 Roboware 开发 一 odroid xu4安装ROS melodic二 远程登录odroid xu41 odroid xu4自动登录2 odroid xu4配置固定
  • Vector 简介和优缺点

    引用 xff1a https blog csdn net taiyang1987912 article details 50351827 vector向量相当于一个数组 在内存中分配一块连续的内存空间进行存储 支持不指定vector大小的存
  • PC电脑控制手机iphone(iOS 11、iOS 12、iOS 13),需越狱

    Veency是一款可以用电脑控制你的iPhone的插件 xff0c 作者是大名鼎鼎的Cydia的创始人Jay Freeman xff0c 也就是Saurik 但是最高支持到IOS9 xff0c 在IOS 10以上无法使用 基于Veency
  • 【Windows】Shellcode免杀,过360、火绒、Defender 静态及主防

    Shellcode xff0c 顾名思义是一段拿来执行的代码片段 xff0c 我们可以使用Shellcode来完成我们需要的任务 弹窗的代码 xff0c 可以被认为是一段Shellcode xff0c 获取某个模块的基址的代码 xff0c
  • Metasploit体系结构和目录

    一 Metasploit体系结构 一 xff09 基础库文件 metasploit基础库文件位于源码根目录路径下的libraries目录中 xff0c 包括Rex framework core和framework base三部分 Rex是整
  • Metasploit Framework Handbook

    文章目录 前言MsFrameworkMetasploit诞生发展体系结构功能阶段工具管理基本命令情报搜集网络服务渗透测试 Refference 前言 众所周知Metasploit工具是一款强大的渗透测试利器 xff0c 在渗透测试中堪称一条
  • 简单无锁队列的实现和使用

    无锁队列越来越流行 xff0c 在特定的场合使用不同的无锁队列 xff0c 可以起到节省锁开销 xff0c 提高程序效率 Linux内核中有无锁队列的实现 xff0c 可谓简洁而不简单 核心判断部分利用了整数溢出机制 xff0c 这个有很多
  • 关于网狐棋牌6603源码的整理、编译和搭建

    最近换工作 xff0c 趁着有一段清闲时间 xff0c 整理了一下网狐棋牌的源码 xff0c 这份源码下载很久了 xff0c 一直呆在硬盘 这次正好好好看看 网狐的代码质量很高 xff0c 流露出来的代码也比较完整 xff0c 基本上都能编
  • Pycharm:注释、删除所有注释

    1 单行注释 2 39 39 39 多行注释 39 39 39 3 删除所有注释 CTRL 43 R进入替换模式 xff0c 勾选右上角正则表达式 xff0c 然后在搜索框输入 xff0c Replace All即可
  • Outlook 2016 pst/ost邮件数据文件迁移实现

    当使用outlook 2016新建Email账户的时候 xff0c 其数据文件 xff08 ost文件 xff09 总是被保存在C盘默认目录 C Users 用户名 AppData Local Microsoft Outlook 下 xff
  • 跟我一起学习VIM - vim插件合集

    前两天同事让我在小组内部分享一下VIM xff0c 于是我花了一点时间写了个简短的教程 虽然准备有限 xff0c 但分享过程中大家大多带着一种惊叹的表情 xff0c 原来编辑器可以这样强大 xff0c 这算是对我多年来使用VIM的最大鼓舞吧
  • linux最简单搭建邮件服务器

    一 概述 xff1a 在配置邮件服务器之前 xff0c 先解释几个概念 通常使用Email都很容易 xff0c 但是Internet的邮件系统是通过几个复杂的部分连接而成的 xff0c 对于最终用户而言 xff0c 我们熟悉的Outlook
  • ROS导航小车经验总结

    经验教训 QS1 rviz地图与gazebo不同步 详细描述 工作空间 xff1a 仿真项目 文件位置 course03 启动urdf gazebo launch union launch xff08 模型启动文件 和 gazebo环境 x
  • 使用libcurl发送post请求

    C语言代码如下 xff1a include lt stdio h gt include lt string h gt include lt curl curl h gt int main int argc char argv CURL cu
  • 访问带有用户名、密码的URL

    很简单 xff0c 举例如下 xff1a HttpURLConnection urlConnection 61 HttpURLConnection url span class hljs preprocessor openConnectio
  • ROS下驱动双雷达

    ROS下驱动SLAMETC的A2和A3雷达步骤如下 xff1a 1 连上激光雷达并进入至 dev文件夹中查看ttyUSB xff1f 的编号 2 使用sudo chmod 777 ttyUSB 来更改USB端口权限 3 调整A2和A3激光雷
  • Usart 串口发送数据包 两种方式(遍历结构体,指针数组)

    Usart 串口发送数据包 两种方式 xff08 结构体 xff0c 指针数组 xff09 1 结构体指针 1 1 结构体和联合体 叙述 xff1a 这种直观性比较 xff0c 利用联合体和结构体的形式组成数据包 xff0c 通过结构体指针
  • netfilter 讲解 ,讲的很好

    Netfilter为多种网络协议 xff08 IPv4 IPv6 ARP等 xff09 各提供了一套钩子函数 在IPv4中定义了5个钩子函数 xff0c 这些钩子函数在数据包流经协议栈的5个关键点被调用 这就像有5个钓鱼台 xff0c 在每