linux拦截raw_socket原始套接字数据包的网络数据拦截方法

前言

最近一直在寻找能拦截linux原始套接字数据包的方法,煞费苦心,终于功夫不负有心人,找到了一种方法可以实现,将这种方法分享给大家。

一、环境介绍

本次试验是基于CentOS7.6.1810,内核版本为3.10.0.957.el7.x86_64。

二、能够拦截linux网络数据的其他方法

先说一下我做这个试验时寻找的一些方法,也许其他方法也是可以实现的。

1、netfilter框架

这个框架的拦截发生在网络层,如果不考虑原始套接字的情况,是推荐使用这种方法的。这个框架网上的资源挺多的,有兴趣的可以自己去查。

2、iptables 防火墙

这个linux自带的防火墙功能的拦截也是发生在网络层,不能拦截链路层的原始套接字数据包。

3、BPF/eBPF框架

伯克利包过滤器,是一种基于伪汇编的底层数据包过滤器,他可以根据配置的规则过滤数据包,但好像不能对数据包做修改。我也不太清楚这种方法,这里就放一个链接(eBPF用于Linux防火墙数据包过滤https://blog.csdn.net/dog250/article/details/102884567),自己去研究吧。

4、ebtables强制原始套接字数据包通过iptables

这种方法需要网卡的连接方法为桥接模式。这里也只放个链接(http://ebtables.netfilter.org/br_fw_ia/br_fw_ia.html

5、LSM安全模块框架

一种内核挂钩的方法,LSM安全模块是linux内核开发时就事先在内核关键路径上设置了挂钩函数,通过这些函数去进行函数调用执行的权限管理,理论上是可以设置我们的hook函数进行拦截的,但我没有测试成功。

三、ftrace框架

这才是这篇文章的重点,ftrace框架。

1、ftrace框架介绍

看这篇文章吧,他解释的更好。简单来说就是ftrace是hook内核函数的方法,他本身的作用是用于跟踪和调试内核,但后来被用来拦截网络数据包了。
https://www.apriorit.com/dev-blog/546-hooking-linux-functions-2

2、源代码下载

这是githup上找到的,分享给大家,对照源代码去看上一个链接的文章说明,更容易明白。
https://github.com/ilammy/ftrace-hook.git

3、hook网络发送的函数

要想拦截所有网络数据包,就得在“总路口”进行拦截。下图是linux网络发送的部分过程图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
再查看内核发现,dev_queue_xmit函数是一个中间函数,所有最佳拦截就是dev_queue_xmit函数。在源代码的基础上加入我们的函数,这样就可以在自己的hook函数中做相应的逻辑处理 了。代码添加如下:

static asmlinkage int (*real_dev_queue_xmit)(struct sk_buff *skb);
static asmlinkage int fh_dev_queue_xmit(struct sk_buff *skb)
{
	long ret;
	pr_info("before fh dev queue xmit\n");
	//这里做逻辑判断,自己的处理函数调用挂载
	ret = real_dev_queue_xmit(skb);
	pr_info("after fh dev queue xmit\n");
	return ret;
}
static struct ftrace_hook demo_hooks[] = {
	//第一条是我们加进去的要hook的函数
	HOOK("dev_queue_xmit", fh_dev_queue_xmit, &real_dev_queue_xmit),
	HOOK("sys_clone",  fh_sys_clone,  &real_sys_clone),
	HOOK("sys_execve", fh_sys_execve, &real_sys_execve),
};
4、编译遇到的问题

如果编译不过,尝试修改图中的宏定义为1。
在这里插入图片描述

5、内核调试

内核调试时是不能直接打印调试信息的,需要用dmesg命令参看内核日志,就可以看到dev_queue_xmit函数被拦截。

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Java 微信客服接口开发中,如果需要在会话接入之前拦截数据,可以使用拦截器(Interceptor)来实现。 拦截器是一种常见的设计模式,它可以在请求到达目标之前或之后执行一些通用的业务逻辑,比如验证用户权限、记录日志等。在 Spring 框架中,拦截器是通过实现 HandlerInterceptor 接口来定义的。 要拦截微信客服接口的请求,可以创建一个实现了 HandlerInterceptor 接口的拦截器类,然后在 Spring 配置文件中配置该拦截器。下面是一个示例: ```java public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在会话接入之前拦截数据 // TODO: 实现拦截逻辑 return true; // 放行请求 } // 省略其他方法 } ``` 在上面的代码中,我们实现了 preHandle 方法,该方法会在请求到达目标之前被调用。在该方法中可以实现自定义的拦截逻辑,比如判断请求是否合法、记录请求日志等。如果希望放行该请求,可以返回 true;否则返回 false。 然后,在 Spring 配置文件中配置该拦截器: ```xml <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/wx/custom/*"/> <bean class="com.example.MyInterceptor" /> </mvc:interceptor> </mvc:interceptors> ``` 在上面的配置中,我们将拦截路径设置为 /wx/custom/*,表示拦截所有以 /wx/custom/ 开头的请求。然后将 MyInterceptor 类作为拦截器类配置到拦截器中即可。 通过上述方式,我们就可以实现在微信客服接口会话接入之前拦截数据的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值