亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 4110 | 回復(fù): 11
打印 上一主題 下一主題

[網(wǎng)絡(luò)子系統(tǒng)] 求版主 指導(dǎo),netfilter發(fā)包總是死機(jī) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2014-06-15 15:11 |只看該作者 |倒序瀏覽
本帖最后由 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);

論壇徽章:
0
2 [報告]
發(fā)表于 2014-06-15 16:15 |只看該作者
有沒有人知道 啊

論壇徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辭舊歲徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亞洲杯之卡塔爾
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08處女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技術(shù)圖書徽章
日期:2014-03-25 09:00:29
3 [報告]
發(fā)表于 2014-06-15 18:10 |只看該作者
呵呵,“本主題需向作者支付 40 可用積分 才能瀏覽”
今天周日,估計沒人

論壇徽章:
0
4 [報告]
發(fā)表于 2014-06-15 22:23 |只看該作者
回復(fù) 3# humjb_1983   失誤 啊 我以為是懸賞的呢


   

論壇徽章:
6
金牛座
日期:2013-10-08 10:19:10技術(shù)圖書徽章
日期:2013-10-14 16:24:09CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:34獅子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亞洲杯之阿聯(lián)酋
日期:2015-05-09 14:36:15
5 [報告]
發(fā)表于 2014-06-16 09:30 |只看該作者
回復(fù) 1# ierent168
用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ī) ,該如何修改呢?


如果你用NF_ACCEPT,那么同一個數(shù)據(jù)包會走兩次netfilter,會被kfree兩次,當(dāng)然會死機(jī)了。

如果你用NF_STOLEN,那么數(shù)據(jù)包就走一次,kfree一次,也就沒有問題了。

既然是監(jiān)控,那么應(yīng)該skb_copy一份數(shù)據(jù)包,將copy的數(shù)據(jù)包重新放到隊列里面,原來的數(shù)據(jù)包返回NF_ACCPET.

   

論壇徽章:
1
摩羯座
日期:2014-05-07 11:21:33
6 [報告]
發(fā)表于 2014-06-16 09:58 |只看該作者
回復(fù) 5# 瀚海書香


    請教版主一個問題,剛才我想到利用tcpdump那樣的原理,但是我看了下代碼為什么它用的是skb_clone而不是skb_copy呢?
在packet_rcv中有
                if (skb_shared(skb)) {
                struct sk_buff *nskb = skb_clone(skb, GFP_ATOMIC);
                if (nskb == NULL)
                        goto drop_n_acct;

                if (skb_head != skb->data) {
                        skb->data = skb_head;
                        skb->len = skb_len;
                }
                kfree_skb(skb);   這里為什么也要free一下呢
                skb = nskb;
        }

.......
__skb_queue_tail(&sk->sk_receive_queue, skb);

按道理也應(yīng)驗用skb_copy呀

論壇徽章:
6
金牛座
日期:2013-10-08 10:19:10技術(shù)圖書徽章
日期:2013-10-14 16:24:09CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:34獅子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亞洲杯之阿聯(lián)酋
日期:2015-05-09 14:36:15
7 [報告]
發(fā)表于 2014-06-16 10:29 |只看該作者
回復(fù) 6# wan3610425
請教版主一個問題,剛才我想到利用tcpdump那樣的原理,但是我看了下代碼為什么它用的是skb_clone而不是skb_copy呢?
在packet_rcv中有
                if (skb_shared(skb)) {
                struct sk_buff *nskb = skb_clone(skb, GFP_ATOMIC);
                if (nskb == NULL)
                        goto drop_n_acct;

                if (skb_head != skb->data) {
                        skb->data = skb_head;
                        skb->len = skb_len;
                }
                kfree_skb(skb);   這里為什么也要free一下呢
                skb = nskb;
        }

.......
__skb_queue_tail(&sk->sk_receive_queue, skb);

按道理也應(yīng)驗用skb_copy呀


第一個問題:為什么用skb_clone不用skb_copy?
    理論上來說,兩個都是可以的。如果skb_clone只是負(fù)責(zé)sk_buff 結(jié)構(gòu)體,skb_copy是sk_buff結(jié)構(gòu)體和data部分。如果后續(xù)操作可能會修改data部分,需要用skb_copy;如果后續(xù)操作不會修改data部分,那么skb_clone就可以了。

第二個問題:為什么packet_rcv中需要kfree一下?
    pakcet_rcv作為一種protocol注冊到ptype_all中。packet_rcv被調(diào)用的路徑如下:   
    netif_receive_skb---->deliver_skb---->packet_rcv

     在deliver_skb中可以看到,內(nèi)核將數(shù)據(jù)包遞交給相應(yīng)的協(xié)議處理函數(shù)是,會調(diào)用atomic_inc(&skb_users),也就是說讓每個協(xié)議處理函數(shù)都handler了各自的數(shù)據(jù)包。那么協(xié)議處理函數(shù)在處理完成后,也要相應(yīng)的atomic_dec(&skb_users),而kfree_skb其實就是atomic_dec的一個封裝函數(shù)罷了。


   

論壇徽章:
0
8 [報告]
發(fā)表于 2014-06-16 21:26 |只看該作者
回復(fù) 5# 瀚海書香


    我用這個試過,skb_clone,還是不行,倒是不死機(jī)了,但是透明橋的另外一端還是沒有數(shù)據(jù),而且我現(xiàn)在出現(xiàn)了很奇怪的問題,假設(shè)A、B端口分別為透明橋的兩端口,C端口設(shè)為監(jiān)控端口:假如用anysend構(gòu)造數(shù)據(jù)包在A端口發(fā)包,如果構(gòu)造的數(shù)據(jù)包的目的MAC地址與要發(fā)往A端口的MAC地址相同,則透明橋另外一端口(B端口)就收不到數(shù)據(jù)包了,C端口可以收到數(shù)據(jù)包,但是如果構(gòu)造的數(shù)據(jù)包的目的MAC地址與要發(fā)往A端口的MAC地址不相同,這B端口可以收到數(shù)據(jù)包,但是C端口也就是監(jiān)控端口就收不到了。而且 我測試得出的結(jié)論是在netfilter我定義的鉤子函數(shù)運(yùn)行之前,內(nèi)核會對數(shù)據(jù)包做一個驗證,如果這個包的目的MAC地址事實不符合,那么就不會進(jìn)入鉤子函數(shù)執(zhí)行,我測序打印就是這樣的。但是不知道為什么 ,應(yīng)該如何弄,原因的話 我 推測  就是在PRE_ROUTING進(jìn)入鉤子函數(shù)之前,內(nèi)核會過濾,不知道有沒有人知道是不是這么回事呢?

論壇徽章:
36
IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-10 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-16 06:20:0015-16賽季CBA聯(lián)賽之廣東
日期:2016-04-16 19:59:32IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-19 06:20:00每日論壇發(fā)貼之星
日期:2016-04-19 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-25 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-06 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-08 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-13 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-28 06:20:00每日論壇發(fā)貼之星
日期:2016-05-28 06:20:00
9 [報告]
發(fā)表于 2014-06-16 23:34 |只看該作者
回復(fù) 8# ierent168

返回 NF_STOLEN,且不調(diào)用 kfree_skb 仍然掛掉么


   

論壇徽章:
0
10 [報告]
發(fā)表于 2014-06-17 20:36 |只看該作者
回復(fù) 9# Godbach 不會的 ,要復(fù)制一個 才可以 ACCEPT呢



   
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP