Пакетный сокет в беспорядочном режиме получает только локальный трафик

StackOverflow https://stackoverflow.com/questions/1325378

Вопрос

У меня есть сокет, созданный с помощью 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 когда он работает.

Это было полезно?

Решение

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

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

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

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

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


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

Другие советы

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

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

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

Скорее всего, это не программная проблема.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top