热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

OpenWrt内核模块开发(六)通过linuxnetfilter框架实现mac地址过滤

文章目录mac_filter功能简介网络接口层(MAC)netfilter注册钩子函数mac过滤钩子函数分析编译运行测试结果作者简介源码和文档mac_filter功能简介通过内核模




文章目录


    • mac_filter
    • 功能简介
    • 网络接口层(MAC)
    • netfilter注册钩子函数
    • mac过滤钩子函数分析
    • 编译运行
    • 测试结果
    • 作者简介
    • 源码和文档


mac_filter


功能简介

通过内核模块的方式向netfilter框架注册钩子函数,由于mac在ip层以下,常规的做法是在二层设备进行mac地址过滤的(比如交换机),这里我们在ip层分析mac层数据,达到过滤效果。


网络接口层(MAC)

网络接口层在发送端将上层的IP数据报封装成帧后发送到网络上;数据帧通过网络到达接收端时,该结点的网络接口层对数据帧拆封,并检查帧中包含的MAC地址。如果该地址就是本机的MAC地址或者是广播地址,则上传到网络层,否则丢弃该帧。

简单点讲就是mac层,通常我们称之为二层,比如交换机就属于二层设备,而路由器属于三层设备(ip路由)。


netfilter注册钩子函数

这里我们将hooknum设置为NF_INET_FORWARD

static struct nf_hook_ops mac_filter_ops[] __read_mostly = {
{
.hook = mac_filter_hook,
.pf = PF_INET,
.hooknum = NF_INET_FORWARD,
.priority = NF_IP_PRI_FILTER + 1,
},
};
static int __init mac_filter_init(void)
{
printk("mac filter....init\n");
nf_register_net_hooks(&init_net, mac_filter_ops, ARRAY_SIZE(mac_filter_ops));
return 0;
}

mac过滤钩子函数分析

源码

static u_int32_t mac_filter_hook(void *priv, struct sk_buff *skb, const struct nf_hook_state *state)
{
u_int8_t smac[ETH_ALEN] = {0};
struct ethhdr *ethhdr = NULL;
u_int8_t filter_mac_buf[32] = "00:0C:29:F1:34:8F";
u_int8_t mac_buf[32] = {0};
ethhdr = eth_hdr(skb);
if (!ethhdr)
{
return NF_ACCEPT;
}
memcpy(smac, ethhdr->h_source, ETH_ALEN);
if (!skb->dev){
return NF_ACCEPT;
}
printk("dev=%s, source mac = %02X:%02X:%02X:%02X:%02X:%02X\n",
skb->dev->name, smac[0], smac[1], smac[2], smac[3], smac[4], smac[5]);
if (0== memcmp(skb->dev->name, "br", 2)){
sprintf(mac_buf, "%02X:%02X:%02X:%02X:%02X:%02X", smac[0], smac[1], smac[2], smac[3], smac[4], smac[5]);
if (0 == strcmp(mac_buf, filter_mac_buf)){
printk("----drop dev=%s, source mac = %02X:%02X:%02X:%02X:%02X:%02X\n",
skb->dev->name, smac[0], smac[1], smac[2], smac[3], smac[4], smac[5]);
return NF_DROP;
}
}
return NF_ACCEPT;
}

分析


  • 获取以太网头部信息ethhdr
    虽然netfilter hook已经处于ip层,但skb保存了所有头部信息,可以通过指针偏移获取到以太网头部,从而获取到源mac地址
  • 判断数据的方向
    这里只对lan侧设备mac地址进行匹配,也就是从桥接口上来的数据才进行分析

编译运行

参考前面章节

insmod mac_filter.ko

测试结果

root@OpenWrt:/fros# insmod mac_filter.ko
root@OpenWrt:/fros# <4>[38235.271118] mac filter....init
root@OpenWrt:/fros# <4>[38241.873151] dev=br-lan, source mac = 00:0C:29:F1:34:8F
<4>[38241.876006] ----drop dev=br-lan, source mac = 00:0C:29:F1:34:8F
<4>[38242.896581] dev=br-lan, source mac = 00:0C:29:F1:34:8F
<4>[38242.899173] ----drop dev=br-lan, source mac = 00:0C:29:F1:34:8F
<4>[38245.374032] dev=br-lan, source mac = 00:0C:29:F1:34:8F
<4>[38245.376519] ----drop dev=br-lan, source mac = 00:0C:29:F1:34:8F
<4>[38246.978437] dev=br-lan, source mac = 00:0C:29:F1:34:8F
<4>[38246.979705] ----drop dev=br-lan, source mac = 00:0C:29:F1:34:8F
<4>[38248.264021] dev=br-lan, source mac = 00:0C:29:F1:34:8F
<4>[38248.265541] ----drop dev=br-lan, source mac = 00:0C:29:F1:34:8F
<4>[38249.425204] dev=br-lan, source mac = 00:0C:29:F1:34:8F
<4>[38249.426521] ----drop dev=br-lan, source mac = 00:0C:29:F1:34:8F
<4>[38250.592095] dev=br-lan, source mac = 00:0C:29:F1:34:8F
<4>[38250.593375] ----drop dev=br-lan, source mac = 00:0C:29:F1:34:8F
<4>[38251.827786] dev=br-lan, source mac = 00:0C:29:F1:34:8F
<4>[38251.829108] ----drop dev=br-lan, source mac = 00:0C:29:F1:34:8F
<4>[38252.874176] dev=br-lan, source mac = 00:0C:29:F1:34:8F
<4>[38252.876592] ----drop dev=br-lan, source mac = 00:0C:29:F1:34:8F
<4>[38253.905311] dev=br-lan, source mac = 00:0C:29:F1:34:8F

作者简介

OpenWrt应用过滤插件作者(应用过滤用于控制app联网,可以过滤游戏、视频、聊天等几百款app)
从事嵌入式Linux开发近10年,主要负责路由器网通产品研发,精通OpenWrt系统,包括luci、消息机制、内核模块等。擅长模块:路由器上网行为管理、智能流控、上网认证、防火墙、虚拟服务器、多wan负载均衡等

开源作品地址:
https://github.com/destan19/OpenAppFilter


源码和文档

关注微信公众号可以获取更多技术文档、固件、源码等
微信扫码关注:



推荐阅读
  • 本文详细介绍了虚拟专用网(Virtual Private Network, VPN)的概念及其通过公共网络(如互联网)构建临时且安全连接的技术特点。文章探讨了不同类型的隧道协议,包括第二层和第三层隧道协议,并提供了针对IPSec、GRE以及MPLS VPN的具体配置指导。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • 本文详细介绍了如何在云服务器上配置Nginx、Tomcat、JDK和MySQL。涵盖从下载、安装到配置的完整步骤,帮助读者快速搭建Java Web开发环境。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • CentOS 7.6环境下Prometheus与Grafana的集成部署指南
    本文旨在提供一套详细的步骤,指导读者如何在CentOS 7.6操作系统上成功安装和配置Prometheus 2.17.1及Grafana 6.7.2-1,实现高效的数据监控与可视化。 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • 本文介绍如何配置SecureCRT以正确显示Linux终端的颜色,并解决中文显示问题。通过简单的步骤设置,可以显著提升使用体验。 ... [详细]
  • 本文深入探讨了MAC地址与IP地址绑定策略在网络安全中的应用及其潜在风险,同时提供了针对该策略的破解方法和相应的防御措施。 ... [详细]
  • 本文介绍如何在Linux系统中卸载预装的OpenJDK,安装指定版本的JDK 1.8,并配置防火墙以确保系统安全性和软件兼容性。 ... [详细]
  • 在Java应用程序开发过程中,FTP协议被广泛用于文件的上传和下载操作。本文通过Jakarta Commons Net库中的FTPClient类,详细介绍如何实现文件的上传和下载功能。 ... [详细]
  • 本文将详细探讨 Linux 系统中的 netstat 命令,该命令用于查看网络状态和连接情况。通过了解 IP 地址和端口的基本概念,我们将更好地理解如何利用 netstat 命令来监控和管理网络服务。 ... [详细]
author-avatar
mobiledu2502877277
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有