Пакетный сокет в беспорядочном режиме получает только локальный трафик
-
19-09-2019 - |
Вопрос
У меня есть сокет, созданный с помощью 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
Скорее всего, это не программная проблема.
Вероятно, вы используете неправильное оборудование.Вероятно, ваш компьютер подключен к коммутатору.Коммутаторы достаточно умны, чтобы «узнавать», какие компьютеры подключены к каким портам, и маршрутизировать трафик только туда, куда ему необходимо.Следовательно, коммутатор фильтрует ваши пакеты за вас.
Чтобы это исправить, вам нужно получить Хаб.Хотя концентраторы и коммутаторы кажутся очень похожими, они работают по-разному.Концентратор «немой» и будет маршрутизировать весь трафик на все порты, позволяя вам видеть другой трафик в беспорядочном режиме.
Обратите внимание: даже если вы замените устройство, к которому подключен ваш компьютер, оно, скорее всего, будет подключено к большему количеству коммутаторов в восходящем направлении, что также ограничит трафик.Следовательно, вы не сможете перехватывать трафик с большего расстояния, чем ваш собственный концентратор или установка тестовой лаборатории.