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

  免費注冊 查看新帖 |

Chinaunix

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

關于Netfilter中連接跟蹤機制的方向問題 Original or Relay [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2010-10-26 20:57 |只看該作者 |倒序瀏覽
內(nèi)核版本2.6.30
由于之前一直在2.4版本的內(nèi)核,現(xiàn)在剛剛改用2.6.30,其內(nèi)核一些數(shù)據(jù)結構和實現(xiàn)機制都發(fā)送了改變,因此變寫了幾個小程序去驗證性的跑一下,結果卻發(fā)現(xiàn)了這個另我費解的問題。。。
本意是在測試最新版本內(nèi)核中連接跟蹤模塊的使用情況,在新版本內(nèi)核中通過struct nf_conn代替之前的ip_conntrack結構,但其中主要的一個數(shù)據(jù)結構
struct nf_conntrack_tuple_hash tuplehash[IP_CT_DIR_MAX]并沒有太大改變。
好了,問題來了,按照道理說這個連接數(shù)組中        IP_CT_DIR_ORIGINAL代表的應該是原始方向的數(shù)據(jù)包,其源地址應該與ip頭部中的源地址是相同的,而IP_CT_DIR_REPLY代表回復方向的數(shù)據(jù)包,其目的地址才應該為本機地址。(這是我之前的理解)
但是在我寫的一個小測試用例中,得到的結果恰恰相反,ORIGINAL方向的連接的目的地址才是ip頭部中的源地址,RELAY方向連接的源地址才是ip頭部中的目的地址,很是困惑,想不明白,難道說是我之前對于連接跟蹤方向一直理解錯了嗎?。。。
現(xiàn)在貼一下我的代碼以及測試結果,有些長,各位看官不要嫌麻煩,因此這個問題真的很困擾我,急求給為牛人解惑,小弟不勝感激。。。。
  1. #include  <linux/module.h>
  2. #include  <linux/init.h>
  3. #include  <linux/kernel.h>

  4. #include  <linux/types.h>
  5. #include  <linux/errno.h>
  6. #include  <linux/sched.h>
  7. #include  <linux/slab.h>
  8. #include  <linux/fs.h>
  9. #include  <linux/poll.h>
  10. #include  <linux/spinlock.h>
  11. #include        <linux/ioctl.h>
  12. #include        <linux/proc_fs.h>
  13. #include        <linux/list.h>
  14. #include        <linux/param.h>
  15. #include        <asm/uaccess.h>
  16. #include        <asm/atomic.h>


  17. #include        <linux/skbuff.h>
  18. #include        <linux/in.h>
  19. #include        <linux/ip.h>
  20. #include        <linux/tcp.h>
  21. #include        <linux/udp.h>
  22. #include        <linux/icmp.h>
  23. #include        <linux/netdevice.h>
  24. #include        <linux/netfilter.h>
  25. #include        <linux/netfilter_ipv4.h>
  26. #include <linux/netfilter/nf_conntrack_tuple_common.h>
  27. #include <net/netfilter/nf_conntrack.h>

  28. #include        <linux/byteorder/generic.h>
  29. #include        <linux/if_arp.h>
  30. #include        <linux/if_ether.h>
  31. #include        <linux/if_packet.h>
  32. #include        <linux/delay.h>

  33. #define HASH_SIZE 1024

  34. static unsigned int       
  35. conn_hook(unsigned int hook,
  36.                            struct sk_buff *skb,
  37.                            const struct net_device *indev,
  38.                            const struct net_device *outdev,
  39.                            int        (*okfn)(struct sk_buff *))
  40. {
  41.         struct nf_conn *conn;
  42.         struct nf_conntrack_tuple_hash tuple_list;
  43.         struct nf_conntrack_tuple orig_tuple;
  44.         struct nf_conntrack_tuple relay_tuple;
  45.         struct iphdr *iph;
  46.         struct tcphdr *tcph;
  47.         u32 ip_saddr;
  48.         u32 ip_daddr;
  49.        
  50.         if(!skb)
  51.                 {
  52.                         return NF_ACCEPT;       
  53.                 }
  54.         printk("Hook functions\n");
  55.         //獲取連接跟蹤數(shù)據(jù)結構
  56.         conn = (struct nf_conn *)(skb->nfct);
  57.         if(!conn)
  58.                 {
  59.                         printk("no nf_conntrack \n");
  60.                         return NF_ACCEPT;       
  61.                 }
  62.                
  63. #if 1
  64.         iph = ip_hdr(skb);
  65.         tcph = tcp_hdr(skb);
  66.         printk("ipv4 src addr: %d.%d.%d.%d,dst addr:%d.%d.%d.%d\n", NIPQUAD(iph->saddr),NIPQUAD(iph->daddr));
  67.         printk("ipv4 tcp src port %d, dst port %d\n",tcph->source,tcph->dest);
  68.         tuple_list = conn->tuplehash[IP_CT_DIR_REPLY];
  69.         orig_tuple = conn->tuplehash[IP_CT_DIR_ORIGINAL].tuple;
  70.         relay_tuple = conn->tuplehash[IP_CT_DIR_REPLY].tuple;
  71.         ip_saddr = orig_tuple.src.u3.ip;
  72.         ip_daddr = orig_tuple.dst.u3.ip;
  73.         printk("ipv4 original src addr: %d.%d.%d.%d,dst src addr: %d.%d.%d.%d\n", NIPQUAD(ip_saddr),NIPQUAD(ip_daddr));
  74.         printk("src original port: %d,dst prot: %d\n",orig_tuple.src.u.tcp.port,orig_tuple.dst.u.tcp.port);       
  75.         ip_saddr = relay_tuple.src.u3.ip;
  76.         ip_daddr = relay_tuple.dst.u3.ip;
  77.         printk("ipv4 relay src addr: %d.%d.%d.%d,dst src addr: %d.%d.%d.%d\n", NIPQUAD(ip_saddr),NIPQUAD(ip_daddr));
  78.         printk("src relay port: %d,dst prot: %d\n",relay_tuple.src.u.tcp.port,relay_tuple.dst.u.tcp.port);
  79. #endif

  80.         return NF_ACCEPT;
  81. }

  82. static struct nf_hook_ops conn_hook_ops = {
  83. .hook =       conn_hook,
  84. .pf =         PF_INET,
  85. .hooknum =    NF_INET_POST_ROUTING,
  86. .priority =    NF_IP_PRI_LAST-1,
  87. };

  88. static int conn_init(void)
  89. {
  90.         int ret = 0;
  91. //注冊鉤子
  92.         ret = nf_register_hook(&conn_hook_ops);
  93.         if (ret < 0)
  94.         {
  95.                 printk("register isatap hook ops error!\n");
  96.         return -ENOMEM;
  97.         }
  98.     return 0;
  99. }

  100. static void conn_exit(void)
  101. {
  102.         nf_unregister_hook(&conn_hook_ops);       
  103.         printk("Unregister conntrack hook ok\n");
  104.         return;
  105. }

  106. module_init(conn_init);
  107. module_exit(conn_exit);

  108. MODULE_LICENSE("GPL");
復制代碼
然后使運行結果;
  1. Hook functions
  2. ipv4 src addr: 192.168.1.4,dst addr:192.168.1.221
  3. ipv4 tcp src port 5632, dst port 2824
  4. ipv4 original src addr: 192.168.1.221,dst src addr: 192.168.1.4
  5. src original port: 2824,dst prot: 5632
  6. ipv4 relay src addr: 192.168.1.4,dst src addr: 192.168.1.221
  7. src relay port: 5632,dst prot: 2824
  8. Hook functions
  9. ipv4 src addr: 192.168.1.4,dst addr:192.168.1.221
  10. ipv4 tcp src port 5632, dst port 2824
  11. ipv4 original src addr: 192.168.1.221,dst src addr: 192.168.1.4
  12. src original port: 2824,dst prot: 5632
  13. ipv4 relay src addr: 192.168.1.4,dst src addr: 192.168.1.221
  14. src relay port: 5632,dst prot: 2824
  15. Hook functions
  16. ipv4 src addr: 192.168.1.4,dst addr:192.168.1.221
  17. ipv4 tcp src port 5632, dst port 2824
  18. ipv4 original src addr: 192.168.1.221,dst src addr: 192.168.1.4
  19. src original port: 2824,dst prot: 5632
  20. ipv4 relay src addr: 192.168.1.4,dst src addr: 192.168.1.221
  21. src relay port: 5632,dst prot: 2824
  22. Hook functions
  23. ipv4 src addr: 192.168.1.4,dst addr:192.168.1.221
  24. ipv4 tcp src port 5632, dst port 10760
  25. ipv4 original src addr: 192.168.1.221,dst src addr: 192.168.1.4
  26. src original port: 10760,dst prot: 5632
  27. ipv4 relay src addr: 192.168.1.4,dst src addr: 192.168.1.221
  28. src relay port: 5632,dst prot: 10760
復制代碼
從這個結果來看,ip首部的源地址和目的地址對應的是relay方向的連接包,通過tcp頭部的端口號也證明了這一點。。。
而且我剛剛看了下ipv4_pkt_to_tuple,它所做的工作的確是從ip首部自動的源地址開始,讀取兩個32字節(jié)的變量,分別賦給tuple中的源地址和目的地址,按照道理說應該不會出錯啊,可是我怎么得出了這么個結果。。。

這個真的很困惑,本人也是剛開始學Netfilter不久,還請各位高手幫忙解答。。。

論壇徽章:
0
2 [報告]
發(fā)表于 2010-10-26 20:59 |只看該作者
貌似我忘記考慮端口的網(wǎng)絡字節(jié)序的問題了。。。。
各位請直接跳過這個問題

論壇徽章:
0
3 [報告]
發(fā)表于 2010-10-26 21:03 |只看該作者
操作系統(tǒng)Centos,實驗平臺虛擬機,應該沒有需要補充的了。。。

論壇徽章:
0
4 [報告]
發(fā)表于 2010-10-27 09:09 |只看該作者
沒人能幫忙看一下嗎。。。
哎。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

論壇徽章:
36
IT運維版塊每日發(fā)帖之星
日期:2016-04-10 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-16 06:20:0015-16賽季CBA聯(lián)賽之廣東
日期:2016-04-16 19:59:32IT運維版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-19 06:20:00每日論壇發(fā)貼之星
日期:2016-04-19 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-25 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-06 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-08 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-13 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-28 06:20:00每日論壇發(fā)貼之星
日期:2016-05-28 06:20:00
5 [報告]
發(fā)表于 2010-10-27 10:11 |只看該作者
# static struct nf_hook_ops conn_hook_ops = {
# .hook =       conn_hook,
# .pf =         PF_INET,
# .hooknum =    NF_INET_POST_ROUTING,
# .priority =    NF_IP_PRI_LAST-1,
# };


本身數(shù)據(jù)包又流入和流出兩個方向,都會通過連接跟蹤的。
你看一下你的 hook 函數(shù)注冊的位置,如果是終端主機的話,只有哪個方向的包才會進入你的 hook 函數(shù)

論壇徽章:
0
6 [報告]
發(fā)表于 2010-10-27 10:29 |只看該作者
回復 5# Godbach


    注冊點在 POST_ROUTING,測試機是終端主機,按照道理在LOCAL_OUT的時候會對本機發(fā)出的數(shù)據(jù)包建立連接跟蹤,在POST_ROUTING中掛入連接跟蹤隊列中

    目的是為了測試本機發(fā)出的數(shù)據(jù)包,在POST_ROUTING也不能捕獲到達本機的數(shù)據(jù)包吧,測試中那個192.168.1.4是運行程序的主機ip地址,192.168.1.221為發(fā)出數(shù)據(jù)包的目的地址

論壇徽章:
36
IT運維版塊每日發(fā)帖之星
日期:2016-04-10 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-16 06:20:0015-16賽季CBA聯(lián)賽之廣東
日期:2016-04-16 19:59:32IT運維版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-19 06:20:00每日論壇發(fā)貼之星
日期:2016-04-19 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-25 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-06 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-08 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-13 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-28 06:20:00每日論壇發(fā)貼之星
日期:2016-05-28 06:20:00
7 [報告]
發(fā)表于 2010-10-27 10:54 |只看該作者
首先要明確你這個連接主動發(fā)起方是哪個 IP。
可以做個測試,用另一臺主機向你當前主機發(fā)起 SYN 請求,或者等連接完全建立之后也行,你在 LOCALIN 出截獲它的數(shù)據(jù)包,并查看連接的 ORG 方向的源 IP.

論壇徽章:
0
8 [報告]
發(fā)表于 2010-10-27 22:50 |只看該作者
本帖最后由 奇門遁甲-lu 于 2010-10-27 23:11 編輯

很明顯你的數(shù)據(jù)是由
192.168.1.221開始發(fā)出的。
數(shù)據(jù)通過連接跟蹤,如果還沒建立連接跟蹤的,就建立一個連接跟蹤
你的掛鉤放在NF_INET_POST_ROUTING。

實際上是192.168.1.4應答的時候捕捉到的數(shù)據(jù)。

所以
ipv4 original src addr: 192.168.1.221,dst src addr: 192.168.1.4
一點沒錯,
IP_CT_DIR_ORIGINAL記錄的是數(shù)據(jù)最開始時的方向,

另外應該判斷一下傳輸協(xié)層議協(xié)議是不是tcp.
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(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的朋友們 轉載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP