收藏文章 楼主

内核调用iptables禁止ip访问-c++

版块:C/C++语言开发   类型:普通   作者:小绿叶技术博客   查看:171   回复:0   获赞:0   时间:2025-10-21 22:37:23


// 内核调用iptables禁止ip访问

// 编写内核模块(最底层,效率最高)
// 直接在内核态实现 IP 拦截逻辑,无需用户态程序介入,性能最优,但开发门槛高(需熟悉内核 API 和编译流程)。
// 核心思路:
// 在内核中注册 netfilter 钩子函数(例如在 NF_INET_PRE_ROUTING 阶段,即数据包进入内核后优先处理)。
// 在钩子函数中检查数据包的源 IP 或目标 IP,若匹配黑名单则返回 NF_DROP。
// 简化示例(内核模块代码框架):
// c
// 运行
#include <linux/module.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/ip.h>
#include <linux/in.h>

// 要禁止的 IP(网络字节序,示例为 192.168.1.100)
static __be32 blocked_ip = 0xc0a80164;  // 192.168.1.100 的网络字节序(0xc0=192, 0xa8=168, 0x01=1, 0x64=100)

// 钩子函数:处理数据包
static unsigned int hook_func(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) {
    struct iphdr *ip_header;

    // 检查数据包是否包含 IP 头
    if (!skb) return NF_ACCEPT;
    ip_header = ip_hdr(skb);
    if (!ip_header) return NF_ACCEPT;

    // 仅处理 IPv4
    if (ip_header->version != 4) return NF_ACCEPT;

    // 检查源 IP 是否为被禁止的 IP
    if (ip_header->saddr == blocked_ip) {
        printk(KERN_INFO "内核拦截来自 %pI4 的数据包\n", &ip_header->saddr);
        return NF_DROP;  // 丢弃数据包
    }

    return NF_ACCEPT;  // 允许其他数据包
}

// 定义钩子结构
static struct nf_hook_ops nfho = {
    .hook = hook_func,               // 回调函数
    .hooknum = NF_INET_PRE_ROUTING,  // 钩子点(入站数据包早期阶段)
    .pf = PF_INET,                   // IPv4
    .priority = NF_IP_PRI_FIRST      // 最高优先级
};

// 模块加载函数
static int __init block_ip_init(void) {
    nf_register_net_hook(&init_net, &nfho);  // 注册钩子
    printk(KERN_INFO "block_ip 模块加载成功,禁止 IP: 192.168.1.100\n");
    return 0;
}

// 模块卸载函数
static void __exit block_ip_exit(void) {
    nf_unregister_net_hook(&init_net, &nfho);  // 注销钩子
    printk(KERN_INFO "block_ip 模块卸载成功\n");
}

module_init(block_ip_init);
module_exit(block_ip_exit);
MODULE_LICENSE("GPL");
// 编译与使用:
// 编写 Makefile 编译内核模块(需匹配当前内核版本)。
// 加载模块:sudo insmod block_ip.ko。
// 验证:被禁止的 IP 无法访问本机任何端口和协议。
// 卸载模块:sudo rmmod block_ip。



本文章最后由 admin2025-10-21 22:38 编辑

提供企业建站服务,免费网防系统,提交信息登录 http://yundun.ddoss.cn 邮箱: proposal@ddoss.cn 
回复列表
默认   热门   正序   倒序

回复:内核调用iptables禁止ip访问-c++

头像

用户名:

粉丝数:

签名:

资料 关注 好友 消息