2012-04-29 73 views
0

任何人都可以告訴我如何通過使用Netfilter鉤子的linux模塊修改數據包數據?用於修改數據包的Linux模塊(Netfilter)

謝謝!

+0

你有什麼試過嗎? (http://mattgemmell.com/2008/12/08/what-have-you-tried/) – 2012-04-29 13:47:28

+0

我什麼也沒試,因爲我找不到東西 – user1262425 2012-04-29 15:18:58

回答

2

沒有必要編寫自己的netfilter模塊。你可以從用戶空間使用來自iptables的QUEUE目標,並編寫一個處理隊列的守護程序。

這方面的例子相對較少,但有些確實存在。它通常用於過濾,但你也可以(我相信)重新輸入修改的數據包(至少在iptables的mangle表中)。

1

試試下面的程序

寫iptables規則來傳遞數據包到用戶空間包

# iptables -A INPUT -p TCP -j QUEUE 

編譯和執行爲

$ gcc test.c -lipq 
$ sudo ./a.out 

源代碼

#include <netinet/in.h> 
#include <linux/netfilter.h> 
#include <libipq.h> 
#include <stdio.h> 
#include <stdlib.h> 


#define BUFSIZE 2048 
static void die(struct ipq_handle *h) 
{ 
    ipq_perror("passer"); 
    ipq_destroy_handle(h); 
    exit(1); 
} 
int main(int argc, char **argv) 
{ 
    int status, i=0; 
    unsigned char buf[BUFSIZE]; 
    struct ipq_handle *h; 
    h = ipq_create_handle(0, NFPROTO_IPV4); 

    if (!h)  die(h); 

    status = ipq_set_mode(h, IPQ_COPY_PACKET, BUFSIZE); 

    if (status < 0) die(h); 

    do{ 
     i++; 
     status = ipq_read(h, buf, BUFSIZE, 0); 

     if (status < 0) die(h); 

     switch (ipq_message_type(buf)) { 
      case NLMSG_ERROR: 
       fprintf(stderr, "Received error message %d\n", 
       ipq_get_msgerr(buf)); 
       break; 
      case IPQM_PACKET: 
      { 
       ipq_packet_msg_t *m = ipq_get_packet(buf); 
       printf("\nReceived Packet"); 
       /****YOUR CODE TO MODIFY PACKET GOES HERE****/ 
       status = ipq_set_verdict(h, m->packet_id, NF_ACCEPT, 0, NULL); 
       if (status < 0) die(h); 
       break; 
      } 
      default: 
       fprintf(stderr, "Unknown message type!\n"); 
       break; 
     } 
    } while (1); 
    ipq_destroy_handle(h); 
    return 0; 
}