- 论坛徽章:
- 0
|
本帖最后由 ierent168 于 2014-06-15 22:22 编辑
我现在总体的思路是这样的,建立eth0与eth1的透明桥,然后通过netfilter将透明桥上的数据包发给第三个端口进行监控。现在主要的问题是,如下面程序红色部分所示,在钩子函数中我用return NF_ACCEPT;这样就会产生死机,也根据前人资料加了 dev_put(dev);但是还是死机。但是我要是用return NF_STOLEN,就不会死机了,但是这样的话就无法实现透明桥功能了,也就是eth0发送的数据包,在eth1端口没有了。请问 这样如何是好,用return NF_ACCEPT 为什么会死机 ,该如何修改呢?
#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;
}
dev_put(dev);
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); |
|