2009-08-24 7 views
3

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

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

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

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

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

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

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


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

+0

Wireshark показывает пакеты в порядке, также как и tcpdump. – computergeek6

+0

Это так, но сокет по-прежнему не получит другого трафика. – computergeek6

+0

Мне удалось исправить это на моем конце, и это был самый полезный ответ. Благодаря! – computergeek6

1

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

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

+0

Если я это сделаю, bind() не удастся. Кроме того, он устарел. – computergeek6

+1

Достаточно честный. Вы работаете как привилегированный пользователь? –

0

Ваш порт коммутатора также должен быть настроен соответствующим образом (порт 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

0

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^