2012-06-15 17 views
5

Tôi muốn chụp khung khi chúng được nhận bởi một NIC nhất định; trích xuất một số thông tin từ chúng (hiện tại tôi cần nắm bắt nguồn MAC và địa chỉ IP nguồn); lưu các thông tin này vào một số cấu trúc dữ liệu công khai; và để khung đi lên theo cách của nó đến ngăn xếp TCP/IP.
Cách chụp khung mạng trong mô-đun hạt nhân

Tôi đã sử dụng Netfilter trước đây, nhưng dường như nó không cung cấp móc lớp Liên kết.
Có cách nào tôi có thể thực hiện việc này không?

Tôi viết đây là mô-đun hạt nhân; chạy hạt nhân Linux 2.6.32

Trả lời

6

Thực ra Netfilter sẽ hoạt động tốt vì nó nhận được toàn bộ gói (được lưu trữ nội bộ dưới dạng sk_buff bao gồm thông tin lớp Liên kết). Dưới đây là một số mã mẫu sẽ giúp bạn bắt đầu. Mã này chặn tất cả các gói tin đến cho một thiết bị cụ thể và in src MAC và src IP.

static struct nf_hook_ops nfin; 

static unsigned int hook_func_in(unsigned int hooknum, 
      struct sk_buff *skb, 
          const struct net_device *in, 
          const struct net_device *out, 
          int (*okfn)(struct sk_buff *)) 
{ 
    struct ethhdr *eth; 
    struct iphdr *ip_header; 
    /* check *in is the correct device */ 
    if (in is not the correct device) 
      return NF_ACCEPT;   

    eth = (struct ethhdr*)skb_mac_header(skb); 
    ip_header = (struct iphdr *)skb_network_header(skb); 
    printk("src mac %pM, dst mac %pM\n", eth->h_source, eth->h_dest); 
    printk("src IP addr:=%d.%d.%d.%d:%d\n", NIPQUAD(ip_headr->saddr)); 
    return NF_ACCEPT; 
} 

static int __init init_main(void) 
{ 
    nfin.hook  = hook_func_in; 
    nfin.hooknum = NF_IP_LOCAL_IN; 
    nfin.pf  = PF_INET; 
    nfin.priority = NF_IP_PRI_FIRST; 
    nf_register_hook(&nfin); 

    return 0; 
} 



static void __exit cleanup_main(void) 
{ 
    nf_unregister_hook(&nfin); 
} 
module_init(init_main); 
module_exit(cleanup_main); 
+0

lol, tôi cảm thấy câm vì không thử điều này; cảm ơn rất nhiều sir ^^ – Fingolfin

+0

@ Adel Vui mừng nó hoạt động cho bạn! – ajpyles

+0

phải là: printk ("src IP addr: =% d.% D.% D.% D:% d \ n", NIPQUAD (ip_header-> saddr)); – Raman

Các vấn đề liên quan