2014-10-09 2 views
6

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

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

Случай 1: стер функция() с IFACE в качестве аргумента:

sr(icmp,iface="eth0") 

Begin излучение:

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() без iface:

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() вместо стер():

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() функцию вместо стер() функции, и теперь я вижу, что эхо-запрос 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 
>>>     

ответ

3

sr функции согласно official API documentation:

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

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

srp функции:

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(), вы должны использовать функцию srp.Если бы вы оставили их нетронутыми, как это сделано в this tutorial, вы могли бы использовать функцию sr.


Теперь, что касается вашего вопроса о классификации ICMP «s в качестве протокола уровня 2 или протокола 3-го уровня. Многие считают, что это протокол уровня 3, такой как here, так как он использует заголовок IP и «сидит» поверх него. Однако другие считают, что это протокол уровня 2, такой как here. This is a question с некоторыми хорошими ответами на эту проблему, но обратите внимание, что они относятся к модели OSI, поэтому нумерация схемы слоев немного отличается. Это лучшее, что я смог найти, из here:

сам

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

EDIT - Я только что столкнулся с this link, и подумал, что стоит упомянуть:

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

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

ICMP использует базовую поддержку IP, как если бы это был протокол более высокого уровня, однако ICMP на самом деле является неотъемлемой частью IP.

И так RFC 1122:

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


Что касается вашего последнего вопроса о явном виде с указанием интерфейса см scapy's tutorial:

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

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

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

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

IFACE: слушать ответы только на условии интерфейса

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

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

+1

Great Yoel. Я создал ICMP-пакет без предоставления Ether(), и я заметил, что sr() работает, как упоминалось. Я также заметил, что таблица маршрутизации в scapy не синхронизирована. Я перепробовал его, и теперь он принял правильный выход iface для sr(). Спасибо за ваш быстрый ответ. – Pradeep

Смежные вопросы