Pox проактивное правило открытого потока

Я создал правило для добавления к открытому vswitch, когда он подключается к контроллеру. Правило позволяет h1 обмениваться данными с h2, которые находятся на одном коммутаторе. Приведенное ниже правило добавляется, когда появляется соединение с контроллером.

event.connection.send(
                of.ofp_flow_mod(action=of.ofp_action_output(port=1), priority=45,
                                match=of.ofp_match(dl_type=0x800, nw_dst="10.0.0.7")))

По какой-то причине поток не будет работать, но если я изменю его, чтобы он соответствовал использованию портов вместо IP, он будет работать. Поскольку существует несколько коммутаторов, я не могу просто сопоставить только порты.

сначала я подумал, что, возможно, ICMP не был IPV4, но я подтвердил, что он использует Tcpdump.

sudo tcpdump -e -r tcpdump.pcap dst 192.168.0.103
reading from file tcpdump.pcap, link-type EN10MB (Ethernet)
14:24:30.940749 00:a0:98:ae:2c:fe (oui Unknown) > 00:1d:ec:0e:0b:fa (oui Unknown), ethertype IPv4 (0x0800), length 98: 192.168.0.112 > 192.168.0.103: ICMP echo request, id 1962, seq 1, length 64

сеть состоит из магистрального коммутатора, подключенного к 2 листовым коммутаторам и 2 хостам на листовой коммутатор.

Любая помощь будет принята с благодарностью.

def _handle_ConnectionUp(self, event):
        #dpid = event.connection.dpid
        # printing the dpid
        # log.info("Switch with DPID of %s has come up.",dpid_to_str(event.dpid))
        print("Switch with DPID of %s has come up." % (dpid_to_str(event.dpid)))

        # printing the dpid in hex
        # log.info("Switch with DPID in HEX format of %s has come up." % (hex(event.dpid)))
        print("Switch with DPID in HEX format of %s has come up." % (hex(event.dpid)))

        if event.dpid == 0x1:

            event.connection.send(
                of.ofp_flow_mod(action=of.ofp_action_output(port=2), priority=45,
                                match=of.ofp_match(in_port = 1)))
            event.connection.send(
                of.ofp_flow_mod(action=of.ofp_action_output(port=1), priority=45,
                                match=of.ofp_match(dl_type=0x800, nw_dst="10.0.0.1")))

person Grimeire    schedule 22.12.2017    source источник
comment
Могут ли пакеты ARP перемещаться из h1 в h2 и обратно? Если вы запустите arp на h1, узнает ли он аппаратный адрес h2?   -  person pchaigno    schedule 22.12.2017
comment
нет. не должно ли наличие потока означать, что arp больше не нужен?   -  person Grimeire    schedule 22.12.2017
comment
Насколько я знаю, ARP все еще нужен. Ваша операционная система должна знать, какой аппаратный адрес писать в пакете. Полный ответ напишу дома.   -  person pchaigno    schedule 22.12.2017
comment
Ты был прав. Как только я настроил таблицу Mac, она сработала. написать ответ и плохо принять. Спасибо за помощь. странно, как это работало, когда у меня был только входной порт в качестве совпадения.   -  person Grimeire    schedule 22.12.2017
comment
Рад, что смог помочь! Я разместил полный ответ ниже.   -  person pchaigno    schedule 23.12.2017


Ответы (1)


В типичной сети L2 два хоста должны взаимодействовать с протоколом ARP для обмена аппаратными адресами, прежде чем они смогут пинговать (или использовать любой другой протокол на основе IP) друг друга.

Мой лучший гость заключается в том, что с вашей текущей конфигурацией h1 может отправить запрос ARP на h2 (благодаря правилу для входного порта), но h2 не может ответить. Таким образом, h1 не знает аппаратного адреса h2 и не может отправлять ему IP-пакеты. Чтобы проверить эту гипотезу, вы можете запустить:

$ arp
Address               HWtype  HWaddress           Flags Mask            Iface
10.0.0.7                      (incomplete)                              eno1
10.0.0.254            ether   00:00:00:00:00:08   C                     eno1

Вот, например, адрес 10.0.0.7 неизвестен.

У вас есть как минимум два решения:

  1. Вручную установите новые записи ARP в h1 и h2. См. arp -h.
  2. Пусть h1 и h2 взаимодействуют через ARP, добавляя необходимые правила.
person pchaigno    schedule 22.12.2017