// 内核调用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。Powered by ddoss.cn 12.0
©2015 - 2025 ddoss
渝公网安备50011302222260号
渝ICP备2024035333号
【实验平台安全承诺书】
小绿叶技术社区,优化网络中,点击查看配置信息
主机监控系统: 安全防火墙已开启检查cc攻击-下载文件完成后等待10s 恢复访问,检查连接数低于峰值恢复访问
您的IP:216.73.216.110,2025-12-01 13:42:13,Processed in 0.01238 second(s).