отправка ICMP пакетов в scapy и выбор правильного интерфейса

можем ли мы использовать функцию srp() для пакета ICMP уровня 3? Я вижу, что когда мы создаем пакет Эхо-запроса ICMP и используем sr() для отправки/получения , мы не видим, как он отправляется из интерфейса, следовательно, нет ответа от места назначения. Но тот же пакет, если мы используем функцию srp (), мы видим ответ. Когда мы должны использовать sr () и когда srp ()? В документации говорится, что sr() должен использоваться для пакета L3, а srp () - для L2? Но в моем случае я не уверен, почему sr() не работа для пакета ICMP? Могут ли некоторые эксперты помочь мне понять?

также может кто-нибудь дать мне знать, если аргумент "iface" нужен всегда. Без этого как scapy узнает, через какой интерфейс он должен отправить пакет?

Case 1: sr() функция с iface в качестве аргумента:

sr(icmp,iface="eth0")

начать эмиссию:

WARNING: Mac address to reach destination not found. Using broadcast.
Finished to send 1 packets.
^C
Received 0 packets, got 0 answers, remaining 1 packets
(<Results: TCP:0 UDP:0 ICMP:0 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:1 Other:0>)

выше я не вижу ответа ICMP от IP 192.168.25.1

случай 2: sr() функция без длицо:

sr(icmp)   
.Begin emission:
......WARNING: Mac address to reach destination not found. Using broadcast.
.Finished to send 1 packets.
...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................^C
Received 887 packets, got 0 answers, remaining 1 packets
(<Results: TCP:0 UDP:0 ICMP:0 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:1 Other:0>)

если вы видите выше, полученные пакеты больше, но я не вижу ответа ICMP.

Случай 3: отправка пакета ICMP с srp () вместо sr ():

srp(icmp,iface="eth0")
Begin emission:
Finished to send 1 packets.
*
Received 1 packets, got 1 answers, remaining 0 packets
(<Results: TCP:0 UDP:0 ICMP:1 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>)

здесь я использовал функцию srp() вместо функции sr (), и теперь я вижу, что Эхо-запрос ICMP был отправлен правильно, и я также получил ответ.

>>> icmp.show2()
###[ Ethernet ]###
  dst: 02:00:00:11:01:03
  src: 02:00:20:ee:64:01
  type: 0x800
###[ IP ]###
     version: 4L
     ihl: 5L
     tos: 0x0
     len: 28
     id: 1
     flags:
     frag: 0L
     ttl: 64
     proto: icmp
     chksum: 0xc78c
     src: 192.168.25.2
     dst: 192.168.25.1
     options
###[ ICMP ]###
        type: echo-request
        code: 0
        chksum: 0xf7ff
        id: 0x0
        seq: 0x0
>>>                  

1 ответов


на на официальная документация API:

sr(pkts, filter=None, iface=None, timeout=2, inter=0, verbose=None, chainCC=0, retry=0, multi=0)

отправка и получение пакетов на уровне 3 с помощью conf.L3socket supersocket.

на :

srp(pkts, filter=None, iface=None, timeout=2, inter=0, verbose=None, chainCC=0, retry=0, multi=0, iface hint=None)

же srp но для работы на уровне 2 с conf.L2socket supersocket.

С вашей ICMP пакет имеет заполненные поля уровня 2, как показано на выходе ICMP.show2(), вы должны использовать . Если бы вы оставили их нетронутыми, как это было сделано в в этом уроке, вы могли бы использовать .


теперь, что касается вашего вопроса о ICMPклассификация как протокол уровня 2 или протокол уровня 3. Многие думают, что это протокол уровня 3, например здесь, так как он использует и "сидит" на в довершение всего. Однако, другие считают, что это протокол уровня 2, такие как здесь. это вопрос С некоторыми хорошими ответами на этот вопрос, но обратите внимание, что они относятся к OSI модель таким образом, нумерация схемы наслоения немного отличается. Это лучшее, что мне удалось найти, из здесь:

сам IP не имеет механизма для установления и поддержания соединения или даже содержит данные в качестве прямой полезной нагрузки. Internet Control Messaging Protocol-это просто дополнение к IP для передачи ошибок, маршрутизации и управления сообщениями и данными и часто рассматривается как протокол сетевого уровня.

EDIT-я только что столкнулся этой ссылке, и подумал, что стоит упомянуть:

ICMP-это протокол в стеке TCP/IP, который существует в основном для обеспечения контроля, устранения неполадок и сообщений об ошибках. Он работает по IP, как TCP и UDP, но является протокол сетевого уровня, такой как IP, а не протокол транспортного уровня, такой как TCP и UDP. (Да, это немного странно, что ICMP инкапсулируется в IP, находясь на том же уровне, что и IP. Но опять же, вы можете инкапсулировать IP внутри IP.)

RFC 792 также довольно ясно:

ICMP, использует основную поддержку IP, как если бы это был протокол более высокого уровня, однако ICMP на самом деле является неотъемлемой частью ИНТЕЛЛЕКТУАЛЬНАЯ СОБСТВЕННОСТЬ.

и так RFC 1122:

ICMP-это протокол управления, который считается неотъемлемой частью IP, хотя он архитектурно наслоен на IP, т. е. он использует IP для передачи данных из конца в конец, как это делает транспортный протокол, такой как TCP или UDP.
...
Хотя сообщения ICMP инкапсулируются в IP-датаграммах, обработка ICMP считается (и обычно реализуется как) часть IP слой.


что касается вашего последнего вопроса о явном указании интерфейса, см. scapy'ы руководство:

на send() функция позволит отправлять пакеты на уровне 3. То есть он будет обрабатывать маршрутизацию и уровень 2 для вас. The sendp() функция будет работать на уровне 2. Это зависит от вас, чтобы выбрать правильный интерфейс и правильный протокол уровня связи.

официальная документация API немного более подробно:

при запуске Scapy его таблицы маршрутизации синхронизируются с таблицей маршрутизации хоста. Для пакета, отправленного на уровне 3, IP-адрес назначения определяет выходной интерфейс, адрес источника и шлюз для использования. Для пакета уровня 2 выходной интерфейс может быть уточнен или подсказка может быть дана в виде IP для определения выходного интерфейса. Если нет выходного интерфейса или подсказки,conf.iface is используемый.

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

iface: слушайте ответы только на предоставленном интерфейсе

за намек на output интерфейс, используйте iface_hint для функций слоя 2:

существует также дополнительный параметр, iface_hint, которые дают подсказку, которая может помочь выбрать правый выходной интерфейс. По умолчанию, если не указано iface, это. Подсказка принимает форму IP-адреса, на который может быть назначен пакет уровня 2. Таблица маршрутизации Scapy (conf.route) используется для определения того, какой интерфейс использовать для достижения этого IP.