- 論壇徽章:
- 0
|
本帖最后由 ierent168 于 2014-06-15 22:22 編輯
我現(xiàn)在總體的思路是這樣的,建立eth0與eth1的透明橋,然后通過netfilter將透明橋上的數(shù)據(jù)包發(fā)給第三個端口進(jìn)行監(jiān)控。現(xiàn)在主要的問題是,如下面程序紅色部分所示,在鉤子函數(shù)中我用return NF_ACCEPT;這樣就會產(chǎn)生死機(jī),也根據(jù)前人資料加了 dev_put(dev);但是還是死機(jī)。但是我要是用return NF_STOLEN,就不會死機(jī)了,但是這樣的話就無法實現(xiàn)透明橋功能了,也就是eth0發(fā)送的數(shù)據(jù)包,在eth1端口沒有了。請問 這樣如何是好,用return NF_ACCEPT 為什么會死機(jī) ,該如何修改呢?
#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強(qiáng)制轉(zhuǎn)換成ip結(jié)構(gòu)體型
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;//發(fā)給別人的幀(監(jiān)聽模式時會有這種幀)
skb->dev = dev;
skb_push(skb, ETHALEN);//將skb->data指向l2層,之后將數(shù)據(jù)包通過dev_queue_xmit()發(fā)出
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把該函數(shù)放在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); |
|