免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3539 | 回复: 3
打印 上一主题 下一主题

[内核入门] 自己写了一个netfilter中钩子函数 实现一个数据包转发功能,大神能看看有什么问题吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-10 22:54 |只看该作者 |倒序浏览
自己写了一个netfilter中钩子函数 实现一个数据包转发功能,大神能看看有什么问题吗?
主要想实现的功能就是在一个端口 用钩子函数接受到数据包,然后再另外一个端口将数据
包发送出去。这里不需要过滤数据包,就是只要把接受到的数据链路层的数据报从另外一个端口发出去就好了。


#include <linux/init.h>
#include <linux/module.h>
#include <linux/netfilter.h>
#include <linux/socket.h>/*PF_INET*/
#include <linux/netfilter_ipv4.h>/*NF_IP_PRE_FIRST*/
#include <linux/skbuff.h>
#include <linux/netdevice.h>
#include <linux/inet.h> /*in_aton()*/
#include <net/ip.h>
#include <net/tcp.h>
#include <linux/netfilter_ipv4/ip_tables.h>
#include <linux/moduleparam.h>

#define ETHALEN 14

MODULE_LICENSE("GPL");
MODULE_AUTHOR("lyh");
struct nf_hook_ops nfho;
unsigned int myhook_func(unsigned int hooknum,
                        struct sk_buff *__skb,
                        const struct net_device *in,
                        const struct net_device *out,
                        int (*okfn)(struct sk_buff *))
{
    struct sk_buff *skb;
    struct net_device *dev;
    struct iphdr *iph;
    int ret,tot_len;
    skb = __skb;
    if(skb == NULL)
        return NF_ACCEPT;
    iph = ip_hdr(skb);//将skb强制转换成ip结构体型
    if(iph == NULL)
        return NF_ACCEPT;
    tot_len = ntohs(iph->tot_len);
        dev = dev_get_by_name(&init_net,"eth8");
        skb->pkt_type = PACKET_OTHERHOST;//发给别人的帧(监听模式时会有这种帧)
        skb->dev = dev;
        skb_push(skb, ETHALEN);//将skb->data指向l2层,之后将数据包通过dev_queue_xmit()发出
        ret = dev_queue_xmit(skb);
        if(ret < 0)
                {
                    printk("dev_queue_xmit() error\n");
                    goto out;
                }
   
    return NF_ACCEPT;
out:
    dev_put(dev);
    //free(skb);
    return NF_DROP;
}


static struct nf_hook_ops nfho={
        .hook           = myhook_func,
        .owner          = THIS_MODULE,
        .pf             = PF_INET,
        .hooknum        = NF_IP_PRE_ROUTING,
        .priority       = NF_IP_PRI_FIRST,
};

static int __init myhook_init(void)//__init,表示告诉gcc把该函数放在init这个section;
{
        int ret;
    ret = nf_register_hook(&nfho);
        if(ret < 0)
        {
            printk("%s\n", "can't modify skb hook!");
            return ret;
        }
    return ret;
}
static void myhook_fini(void)
{
    nf_unregister_hook(&nfho);
}
module_init(myhook_init);
module_exit(myhook_fini);


论坛徽章:
0
2 [报告]
发表于 2014-06-11 22:15 |只看该作者
求指导 没有人知道吗

论坛徽章:
1
摩羯座
日期:2014-05-07 11:21:33
3 [报告]
发表于 2014-06-12 09:01 |只看该作者
可以查查dev_queue_xmit的使用, 修改mac地址,指定mac头部和网络层头部指针。 NF_ACCEPT少了dev_put(dev)

论坛徽章:
0
4 [报告]
发表于 2014-06-13 21:38 |只看该作者
回复 3# wan3610425
 NF_ACCEPT的运行的话 运行一会 就死机了,然后我改成 NF_STOLEN 的话 就不会死机但是,我要实现的功能是钩子函数 勾到以后,原来数据包还需要继续传播,NF_STOLEN的话就不会传播,现在搞不明白 NF_ACCEPT 为什么会死机,而且运行时候会产生很大的数据

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP