POX — установка правила, которое говорит отправлять фиктивный пакет всякий раз, когда определенный пакет соответствует ofp_match.

Можно ли установить на коммутаторе правило, которое предписывает коммутатору сделать следующее:

If packet_in is TCP:
    send ( dummy packet )
    send (packet_in)
    send ( dummy packet)
else:
    send (packet_in)

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

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

Я понимаю, что могут быть лучшие способы сделать то, чего я пытаюсь достичь, — я открыт для предложений!

Спасибо


person renopos    schedule 19.03.2016    source источник


Ответы (1)


Насколько я знаю, ответ - нет, OpenFlow не поддерживает эту концепцию, не говоря уже о Pox. Pox может указать коммутатору сгенерировать пакет, но в таблице потоков нет записи с действием отправки этого другого пакета сюда.

Возможный способ, которым это может быть реализовано, заключается в следующем:

  1. Сопоставление протокола TCP и номера порта имеет два действия. Действие номер один отправляет пакет, действие номер 2 отправляет пакет в какую-то запасную таблицу для таблиц потоков.

  2. В этой таблице есть действие по изменению пакета для отправки этого фиктивного пакета. Вы не можете создать конкретный, но вы можете изменить IP-адрес назначения на какое-то бессмысленное значение или установить какую-то бессмысленную VLAN в качестве своего рода маркера sudo.

Изменить: пользователь попросил пояснить, что я имел в виду под запасной таблицей, поэтому я попытаюсь найти некоторые команды pox, чтобы показать процесс, который я планировал использовать. Во-первых, я бы посоветовал эту вики для многих основных команд pox. немного устарело и в некоторых случаях неверно, но в целом это очень полезно.

Говоря о запасной таблице, я говорю о концепции, которую поддерживает openflow 1.3, согласно которой все потоковые таблицы не должны быть единым списком для обработки. Вместо этого все пакеты могут отправляться в таблицу 0 для обработки, а затем, если действие указывает, что оно может отправить пакет, скажем, в таблицу 5 для расширенной обработки или более целенаправленной обработки на основе того, что найдено в таблице 0. Это позволяет выполнять более универсальные действия. Вы можете думать об этой новой концепции как о таблице таблиц или двумерном массиве, где конечными элементами являются записи потоковой таблицы. Извините, что слово «таблица» встречается часто, я бы хотел, чтобы они выбрали другое слово для этой концепции.

Pox по умолчанию не поддерживает эту концепцию, так как он использует OpenFlow1.0, однако есть расширение, которое включает его, и дополнительную информацию об этом можно найти здесь. Некоторые из важных частей можно найти ниже.

# Turn on Nicira packet_ins
msg = nx.nx_packet_in_format()
event.connection.send(msg)
# Turn on ability to specify table in flow_mods
msg = nx.nx_flow_mod_table_id()
event.connection.send(msg)
msg = nx.nx_flow_mod()
msg.priority = 1 # Low priority
msg.actions.append(of.ofp_action_output(port = of.OFPP_CONTROLLER))
msg.actions.append(nx.nx_action_resubmit.resubmit_table(table = 1))
event.connection.send(msg)
msg = nx.nx_flow_mod()
msg.table_id = 1
msg.priority = 1 # Low priority
msg.actions.append(of.ofp_action_output(port = of.OFPP_FLOOD))
event.connection.send(msg)

В этом примере включена поддержка нескольких таблиц, затем добавляется поток, который отправляет все пакеты на контроллер и в таблицу 1, оттуда в таблицу 1 входит поток, который говорит, что залить все пакеты. Надеюсь, это даст вам общее представление о том, как они работают.

Если вы еще не знаете, как редактировать пакеты с помощью pox, пример действия, которое можно добавить к списку действий для изменения mac-адреса назначения, будет следующим.

ofp_action_dl_addr.set_dst(EthAddr("01:02:03:04:05:06"))

Для vlan метод, который я предложил ранее, вы могли бы сделать

msg.actions.append(of.ofp_action_vlan_vid(vlan_vid=1234))
person arduic    schedule 23.03.2016
comment
Ардуик, спасибо! Я думаю, что понял основную идею вашего предложения по реализации, однако я не понимаю, что вы подразумеваете под «какой-то запасной таблицей для таблиц потоков». Не могли бы вы уточнить для меня? - person renopos; 24.03.2016
comment
Я отредактировал пост, чтобы он содержал краткое объяснение концепций работы с несколькими столами в OpenFlow/Pox. А также пример кода, который поможет вам попробовать и реализовать то, что я предлагаю. - person arduic; 24.03.2016
comment
Это здорово, спасибо. У меня было ощущение, что вы, возможно, говорите о Никире - это то, что я кратко изучил после прочтения вашего первоначального ответа прошлой ночью, но мне придется изучить это еще немного. Является ли пример, который вы предоставили, специфичным для предложенной вами реализации или просто пример?? Можно ли установить правило для одной таблицы, которое отправляет пакет как есть, а затем пересылает пакет в другую таблицу, которая затем редактирует заголовок VLAN и пересылает его как фиктивный? Затем я мог бы установить еще одно правило на каждом коммутаторе, утверждающее, что все пакеты с этим идентификатором VLAN отбрасываются? - person renopos; 24.03.2016
comment
Ага это все возможно. Как и в моем отрывке выше, вы можете заменить порт=of.OFPP_CONTROLLER просто портом=3 или любым другим пунктом назначения, который вы хотите. Затем оставьте таблицу = 1, это по существу вставляет 2 действия для этого потока, и оба выполняются. Во второй таблице вы могли бы просто иметь общее совпадение с редактированием vlan, как я предложил, и снова порт = 3 или что у вас есть, и на машине в конечном узле он увидит 2 пакета один с vlan и один без . Помните, что vlan был всего лишь единственным вариантом, который вы можете отредактировать практически в заголовке пакета, так что может быть что-то более подходящее. - person arduic; 24.03.2016
comment
Чтобы было ясно, что это всего лишь пример, в нем показана основная концепция использования расширения Nicira для поддержки нескольких столов. Думайте об этом действии таблицы как о еще одном действии, аналогичном тому, как вы можете отправить один пакет на несколько хостов, имея 2 действия, одно для порта 3 и одно для порта 4, это просто еще одно общее действие. - person arduic; 24.03.2016
comment
Спасибо за полезную информацию и советы - это ценно! - person renopos; 24.03.2016
comment
И последний вопрос: есть ли что-то еще, что я должен добавить в свой код, чтобы использовать функции nicira? Я понимаю, что должен импортировать его как обычно, однако мне нужно передать дополнительный аргумент в командную строку при запуске моего контроллера? - person renopos; 24.03.2016
comment
После импорта он должен работать без каких-либо дополнительных параметров командной строки. Просто помните, что первый блок кода, который я отправил, является примером, который будет помещен в событие ConnectionUp. Пока коммутатор не получит первые две отправки в этом блоке кода, он не будет понимать отправляемые пакеты. После отправки хотя вам не нужно повторять каждый раз. - person arduic; 24.03.2016
comment
Итак, если я укажу это, значит ли это, что последующие сообщения ofp не будут работать, и все они должны быть сообщениями nx? - person renopos; 24.03.2016
comment
В тот момент, когда я добавляю строки msg = nx.nx_packet_in_format() event.connection.send(msg), последующие пинги не достигают места назначения, и в журнале появляется следующее сообщение INFO:openflow.of_01:Vendor msg: ofp_vendor_generic заголовок: версия: 1 тип: 4 (OFPT_VENDOR) длина: 92 xid: 0 продавец: 8992 датален: 80 - person renopos; 24.03.2016
comment
хммм, не уверен, что я бы предложил прочитать руководство, на которое я ссылался. Честно говоря, я реализовал это в более старой версии OvS и в версии Pox dart. haryachyy.wordpress .com/2014/06/07/ Сообщения как ofp, так и nx должны работать в тандуме, nx не должен прерывать работу p, если что-то пошло не так. Возможно, когда пакеты nx впервые включены, они нарушают любые старые проверки потоков, если у вас все еще есть потоки на коммутаторе. - person arduic; 24.03.2016
comment
О, понятно... Весь блок кода, который вы отправили, должен быть в обработчике ConnectionUp?? Думаю, теперь я понимаю. Но что мне нужно сделать, так это убедиться, что настраиваются только TCP-пакеты. И только при выполнении определенного условия... Возможно ли это? - person renopos; 24.03.2016
comment
Да, да, оба эти вопроса верны. Мой пример был просто для того, чтобы показать вам, как включить эту концепцию в Pox. Я не собираюсь писать для вас все, что зависит от вас. - person arduic; 24.03.2016
comment
Конечно, не надеясь, что вы все напишете. Я был просто сбит с толку, потому что я никогда раньше не устанавливал правила в обработчике соединения. Я думаю, что если я установлю правило в обработчике соединения, чтобы пересылать все остальные пакеты как обычно и отправлять TCP-пакеты на контроллер, то обработчик PacketIn добавит правила нескольких таблиц для комбинации соответствия TCP/VLAN, это должно работать таким образом. . Мне просто нужно найти способ, чтобы правила, установленные в обработчике PacketIn, перезаписали правило «переадресация на контроллер», установленное в обработчике ConnectionUp... - person renopos; 24.03.2016
comment
Привет, arduic, ты знаешь что-нибудь о функции nx_match? - person renopos; 24.03.2016