Установлен беспроводной интерфейс, но захватываются данные Ethernet

Я делаю сниффер с помощью libpcap и получаю странное поведение. Я не очень разбираюсь в сети, для этого я делаю сниффер, чтобы узнать, как на самом деле работает сеть.

Прежде чем запускать сниффер, я набираю ifconfig на терминале, и он возвращает:

eth0      Link encap:Ethernet  Endereço de HW 44:87:fc:ec:63:08  
          endereço inet6: fe80::4687:fcff:feec:6308/64 Escopo:Link
          UP BROADCASTMULTICAST  MTU:1500  Métrica:1
          RX packets:38398 errors:0 dropped:1 overruns:0 frame:0
          TX packets:28661 errors:0 dropped:0 overruns:0 carrier:2
          colisões:0 txqueuelen:1000 
          RX bytes:24620500 (23.4 MiB)  TX bytes:6922586 (6.6 MiB)
          IRQ:42 

lo        Link encap:Loopback Local  
          inet end.: 127.0.0.1  Masc:255.0.0.0
          endereço inet6: ::1/128 Escopo:Máquina
          UP LOOPBACKRUNNING  MTU:16436  Métrica:1
          RX packets:294 errors:0 dropped:0 overruns:0 frame:0
          TX packets:294 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:18540 (18.1 KiB)  TX bytes:18540 (18.1 KiB)

wlan0     Link encap:Ethernet  Endereço de HW 00:c1:40:67:04:30  
          inet end.: 192.168.0.102  Bcast:192.168.0.255  Masc:255.255.255.0
          endereço inet6: fe80::2c1:40ff:fe67:430/64 Escopo:Link
          UP BROADCASTRUNNING MULTICAST  MTU:1500  Métrica:1
          RX packets:2115 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2033 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:947310 (925.1 KiB)  TX bytes:571860 (558.4 KiB)

Я отключил кабель Ethernet, поэтому интерфейс eth0 не имеет ip и не будет работать, если я использую его на своем сниффере.

Таким образом, я передаю беспроводной сетевой интерфейс в качестве параметра программе на терминале.

#./sniffer wlan0

И фрагмент кода:

pcap_t* handler = NULL; 

handler = pcap_open_live(argv[1], 65535, 1, 1000, errbuf);

if((datalink_value = pcap_datalink(handler)) == DLT_EN10MB)
    printf("ETHERNET\n");
else if (datalink_value == DLT_IEEE802_11)
    printf("WIRELESS\n");

Выход ETHERNET.

Почему это происходит и как я могу это исправить? Устройство преобразует его в Ethernet? Или это поведение ядра? Я до сих пор не знаю, проблема в моем коде или я плохо разбираюсь в том, как работает сеть и протокол.

Беспроводное устройство, которое я использую: Mini USB 150Mbps 802.11n/g/b wifi Adapter Comfast WU720N

Спасибо.


person ViniciusArruda    schedule 25.02.2015    source источник
comment
Поскольку инкапсуляция всегда encap:Ethernet   -  person LPs    schedule 25.02.2015
comment
@LPs Это всегда будет происходить в беспроводной сети? Я так понимаю это правило? Спасибо.   -  person ViniciusArruda    schedule 25.02.2015
comment
@Guy Harris ответил вам очень хорошо.   -  person LPs    schedule 26.02.2015


Ответы (1)


В Linux вам необходимо выполнять захват в режиме монитора, чтобы получить заголовки 802.11. Если адаптер не находится в режиме мониторинга, вы будете получать только кадры данных, а не кадры управления или контроля, а заголовок 802.11 будет преобразован ядром в поддельный заголовок Ethernet, и пакет будет снабжен этим заголовком.

Более новые версии libpcap имеют API для запроса режима монитора, но в Linux этот API работает хорошо только в том случае, если libpcap был собран с поддержкой libnl. Вы можете попробовать использовать API (используйте pcap_create(), за которым следуют вызовы для установки параметров захвата, а затем pcap_activate(), чтобы открыть устройство; один из этих вызовов должен быть pcap_set_rfmon() для установки режима монитора). Если это не сработает, вам придется использовать airmon-ng, чтобы включить режим монитора; см. эту часть Wireshark Wiki для получения информации о как это сделать.

person Community    schedule 25.02.2015