Как отправить пакет через определенный интерфейс, используя scapy, когда вы подключены к 2 сетям? - PullRequest
1 голос
/ 03 апреля 2019

У меня на компьютере установлено две карты Ethernet, поэтому у меня два интерфейса. Эти два интерфейса подключены к двум интерфейсам маршрутизатора. Такие что:

PC_INT_A --- Сеть1 ---> ROUTER_INT_1

PC_INT_B --- Сеть2 ---> ROUTER_INT_2

Все интерфейсы полностью настроены для связи IPv6. Ping6 работает хорошо через командную строку.

Но когда я пытаюсь отправить через scapy, пока обе сети подключены. Я могу отправить только первый интерфейс в коде. Или я должен отключить одну конкретную сеть.

См. Ниже код:

def ns_with_ll(src, dst):
       base = IPv6(src=src, dst=dst, nh=58, hlim=255)
       ns = ICMPv6ND_NS(tgt=dst)
       ll = ICMPv6NDOptSrcLLAddr()
       pkt = base / ns / ll
       return pkt

if __name__ == '__main__':
    SRC_A = 'IPV6_ADDR_OF_ETH0'
    SRC_B = 'IPV6_ADDR_OF_ETH1'
    DST_1 = 'IPV6_ADDR_ROUTER_INT_1'
    DST_2 = 'IPV6_ADDR_ROUTER_INT_2'

    ns_a = ns_with_ll(SRC_A, DST_1)
    ns_b = ns_with_ll(SRC_B, DST_2)

    sr(ns_a, iface='eth0')
    sr(ns_b, iface='eth1')

Приведенный выше код выводит меня следующим образом:

Begin emission:
*Finished sending 1 packets.

Received 1 packets, got 1 answers, remaining 0 packets
Begin emission:
Finished sending 1 packets.
..........................................................................

Он продолжает ждать ответа от интерфейса eth1.

Если я меняю порядок отправки пакетов в коде, как будто я отправляю пакет сначала на eth1. Я получаю ответ от eth1, и он продолжает ждать ответа от eth0.

Я также проверяю Wireshark, но не получаю никакого пакета для второго интерфейса.

Я тоже пробовал то же самое с отправкой ICMPv6EchoRequest, он ведет себя так же.

Может кто-нибудь сказать мне, как одновременно работать с несколькими сетями, используя scapy. Я использую Scapy версии 2.4.2 с Python 3.4?

1 Ответ

1 голос
/ 08 апреля 2019

Привет!

В Scapy у вас есть два способа отправки пакетов. «Уровень 3 пути», который использует внутреннюю таблицу маршрутизации (conf.route), и «уровень 2 пути», который отправляет пакет по заданному интерфейсу (conf.iface по умолчанию).

send() - это функция "layer 3" (поэтому она опирается на таблицу маршрутизации Scapy), в то время как sendp() - это функция "layer 2" (она имеет необязательный параметр iface= и будет использовать conf.iface by дефолт). То же самое для sr() и srp().

Так что в вашем случае использование srp() вместо sr() и предоставление слоя Ether() должно работать:

if __name__ == '__main__':
[...]
    srp(Ether() / ns_a, iface='eth0')
    srp(Ether() / ns_b, iface='eth1')
...