netfilter數據包過濾
❶ android系統中的3G通信數據包可以用netfilter來抓取嗎拜託各位大神
通俗的說,netfilter的架構就是在整個網路流程的若干位置放置了一些檢測點(HOOK),而在每個檢測點上登記了一些處理函數進行處理(如包過濾,NAT等,甚至可以是 用戶自定義的功能)。
netfilter[1]
IP層的五個HOOK點的位置如下圖所示
[1]:NF_IP_PRE_ROUTING:剛剛進入網路層的數據包通過此點(剛剛進行完版本號,校驗
和等檢測), 目的地址轉換在此點進行;
[2]:NF_IP_LOCAL_IN:經路由查找後,送往本機的通過此檢查點,INPUT包過濾在此點進行;
[3]:NF_IP_FORWARD:要轉發的包通過此檢測點,FORWARD包過濾在此點進行;
[4]:NF_IP_POST_ROUTING:所有馬上便要通過網路設備出去的包通過此檢測點,內置的源地址轉換功能(包括地址偽裝)在此點進行;
[5]:NF_IP_LOCAL_OUT:本機進程發出的包通過此檢測點,OUTPUT包過濾在此點進行。
在IP層代碼中,有一些帶有NF_HOOK宏的語句,如IP的轉發函數中有:
如果在編譯內核時沒有配置netfilter時,就相當於調用最後一個參數,此例中即執行
ip_forward_finish函數;否則進入HOOK點,執行通過nf_register_hook()登記的功能
(這句話表達的可能比較含糊,實際是進入nf_hook_slow()函數,再由它執行登記的
函數)。
NF_HOOK宏的參數分別為:
⒈ pf:協議族名,netfilter架構同樣可以用於IP層之外,因此這個變數還可以有諸如
PF_INET6,PF_DECnet等名字。
⒉hook:HOOK點的名字,對於IP層,就是取上面的五個值;
⒊skb:不用多解釋了吧;
⒋indev:進來的設備,以struct net_device結構表示;
⒌outdev:出去的設備,以struct net_device結構表示;
(後面可以看到,以上五個參數將傳到用nf_register_hook登記的處理函數中。)
⒍okfn:是個函數指針,當所有的該HOOK點的所有登記函數調用完後,轉而走此流程。
這些點是已經在內核中定義好的,除非你是這部分內核代碼的維護者,否則無權增加
或修改,而在此檢測點進行的處理,則可由用戶指定。像packet filter,NAT,connection
track這些功能,也是以這種方式提供的。正如netfilter的當初的設計目標--提供一
個完善靈活的框架,為擴展功能提供方便。
如果我們想加入自己的代碼,便要用nf_register_hook函數,其函數原型為:
int nf_register_hook(struct nf_hook_ops *reg)
我們考察一下struct nf_hook_ops結構:
我們的工作便是生成一個struct nf_hook_ops結構的實例,並用nf_register_hook將
其HOOK上。其中list項我們總要初始化為{NULL,NULL};由於一般在IP層工作,pf總是
PF_INET;hooknum就是我們選擇的HOOK點;一個HOOK點可能掛多個處理函數,誰先誰後
,便要看優先順序,即priority的指定了。netfilter_ipv4.h中用一個枚舉類型指定了內
置的處理函數的優先順序:
hook是提供的處理函數,也就是我們的主要工作,其原型為:
它的五個參數將由NFHOOK宏傳進去。
了解了這些,基本上便可以可以寫一個lkm出來了。
❷ 如何在netfilter捕獲的數據包中獲取到源mac信息
能看到0x0800說明mac-header還是在的,沒有哪個模塊閑的沒事干把src-mac和dst-mac清零的 順便把skb->dev列印出來,看到mac是0,多半是來自虛擬口的報文,比如lo或者ppp等。
❸ Linux系統中Netfilter中的ip包過濾功能的原理、策略管理、匹配原理
這個問題說來話長了,你可以下載Rusty Russell寫的PacketFiltering HOWTO,好是iptables前身ipchains的作者,也是iptables的主要作者。第二是看一下iptables的man頁,網上有中文版的。 簡單的說就是包過濾 包含3個表格:filter過濾,nat地址轉換,mangle 每個表格可以使用對某些鏈的處理方法,和專業防火牆的配置有點象,這里按包的行為分成5個鏈(INPUT,OUTPUT,FORWARD,POSTROUTING,PREROUTING) 後面是一個目標(ACCEPT,DROP,QUEUE,RETURN等) 對每個包系統先會確定是哪個鏈的,比如進入系統的歸到INPUT鏈等, 對這個鏈再執行鏈里的每個語句(從上到下)如果匹配就執行後面的目標 如iptables -A INPUT -p icmp -j DROP -A 地表裡增一條規則 -p icmp 這條規則匹配icmp報文 -j DROP 如果以上匹配的話就執行目標DROP:把這個包丟掉 這樣別人就ping不到你了 具體情況,還要多看書,有興趣[email protected]一起學習 參考文獻: Rusty Russell Packet Filtering HOWTO
希望採納
❹ netfilter修改數據包
構造報文是否正確,可以通過抓包工具看看
構造的報文應該是從mac層開始構造,看看是否構造mac地址與IP地址不對應,這種情況很可能被內核協議棧丟掉,簡單的方法是接收個包,然後把裡面的mac IP源地址和目的地址交換
是否使用正確的發送報文函數 skb->dev =pskb->dev;dev_queue_xmit(skb);
❺ 修改netfilter數據包
01.static unsigned int send(unsigned int hooknum, struct sk_buff * skb,
02. const struct net_device * in, const struct net_device * out,
03. int (*okfn)(struct sk_buff *))
04.{
05. struct iphdr* iph;
06. struct udphdr* udph;
07. struct tcphdr* tcph;
08. unsigned char *data = NULL;
09. int datalen;
10. int ret = 0;
11.
12. __u16 dst_port,src_port;
13. __be32 myip;
14.
15. if(skb)
16. {
17. iph = (struct iphdr *)skb_header_pointer(skb,0,0,NULL);
18. if(iph)
19. {
20. if(strcmp(dstIP,"")!=0&&strcmp(dstIP,"0.0.0.0")!=0)
21. {
22. myip = in_aton(dstIP);
23. if(iph->daddr == myip)
24. {
25. if(iph->protocol == IPPROTO_UDP)
26. {
27. udph = (struct udphdr *)skb_header_pointer(skb,IP_HDR_LEN,0,NULL);
28. data = (char *)skb_header_pointer(nskb,TOT_HDR_LEN,0,NULL);
29. datalen = ntohs(iph->tot_len)-TOT_HDR_LEN;
30. }
31. else if(iph->protocol == IPPROTO_TCP)
32. {
33. tcph = (struct tcphdr *)skb_header_pointer(skb,IP_HDR_LEN,0,NULL);
34. int offlen = IP_HDR_LEN + tcph->doff*4;
35. data = (char *)skb_header_pointer(skb,offlen,0,NULL);
36. datalen = ntohs (iph->tot_len)-offlen;
37. }
38.
39. int j;
40. for(j=0; j<datalen; j++)
41. {
42. data[j] += 1;
43. }
44. printk("encrypted\n");
45. iph->check = 0;
46. ip_send_check(iph);
47. }
48. }
49. }
50. }
51. return NF_ACCEPT;
52.}
01.static unsigned int send(unsigned int hooknum, struct sk_buff * skb,
02. const struct net_device * in, const struct net_device * out,
03. int (*okfn)(struct sk_buff *))
04.{
05. struct iphdr* iph;
06. struct udphdr* udph;
07. struct tcphdr* tcph;
08. unsigned char *data = NULL;
09. int datalen;
10. int ret = 0;
11.
12. __u16 dst_port,src_port;
13. __be32 myip;
14.
15. if(skb)
16. {
17. iph = (struct iphdr *)skb_header_pointer(skb,0,0,NULL);
18. if(iph)
19. {
20. if(strcmp(dstIP,"")!=0&&strcmp(dstIP,"0.0.0.0")!=0)
21. {
22. myip = in_aton(dstIP);
23. if(iph->daddr == myip)
24. {
25. if(iph->protocol == IPPROTO_UDP)
26. {
27. udph = (struct udphdr *)skb_header_pointer(skb,IP_HDR_LEN,0,NULL);
28. data = (char *)skb_header_ www.hnne.com pointer(nskb,TOT_HDR_LEN,0,NULL);
29. datalen = ntohs(iph->tot_len)-TOT_HDR_LEN;
30. }
31. else if(iph->protocol == IPPROTO_TCP)
32. {
33. tcph = (struct tcphdr *)skb_header_pointer(skb,IP_HDR_LEN,0,NULL);
34. int offlen = IP_HDR_LEN + tcph->doff*4;
35. data = (char *)skb_header_pointer(skb,offlen,0,NULL);
36. datalen = ntohs (iph->tot_len)-offlen;
37. }
38.
39. int j;
40. for(j=0; j<datalen; j++)
41. {
42. data[j] += 1;
43. }
44. printk("encrypted\n");
45. iph->check = 0;
46. ip_send_check(iph);
47. }
48. }
49. }
50. }
51. return NF_ACCEPT;
52.}
❻ 如何用netlink實現內核包過濾框架netfilter與用戶空間的通信
查改內核有如下幾種方式: 1、 直接通過文件系統(procfs/sysfs); 2、 增加自己的系統調用; 3、 使用統一系統調用(ioctl); 4、 netlink; 第一種方式的好處是無需增加用戶態代碼,直接通過cat或echo可配置,
❼ 請教netfilter抓混雜模式數據包
zmhzcy 估計你的內核(網卡驅動)可能已經工作在napi模式了,
問題應該出在你添加的處理邏輯上。
建議說一下你添加的代碼都做了什麼工作
❽ 在Linyx 系統中, Netfilter包過濾防火牆主要工作在OSI參考模型的( )
不管什麼系統,只要是遵循OSI七層參考模型的,數據包始終是工作在第三層網路層上的,數據幀始終是工作在第二層數據鏈路層上的,二進制比特流始終是工作在最底層物理層上的。
❾ 如何實現NAT,已經理解原理了,但是如何過濾包
家用路由器本身就帶有這個功能的nat,網路地址轉換的意思.就是實現內部專用網公用一個或多個內外網地址上網容有動態nat,有靜態nat和埠nat動態nat就是有一個地址池,裡面有一定的Internet地址動態地分配給區域網內部用戶輪流上網,某個用戶不用上網時就自動釋放地址,讓別的用戶可以用Internet地址上網靜態nat就是把內部網的某部主機永久地映射到外網的一個固定地址實現上網這個鏈接有講
❿ 如何用netfilter修改數據包的內容
內核中修改數據包是很麻煩的一件事,你可以用ip_queue 的 verdit 消息,自動reinject,那樣的話再用戶空間就能完成(如果僅限於IP協議的話)