NF_IP_LOCAL_IN NF_IP_LOCAL_OUT

下面主要是通过上面接收的hook注册函数,实现向内核中相应的hook点注册hook回调函数,结合icmp数据包的格式,实现对icmp数据包的处理。

 

icmp_reply_filter.c

主要是数据接收方向的NF_IP_LOCAL_IN点注册回调函数,该回调函数对接收到的icmp reply报文,将序列号是9的倍数的reply报文丢弃掉

#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/types.h>

#include <linux/fs.h>

#include <linux/ioctl.h>

#include <linux/version.h>

#include <linux/skbuff.h>

#include <linux/netfilter.h>

#include <linux/netfilter_ipv4.h>

#include <linux/moduleparam.h>

#include <linux/netfilter_ipv4/ip_tables.h>

#include <linux/icmp.h>

#include <net/ip.h>

 

static unsigned int

icmp_reply_hook_func(unsigned int hook,

 struct sk_buff **skb,

 const struct net_device *in,

 const struct net_device *out,

 int (*okfn)(struct sk_buff *))

     

{

const struct iphdr *iph;

struct icmphdr *icmph;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:在使用netfilter框架中,在NF_IP_FORWARD点做钩子,并将钩到的包从指定的物理接口发出去的实现方法如下: 1. 首先,需要重新修改路由。可以使用以下代码来设置新的路由: skb_dst_drop(skb); skb_dst_set(skb, &newroute->dst); 这里的newroute是一个包含新路由信息的结构体。 2. 接下来,可以使用NF_HOOK函数来将包发送到指定的物理接口: NF_HOOK(NFPROTO_IPV4, NF_INET_LOCAL_OUT, skb, NULL, skb_dst(skb)->dev, dst_output); 这里的skb是要发送的包,skb_dst(skb)->dev是指定的物理接口。 引用\[2\]:在netfilter框架中,对于输入报文处理或输出报文处理,如果命中了路由缓存条目,则会累积该路由缓存条目的引用计数和全局命中统计,并将路由缓存条目的核心内容赋给报文skb的_skb_dst字段。这个核心内容是rtable下的dst_entry,其中包含了出接口、邻居节点、下一步的处理函数等信息。通过修改skb的_skb_dst字段,可以实现从指定的物理接口出来。 引用\[3\]:在以太网帧的报文头格式中,最后两个字节表示以太网的类型。当这两个字节小于0x600时,表示该帧不是Ethernet II格式,而是802.2 LLC格式或其他格式。在OpenFlow和Open vSwitch中,只支持IEEE 802.3 SNAP格式的LLC头,即DSAP=0xaa、SSAP=0xaa、cntl=0x03,后面跟着一个5个字节大小的SNAP。当插入802.1Q头或在802.3 SNAP格式中插入802.1Q头时,eth_type/dl_type取自Ethertype字段。如果报文头不满足上述格式,OVS和OpenFlow会将eth_type/dl_type设为0x5ff(OFP_DL_TYPE_NOT_ETH_TYPE)。 综上所述,要实现在NF_IP_FORWARD点钩子中将钩到的包从指定的物理接口发出去,可以通过重新修改路由和设置skb的_skb_dst字段来实现。同时,需要注意报文的以太网帧格式和类型。 #### 引用[.reference_title] - *1* *2* [skb_dst_set - struct dst_entry dst 路由子系统使用。](https://blog.csdn.net/tycoon1988/article/details/45487343)[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^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Open vSwitch ETHERNET相关字段详解(eth_src/dl_src、eth_dst/dl_dst、eth_type/dl_type)](https://blog.csdn.net/u012124304/article/details/103227684)[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^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值