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

  免費注冊 查看新帖 |

Chinaunix

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

[內核模塊] 【求助】利用netfilter進行網(wǎng)絡數(shù)據(jù)加密的問題 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2014-07-15 23:39 |只看該作者 |倒序瀏覽
本帖最后由 zhengli85 于 2014-07-16 01:46 編輯

在CentOS 5.6 x86_64中利用Netfilter對TCP、UDP數(shù)據(jù)進行加密,但出現(xiàn)一點問題,還請各位幫忙看一下:

一、問題描述
1、該代碼在5.2 i386環(huán)境下是正常的,所以不知道是不是64位的問題;
2、流入的數(shù)據(jù)能夠正常識別并解密,但是流出的數(shù)據(jù)出現(xiàn)問題,打印輸出后發(fā)現(xiàn)從skb獲取的數(shù)據(jù)指向并不是真正需要數(shù)據(jù)

二、系統(tǒng)環(huán)境
[root@localhost ~]# lsb_release -a
LSB Version:    :core-4.0-amd64:core-4.0-ia32:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-ia32:graphics-4.0-noarch:printing-4.0-

amd64:printing-4.0-ia32:printing-4.0-noarch
Distributor ID: CentOS
Description:    CentOS release 5.6 (Final)
Release:        5.6
Codename:       Final

[root@localhost ~]# uname -a
Linux localhost.local5.6 2.6.18-238.el5 #1 SMP Thu Jan 13 15:51:15 EST 2011 x86_64 x86_64 x86_64 GNU/Linux

三、問題代碼
/*******************************************************************************************************
*根據(jù)sk_buff、加密類型、數(shù)據(jù)方向進行加密
*******************************************************************************************************/
static void crypt_ip_data_skb(struct sk_buff *skb,unsigned int crypt_type,int watch_flag)
{
        char  *        data=NULL;       
        unsigned short data_len=0;
        __u8        protocol_type=0;
        struct tcphdr *tcphead=NULL;
        struct udphdr *udphead=NULL;

        int         ip_head_len=0;
        int        tcp_udp_len=0;

#ifdef DEBUG_MODE
        printk(KERN_EMERG"crypt_ip_data_skb\tcrypt_type:%d\twatch_flag:%d\n",crypt_type,watch_flag);
#endif

        if (!skb )return;
        if (!(skb->nh.iph)) return;

        protocol_type=skb->nh.iph->protocol;
        ip_head_len=(skb->nh.iph->ihl * 4);

        switch(protocol_type)
        {
                case        IPPROTO_TCP:
                {
                        tcphead= (struct tcphdr *)(skb->data  + ip_head_len);
                        tcp_udp_len=tcphead->doff*4;
                        data=(unsigned char *)tcphead+tcp_udp_len;
                        data_len=ntohs(skb->nh.iph->tot_len)-ip_head_len-tcp_udp_len;
                        break;
                }
                case        IPPROTO_UDP:
                {
                        udphead= (struct udphdr *)(skb->data  + ip_head_len);       
                        data=(unsigned char *)udphead+8;//sizeof(udphdr)=8
                        data_len=ntohs(udphead->len)-8;
                        break;
                }
                default:
                {
                        return ;
                }
        }

        //根據(jù)數(shù)據(jù)方向進行加減密
        if(watch_flag==fliter_watch_in)
        {
        #ifdef DEBUG_MODE
                printk(KERN_EMERG"fliter_watch_in\tdata:0x%08x\n",(int)data);
        #endif
                decrypt_data_raw(data,data_len,crypt_type);
        }

        if(watch_flag==fliter_watch_out)
        {

        #ifdef DEBUG_MODE
                printk(KERN_EMERG"fliter_watch_out\tdata:0x%08x\n",(int)data);
        #endif

        #ifdef DEBUG_MODE
                printk(KERN_EMERG"%02x%02x%02x%02x\n",data[0],data[1],data[2],data[3]);
        #endif       

                encrypt_data_raw(data,data_len,crypt_type);

        #ifdef DEBUG_MODE
                printk(KERN_EMERG"%02x%02x%02x%02x\n",data[0],data[1],data[2],data[3]);
        #endif
       
        }

        return;
}

四、hook點

   pre_hook.hook     = watch_in;
   pre_hook.pf       = PF_INET;
   pre_hook.priority = NF_IP_PRI_LAST;
   pre_hook.hooknum  = NF_IP_LOCAL_IN;
   
   post_hook.hook     = watch_out;
   post_hook.pf       = PF_INET;
   post_hook.priority = NF_IP_PRI_LAST;
   post_hook.hooknum  = NF_IP_LOCAL_OUT;
   
   nf_register_hook(&pre_hook);
   nf_register_hook(&post_hook);

論壇徽章:
0
2 [報告]
發(fā)表于 2014-07-16 01:43 |只看該作者
本帖最后由 zhengli85 于 2014-07-16 01:45 編輯

對代碼部分代碼更改如下,進行數(shù)據(jù)輸出顯示,發(fā)現(xiàn):
1、在5.2 i386下,通過sk_buff的data字段進行數(shù)據(jù)獲取,根據(jù)ip頭+tcp/udp頭+傳輸數(shù)據(jù)的組包方式可獲取傳輸數(shù)據(jù)
2、在5.6  x86_64下,通過sk_buff的data字段進行數(shù)據(jù)獲取,數(shù)據(jù)只有ip頭+tcp/udp頭,傳輸數(shù)據(jù)沒有緊跟其后,因此根據(jù)ip頭+tcp/udp頭+傳輸數(shù)據(jù)的組包方式無法正確獲取傳輸數(shù)據(jù),因此造成加密不正常
3、5.2 i386下的內核版本是
[root@localhost kernel]# uname -a
Linux localhost.localdomain 2.6.18-92.el5xen #1 SMP Tue Apr 29 13:45:57 EDT 2008 i686 i686 i386 GNU/Linux
4、初步懷疑是由于內核版本升級,sk_buff結構組織變化導致


        if(watch_flag==fliter_watch_out)
        {
        //#ifdef DEBUG_MODE
                printk(KERN_EMERG"fliter_watch_out\n");
                printk(KERN_EMERG"data:0x%08x\n",data);
                printk(KERN_EMERG"skb_head:0x%08x\tskb_data:0x%08x\tskb_tail:0x%08x\tskb_end:0x%08x\n",skb->head,skb->data,skb->tail,skb->end);

                for(i=0;i<30;i++)//取30這個數(shù),純粹是跟測試數(shù)據(jù)相關,由于調試用的
                {
                        printk(KERN_EMERG"skb_data:%02x%02x%02x%02x\n",skb->data[i*4],skb->data[i*4+1],skb->data[i*4+2],skb->data[i*4+3]);
                }
        //#endif               

                //encrypt_data_raw(data,data_len,crypt_type);
        }

論壇徽章:
0
3 [報告]
發(fā)表于 2014-07-16 02:01 |只看該作者
同一通信過程:
IP頭:20字節(jié)
TCP頭:32字節(jié)
數(shù)據(jù):13字節(jié)

輸出sk_buff的幾個字段進行驗證
unsigned char                *head,
                        *data,
                        *tail,
                        *end

1、5.2 i386下
skb_head:0xeb7edc00     skb_data:0xeb7edccc     skb_tail:0xeb7edd0d     skb_end:0xeb7ede00
skb_data+20+32+13=skb_tail

ip頭+tcp/udp頭+傳輸數(shù)據(jù)

2、在5.6  x86_64下
skb_head:0x12b21000     skb_data:0x12b210cc     skb_tail:0x12b21100     skb_end:0x12b21100
skb_data+20+32=skb_tail

ip頭+tcp/udp頭

論壇徽章:
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技術圖書徽章
日期:2014-03-25 09:00:29
4 [報告]
發(fā)表于 2014-07-16 12:41 |只看該作者
請看看end之后是否放了你的數(shù)據(jù)?
如果使用了sg,那么數(shù)據(jù)是放在skb_shared_info中的。
另外,對于包頭或相關數(shù)據(jù)的解析,建議使用內核提供的標準接口,新版本中32和64位中skb中的數(shù)據(jù)解析是不一樣的。

論壇徽章:
0
5 [報告]
發(fā)表于 2014-07-16 15:35 |只看該作者
回復 4# humjb_1983


多謝您的提示與建議
見笑了,對Linux不熟悉,只是做個應急的東西,參考網(wǎng)上的文章依葫蘆畫瓢寫的。

1、關于“請看看end之后是否放了你的數(shù)據(jù)?”

在測試里,多打印了一部分end之后的數(shù)據(jù),并未發(fā)現(xiàn)有我的數(shù)據(jù)。


2、關于“如果使用了sg,那么數(shù)據(jù)是放在skb_shared_info中的!

正在看skb_shared_info的信息,請問是否使用sg是如何判斷的?


3、關于“另外,對于包頭或相關數(shù)據(jù)的解析,建議使用內核提供的標準接口,新版本中32和64位中skb中的數(shù)據(jù)解析是不一樣的!

一開始做,以為網(wǎng)絡數(shù)據(jù)是標準的,就按協(xié)議自己解析了,在5.2 i386里沒發(fā)現(xiàn)問題,也就沒改動,解決上述問題后一并再修改。

論壇徽章:
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技術圖書徽章
日期:2014-03-25 09:00:29
6 [報告]
發(fā)表于 2014-07-16 16:24 |只看該作者
zhengli85 發(fā)表于 2014-07-16 15:35
回復 4# humjb_1983

ethtool -k ethx
可以看到指定網(wǎng)卡是否開啟了sg。

論壇徽章:
0
7 [報告]
發(fā)表于 2014-07-16 16:43 |只看該作者
回復 6# humjb_1983

這是沒有開啟sg選項吧?
[root@localhost ~]# ethtool -k ethxOffload parameters for ethx:
Cannot get device rx csum settings: No such device
Cannot get device tx csum settings: No such device
Cannot get device scatter-gather settings: No such device
Cannot get device tcp segmentation offload settings: No such device
Cannot get device udp large send offload settings: No such device
Cannot get device generic segmentation offload settings: No such device
Cannot get device GRO settings: No such device
no offload info available


論壇徽章:
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技術圖書徽章
日期:2014-03-25 09:00:29
8 [報告]
發(fā)表于 2014-07-16 17:57 |只看該作者
呵呵,要把ethx換成實際的網(wǎng)卡名,比如eth0

論壇徽章:
0
9 [報告]
發(fā)表于 2014-07-16 21:30 |只看該作者
回復 8# humjb_1983


   呵呵
[root@localhost ~]# ethtool -k eth0
Offload parameters for eth0:
Cannot get device udp large send offload settings: Operation not supported
rx-checksumming: on
tx-checksumming: on
scatter-gather: on
tcp segmentation offload: on
udp fragmentation offload: off
generic segmentation offload: off
generic-receive-offload: off


論壇徽章:
0
10 [報告]
發(fā)表于 2014-07-17 11:45 |只看該作者
本帖最后由 zhengli85 于 2014-07-21 21:04 編輯

回復 4# humjb_1983


   多謝指教,通過skb_shared_info確實能夠獲取數(shù)據(jù)部分===================================================================================

        printk(KERN_EMERG"the skb have fragment counts:%d\n",skb_shinfo(skb)->nr_frags);
        if(skb_shinfo(skb)->nr_frags>0)//本skb中其他頁中的數(shù)據(jù)部分
        {
                printk(KERN_EMERG"skb_shinfo(skb)->nr_frags>0\n" ) ;
                for(i=0;i< skb_shinfo(skb)->nr_frags;i++)
                {
                        printk(KERN_EMERG"the skb frags[%d] page_offset is:%d\n",i,skb_shinfo(skb)->frags[ i ].page_offset);
                        printk(KERN_EMERG"the skb frags[%d] size is:%d\n",i,skb_shinfo(skb)->frags[ i ].size);
                        vaddr=kmap_skb_frag(&skb_shinfo(skb)->frags);
                        print_data_raw(vaddr + skb_shinfo(skb)->frags[ i ].page_offset,skb_shinfo(skb)->frags[ i ].size);//自己的二進制輸出函數(shù)
                }
       }

        if(skb_shinfo(skb)->frag_list)//其他碎片skb中的數(shù)據(jù)部分
                printk(KERN_EMERG"the skb have frag list\n" ) ;


===================================================================================

另:用skb_linearize(skb)將skb合并成一個,也能獲取其數(shù)據(jù)部分,然后對數(shù)據(jù)部分進行加密,但發(fā)送出去的還是未加密數(shù)據(jù),而加密后輸出內存數(shù)據(jù)顯示是加密了的,這是因為我獲取的只是一個副本的原因嗎?
您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP