Смущает libcap (pcap) и беспроводной - PullRequest
4 голосов
/ 09 сентября 2011

Предыстория: я учу себя анализу пакетов. Я запускаю очень простой сервер в одной оболочке, подключаюсь к нему из другой, а затем пробую разные методы для отслеживания трафика. Когда я использую сырые сокеты (IPPROTO_TCP), я получаю то, что отправляю нормально. Я фиксирую только то, что отправляю, ничего другого из интернета. Поведение libcap смущает меня следующим образом:

(1) Во-первых, чтобы проверить это, я фиксирую все устройства с помощью pcap_findalldevs (см. Также (2) ниже). Я нахожу Wlan0 хорошо. Если я подключаюсь ко «всему трафику» (на странице man), используя

if ( !( pcap_handle = pcap_open_live(NULL, 4096, 1, 0, errbuf) ) )

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

if ( !( pcap_handle = pcap_open_live("wlan0", 4096, 1, 0, errbuf) ) )

, что мне кажется правильным способом сделать это, а не «все», я фиксирую много общего трафика, но ничего не отправляю. Идеи?

(2) Сначала я нахожу все устройства, использующие pcap_findalldevs. Поскольку структура pcap_if_t, возможно, имеет несколько элементов, я распечатываю все эти элементы, чтобы увидеть следующее:

Devices found:

1. eth0 - None:
    family: 17, address: 2.0.0.0
2. wlan0 - None:
    family: 17, address: 3.0.0.0
    family: AF_INET, address: 192.168.0.159
    family: 10, address: 0.0.0.0
3. usbmon1 - USB bus number 1:
4. usbmon2 - USB bus number 2:
5. usbmon3 - USB bus number 3:
6. usbmon4 - USB bus number 4:
7. usbmon5 - USB bus number 5:
8. any - Pseudo-device that captures on all interfaces:
9. lo - None:
    family: 17, address: 1.0.0.0
    family: AF_INET, address: 127.0.0.1
    family: 10, address: 0.0.0.0

Я новичок в этом. Некоторые устройства предлагают захват AF_INET (= IPv4), IPv6 (10) и пакета (17). когда я подключаюсь к «wlan0», как это обеспечивается, когда я подключаюсь к правильным «адресам» какого-либо устройства? Это связано с проблемой?

(3) При использовании необработанных сокетов я действительно получаю только то, что отправил на свой сервер. Когда я использую libcap, я также фиксирую то, что из распечатанных байтов должно быть заголовками Интернета. Я новичок в этом. Если бы кто-то мог описать, что именно я записываю здесь, а что нет, на сырых сокетах, это было бы оценено. Это пакеты UDP или ICMP, которые, по определению, мой сокет IPPPROTO_TCP не будет перехватывать, поэтому я не видел тех, которые используют необработанные сокеты?

Большое спасибо.

Редактировать: я работаю под Ubuntu 10.04 на нетбуке Toshiba, используя комбо gcc / gdb.

1 Ответ

3 голосов
/ 19 октября 2011
  1. Несколько удивительно, что при захвате на wlan0 вы не видите отправленные вами пакеты, если они действительно отправляются через ваше устройство Wi-Fi.Вы отправляете их на другие машины в вашей сети Wi-Fi?Например, если вы отправляете их другим процессам на вашем компьютере, они будут отображаться на lo, а не на wlan0 (и если вы отправите их на другие машины в сети Wi-Fi, а не надля других процессов на вашей машине они не будут отображаться на lo - нет, весь трафик в конечном итоге не проходит через интерфейс обратной связи).
  2. Список адресов, которые вы получаетеиз pcap_findalldevs() - это НЕ список адресов, для которых вы можете захватить этот интерфейс, это просто список сетевых адресов, которые система имеет для этого интерфейса.Вы не можете выбрать, по каким адресам захватывать, - он захватывает их все.Вы захватываете интерфейс, а не адрес.
  3. Libpcap отличается от необработанного сокета;он дает заголовки более низкого уровня, чем заголовки отправляемых или получаемых данных, а также эти данные.Для устройства Ethernet вы увидите заголовки Ethernet;для устройства Wi-Fi то, что вы видите, зависит от операционной системы и выбранных вами заголовков (в Linux, то, чем вы пользуетесь, вы, вероятно, увидите заголовки Ethernet, если не захватываете в «режиме монитора»).в этом случае вы увидите либо заголовки Wi-Fi, либо заголовки «радио», такие как radiotap , за которыми следуют заголовки Wi-Fi);для «любого» устройства вы увидите «готовые заголовки Linux»;и так далее.Вам нужно будет позвонить pcap_datalink() после вызова pcap_open_live(), чтобы узнать тип заголовка интерфейса;см. список типов канального уровня (pcap_datalink() вернет значение DLT_, как указано здесь; не предполагайте, что число, указанное там, совпадает со значением DLT_, сравните сDLT_ значение по имени).
...