отправка 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 для вас. Thesendp()
функция будет работать на уровне 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.