Помещать все пакеты, полученные на сетевой карте, в стек TCP / IP

Можно ли отправить все пакеты, полученные от сетевой карты, в стек TCP / IP, даже если их адрес Ethernet не совпадает с моим адресом Ethernet? Другими словами, я хочу обрабатывать все входящие пакеты на моем сетевом адаптере. Может ли кто-нибудь упомянуть возможный сценарий изменения кода драйвера сетевого интерфейса? Как я могу проверить работу кода драйвера?


person MSH    schedule 02.12.2013    source источник
comment
Я уверен, что такое беспорядочное прослушивание возможно, но вам может потребоваться специальный драйвер и сетевая карта, которая его поддерживает. Такой режим, вероятно, будет «эксклюзивным использованием только» для одного процесса / потока и, вероятно, также будет запрещать передачу.   -  person Martin James    schedule 02.12.2013
comment
Я знаю, что это возможно, установив флаг IFF-PROMISCUOUS, но в этом режиме драйвер не отправляет пакеты в стек TCP / IP! Можно ли изменить код диска?   -  person MSH    schedule 02.12.2013
comment
Они могут не быть сегментами TCP / IP - сетевой адаптер не знает, он знает только MAC-адреса. Даже если бы это было так, было бы неразумно передавать буферы данных в стек TCP, который не участвовал в инициировании или управлении соединениями.   -  person Martin James    schedule 03.12.2013
comment
Не знаю, как это сделать, но мой .2: Возможно, поможет использование сырого сокета? И / или проверьте, может ли tcpdump это сделать?   -  person kaiwan    schedule 03.12.2013
comment
@kaiwan. Используя tcpdump или raw socket, пакеты отправляются на уровень пользователя напрямую, но я хочу отправить их в стек TCP / IP.   -  person MSH    schedule 03.12.2013
comment
Можно было бы протолкнуть их на уровень IP, но TCP? Забудь это! Как бы вы accept() уже существующее соединение? Какую розетку вы бы использовали?   -  person Guido    schedule 03.12.2013
comment
@Guido. Я не понимаю ваших слов, объясните, пожалуйста, подробнее.   -  person MSH    schedule 04.12.2013
comment
@ Мартин Джеймс. tcpdump устанавливает этот режим для драйвера устройства, но даже в этом режиме мы можем отправлять запрос на сервер и получать от него ответ, поэтому пакеты должны отправляться в стек TCP / IP и получать от него ответные пакеты.   -  person MSH    schedule 04.12.2013


Ответы (1)


В типичной системе это уже происходит. То есть все, что вам нужно сделать, это перевести интерфейс в неразборчивый режим. Затем драйвер отправляет все полученные пакеты в стек TCP / IP. Проверьте любой обычный сетевой драйвер, вы увидите, что при обработке полученных пакетов не происходит сравнения MAC-адреса (или Ethernet-адреса) с MAC-адресом устройства.

Значительное упрощение:

Обычно происходит то, что, когда у вас не включен неразборчивый режим, драйвер настраивает устройство таким образом, что оно фильтрует по определенному MAC-адресу, доставляя только кадры с совпадающим адресом или широковещательным адресом ( или иногда адрес многоадресной рассылки, который может также фильтроваться, а может и не фильтроваться). Когда вы включаете неразборчивый режим, драйвер просто сообщает устройству не фильтровать по MAC-адресу, а доставлять все кадры. Затем драйвер получит все кадры и доставит их в стек. В Linux это обычно происходит через вызов netif_receive_skb () или его вариант.

Сам стек TCP / IP не заботится об MAC-адресе. Вместо этого он будет искать пакеты с адресом IP, совпадающим с его собственным. Любые полученные пакеты, у которых нет IP-адреса, принадлежащего этому ящику, просто отбрасываются - если только программа пользовательского режима не пытается получить необработанные пакеты (например, tcpdump). [В последнем случае он все равно отбрасывается после доставки в tcpdump.]

Если он совпадает с IP-адресом, он затем передается по стеку в TCP или UDP [и т. Д.] - где он также может быть отброшен, если он не соответствует сеансу / порту, о котором заботится что-либо в коробке.

Но обычно пакеты, предназначенные для MAC-адреса, не совпадающего с адресом, назначенным этому устройству, не будут пакетами, которые важны для этой машины. Следовательно, неразборчивый режим обычно включен только для отладки, устранения неполадок, криминалистической экспертизы (например, tcpdump, wirehark и т. Д.). В остальное время это пустая трата ресурсов обработки, поскольку пакеты просто отбрасываются.

person Gil Hamilton    schedule 13.12.2013