Пакетный сокет в случайном режиме принимает только локальный трафик
У меня есть сокет, созданный с 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 ответа
Наряду с предложением Роба Джонса, попробуйте такой инструмент, как Wireshark, чтобы убедиться, что вы получаете пакеты, ожидаемые на интерфейсе. По крайней мере, это подтвердит (или опровергнет), что у вас есть проблемы с вашим кодом.
Также необходимо убедиться, что сам интерфейс установлен в случайный режим. Если нет, то вы можете использовать ioctl(), чтобы установить его:
ifr.ifr_flags |= IFF_PROMISC;
if( ioctl(sock, SIOCSIFFLAGS, &ifr) != 0 )
{
// handle error here
}
Пока ваше приложение работает, убедитесь, что ifconfig сообщает флаг PROMISC для этого интерфейса.
Обратите внимание, что это нужно будет выполнить как привилегированный пользователь.
Попробовал код, как представлено. Работает для меня. Конечно (из-за теста в строке 102) это будет печатать только детали для трафика TCP.
Попробуйте использовать SOCK_PACKET в качестве второго аргумента для socket(), а не SOCK_RAW.
Если вы находитесь на коммутаторе, вы, вероятно, увидите только пакеты, предназначенные или исходящие с вашего компьютера. Попробуйте концентратор.
Это, вероятно, не проблема программного обеспечения.
Вы, вероятно, используете не то оборудование. Ваш компьютер, вероятно, подключен к коммутатору. Коммутаторы достаточно умны, чтобы "узнать", какие компьютеры и на каких портах, и направлять трафик только туда, куда он должен идти. Следовательно, коммутатор фильтрует ваши пакеты для вас.
Чтобы это исправить, вам нужно получить концентратор. Хотя концентраторы и коммутаторы выглядят очень похоже, они работают по-разному. Концентратор тупой и будет направлять весь трафик на все порты, что позволит вам видеть другой трафик в случайном режиме.
Обратите внимание, что даже если вы замените устройство, к которому подключен ваш компьютер, оно, вероятно, будет подключено к большему количеству коммутаторов в восходящем направлении, что также ограничит трафик. Следовательно, вы не сможете прослушивать трафик с гораздо большего расстояния, чем ваш собственный концентратор или тестовая лаборатория.
Ваш порт коммутатора также должен быть настроен соответствующим образом (порт SPAN в мире Cisco). Смотрите здесь для более подробной информации:
http://www.winpcap.org/misc/faq.htm
И вот информация от Cisco относительно того, как работают порты SPAN:
http://www.cisco.com/en/US/products/hw/switches/ps708/products_tech_note09186a008015c612.shtml