2014-04-23 52 views
0

我在同一個LAN中連接了3檯筆記本電腦。混雜模式的使用

搭接-1:192.168.1.2
搭接-2:192.168.1.3
搭接-3:192.168.1.4

我製成的棉卷-1作爲服務器和9333監聽端口。第二圈充當客戶端。使用netcat我從lap2發送數據到lap1。我能夠在lap1中使用pcap捕獲數據包。我使用sudo ifconfig eth0 promisc打開混雜模式。在pcap_live_open方法中,我也設置了混雜模式標誌。

然後我關閉了混雜模式,並在pcap_live_open功能。我仍然可以捕獲數據包。

我搜索了混雜模式,我可以推斷,如果設備以混雜模式打開一個接口,它將能夠捕獲所有連接到該網絡的數據包。

因此考慮到這一點,我將lap3作爲服務器,lap2作爲客戶端。我遵循了上述相同的程序。我在lap-1上運行pcap可執行文件,希望能夠捕獲在lap-3和lap-2之間傳輸的數據包,但在lap-1上運行的pcap無法在混雜模式下運行。所有3圈都連接到同一網絡。

任何人都可以啓發我使用簡單場景混雜模式?

這是我的pcap代碼: 29988是9333的反向(交換),我只是在尋找。

#include <pcap/pcap.h> 
#include <stdint.h> 

const u_char *packet; 

int main() 
{ 
    char *dev = "eth0"; 
    pcap_t *handle;   
    int j=0; 
    char errbuf[PCAP_ERRBUF_SIZE]; 
    struct bpf_program fp;  
    bpf_u_int32 mask;  
    bpf_u_int32 net;  
    struct pcap_pkthdr header; 
    uint8_t *ip_header_len; 
    uint16_t ip_header_len_val; 
    uint16_t *port; 

    /* Find the properties for the device */ 
    while (pcap_lookupnet(dev, &net, &mask, errbuf) == -1) { 
     printf("Couldn't get netmask for device %s: %s\n", dev, errbuf); 
     net = 0; 
     mask = 0; 
    } 
    printf("lookedup pcap device: %s\n", dev); 

    /* Open the session in promiscuous mode */ 
    handle = pcap_open_live(dev, BUFSIZ,1,0, errbuf); 
    if (handle == NULL) { 
     printf("Couldn't open device %s: %s\n", dev, errbuf); 
    } 
    /* Compile and apply the filter */ 
    if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) { 
     printf("Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle)); 
     pcap_close(handle); 
    } 
    /*  if (pcap_setfilter(handle, &fp) == -1) { 

     printf("Couldn't install filter %s: %s", filter_exp, pcap_geterr(handle)); 
     return(-1); 
    } 
    */ 

    /* Grab a packet */ 
    while ((packet = pcap_next(handle, &header)) != NULL) 
    { 
     uint16_t *data_size; 
     uint16_t size,total_len_val,tcp_header_len_val; 
     char tdata[128];  
     uint8_t *data,*tcp_header_len; 
     uint16_t *total_len; 

     //ip_proto = (uint8_t *)&packet[9]; 
     ip_header_len = (uint8_t *)&packet[14]; 

     ip_header_len_val = (*ip_header_len) & 0x0F; 
     ip_header_len_val = ip_header_len_val*4; 
     // printf("IP header len val:%d\n",ip_header_len_val); 

     port = (uint16_t *)&packet[14+ip_header_len_val+2]; 
     //printf("port:%d\n",*port); 

     total_len = (uint16_t *)&packet[14+2]; 
     total_len_val = ((*total_len) >> 8) & 0x00FF; 
     total_len_val = total_len_val + (((*total_len) << 8) & 0xFF00); 
     //total_len_val=*total_len; 
     // printf("tot len val:%d\n",total_len_val); 
     tcp_header_len = (uint8_t *)&packet[14+ip_header_len_val+12]; 
     tcp_header_len_val = (*tcp_header_len) & 0xF0; 
     tcp_header_len_val = tcp_header_len_val>>4; 
     tcp_header_len_val = tcp_header_len_val * 4; 
     // printf("tcp header len val:%d\n",tcp_header_len_val); 
     size = (total_len_val- ip_header_len_val) - tcp_header_len_val; 


     data = (uint8_t *)&packet[14+ip_header_len_val+tcp_header_len_val]; 

     memset(tdata,0,128); 
     mempcpy(tdata,data,size); 
     tdata[size]='\0'; 
     if((*port)==29988) 
     {  
     printf("Data Packet:%s\n",tdata); 
     } 
    } 
} 
+0

它們是如何連接的?如果你有一個路由器,它可能只發送數據包到正確的端口,所以沒有數據包將到達lap1捕獲。 –

+0

是通過路由器。我將如何測試它? – user3550166

回答

4

我希望當你說他們都在同一個網絡上時,你的意思是他們連接到同一個以太網交換機。該開關只會將數據發送到筆記本電腦1,該筆記本電腦的目的地是laptop1。在過去通常使用以太網集線器的情況下,所有流量都流向所有連接的設備,但現在交換機非常便宜,集線器不再普遍。如果您可以找到集線器,那麼您可以嘗試一下,否則您將只能看到發往您設備的流量。

+0

我已將所有設備連接到路由器。我只需要promiscuos模式有用的用例 – user3550166

+0

除非您可以將路由器/交換機配置爲將所有流量轉發到您正在嗅探的端口,或者您可以找到舊式中心,否則不會有應用程序。 –

+1

有關在交換機上捕獲時可能遇到的問題的長篇討論以及這些問題的可能解決方案,請參見[以太網捕獲的Wireshark Wiki頁面](http://wiki.wireshark.org/CaptureSetup/Ethernet)。 (不要以爲「路由器」也不是交換機。) –

0

正如Brad所說,路由器知道目標設備連接到哪個端口,所以它只在那裏發送數據包。如果您想嘗試此操作,可以使用VirtualBox或VMware,並將這些機器連接到虛擬網絡中。