Пакетный сокет в случайном режиме принимает только локальный трафик - PullRequest
3 голосов
/ 25 августа 2009

У меня есть сокет, созданный с помощью socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)), и я установил его в случайный режим, используя:

struct ifreq ifr;
strncpy((char*)ifr.ifr_name, interface, IF_NAMESIZE);
if(ioctl(sock, SIOCGIFINDEX, &ifr)<0) fail(2);

struct packet_mreq mr;
memset(&mr, 0, sizeof(mr));
mr.mr_ifindex = ifr.ifr_ifindex;
mr.mr_type = PACKET_MR_PROMISC;
if(setsockopt(sock, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr, sizeof(mr)) < 0) fail(2);

Проблема в том, что когда я делаю read() из сокета, он возвращает только данные, которые идут или приходят на мой компьютер.

Как мне заставить его читать и обрабатывать все пакеты в сети?

Wireshark показывает все пакеты нормально, так что я знаю, что это не мой компьютер или сетевая карта. ifconfig сообщает, что он PROMISC во время работы.

Ответы [ 4 ]

4 голосов
/ 25 августа 2009

Наряду с предложением Роба Джонса, попробуйте такой инструмент, как Wireshark , чтобы убедиться, что вы получаете ожидаемые пакеты на интерфейсе. По крайней мере, это подтвердит (или опровергнет), что у вас есть проблемы с вашим кодом.

Также необходимо убедиться, что сам интерфейс установлен в случайный режим. Если нет, то вы можете использовать ioctl (), чтобы установить его:

ifr.ifr_flags |= IFF_PROMISC;
if( ioctl(sock, SIOCSIFFLAGS, &ifr) != 0 )
{
    // handle error here
}

Пока ваше приложение работает, убедитесь, что ifconfig сообщает флаг PROMISC для этого интерфейса.

Обратите внимание, что это нужно будет выполнить как привилегированный пользователь.


Попробовал код, представленный. Работает для меня. Конечно (из-за теста в строке 102) это будет печатать детали только для трафика TCP.

1 голос
/ 25 августа 2009

Попробуйте использовать SOCK_PACKET в качестве второго аргумента для socket (), а не SOCK_RAW.

Если вы находитесь на коммутаторе, вы, вероятно, увидите только пакеты, предназначенные или исходящие с вашего компьютера. Попробуйте хаб.

0 голосов
/ 25 августа 2009

Вероятно, это не проблема программного обеспечения.

Вероятно, вы используете не то оборудование. Ваш компьютер, вероятно, подключен к коммутатору. Коммутаторы достаточно умны, чтобы «узнать», какие компьютеры и на каких портах, и направлять трафик только туда, куда он должен идти. Следовательно, коммутатор фильтрует ваши пакеты для вас.

Чтобы это исправить, вам нужно получить концентратор. Хотя концентраторы и коммутаторы выглядят очень похоже, они работают по-разному. Концентратор неактивен и будет направлять весь трафик на все порты, что позволит вам видеть другой трафик в случайном режиме.

Обратите внимание, что даже если вы замените устройство, к которому подключен ваш компьютер, оно, скорее всего, будет подключено к большему количеству коммутаторов восходящего потока, что также ограничит трафик. Следовательно, вы не сможете прослушивать трафик с гораздо большего расстояния, чем ваш собственный концентратор или тестовая лаборатория.

0 голосов
/ 25 августа 2009

Ваш порт коммутатора также должен быть настроен соответствующим образом (порт SPAN в мире Cisco). Смотрите здесь для более подробной информации:

http://www.winpcap.org/misc/faq.htm#Q-22

А вот информация от Cisco относительно работы портов SPAN:

http://www.cisco.com/en/US/products/hw/switches/ps708/products_tech_note09186a008015c612.shtml

...