Осенняя школа по программно-конфигурируемым сетям и реализация в домашних условиях

в 8:57, , рубрики: openflow, OpenWrt, SDN, Песочница, пкс, Телекомы, метки: , , ,

В сентябре 2012 мне посчастливилось побывать на осенней школе по программно-конфигурируемым сетям центра прикладных исследований компьютерных сетей. На главное был приглашен Ник МакКеон, один из основателей и идейных вдохновителей SDN-сетей и OpenFlow в частности.

Основой практикума на оборудовании был перепрошитый коммутатор NEC неведомой в россии модели и несколько обычных роутеров tp-link 1043 с пропатченной OpenWrt (на самом деле просто пересобранной). Уже дома обнаружился роутер схожей модели, на котором я решил испробовать OpenFlow в действии уже в реальном мире. Но сначала о самой осенней школе.

2 Вдохновение и теория

Лекция начиналась с тех же картинок презентаций, которые доступны на стэндфордском сайте проекта OpenFlow. Однако смысловая нагрузка, добавленная Ником существенно уточняла и дополняла нехитрые графики презентации. Затем Ник рассказал и о новых проектах, в частности о автоматической верификации SDN, поиска колец в логической топологии, проверке применимости правил и т.д.

В течении лекции периодически случались брейки, на которых студенты и аспиранты засыпали Ника вопросами. Много вопросов Нику задать было сложно, та как Ник любит отвечать основательно и пространно, затрагивать смежные проблемы. В конце лекции я тоже попытался получить несколько ответов на насущные вопросы, возникшие как в течении, так и существовавшие до лекции. Особенно интересовало пояснение эксперимента коллег Ника с беспроводным вещанием и параллельной настройкой точек доступа на вещание видео с минимальными задержками, где один человек с ноутбуком ездил по кампусу Стэнфорда на машинке для гольфа и вещал видео с веб-камеры. Ник пояснил, что в точках доступа был прошит OpenWRT дистрибутив с самописным приложением для взаимодействия с OpenFlow (сейчас оно доступно как package).

Тут и зародилась идея попробывать реализовать этот эксперимент своими силами.

3 Первая практика

Второй день школы. Мы пробовали виртуальное окружение Mininet (OpenFlow tutorial), которое является симулятором топологии на виртуальных хостах. Подключили к виртуально созданной сети внешний контроллер OpenFlow. Вот тут то и началось настоящее веселье.

Контроллер POX написан на языке python, что уже явилось для многих большой проблемой. Хорошо у меня имелась книга по питону и Интернет (раньше ничего на нем не писал, только php, perl, cpp,c# и т.д.). Самое интересное, что документации по контроллеру POX кот наплакал, примеров и того меньше. Объектная модель POX явно писалась студентами в свободное время. Например, src-MAC адрес лежит в свойстве объекта packet_in.dl_src, который сам является результатом метода event.parse, а для получения src-IP адреса необходимо проверить тип пакета на протокол жутким способом (куча проверок на типы и вытаскивание различных свойств из каких то левых объектов), спарзить пакет до следующего заголовка (ip_hdr=packet_in.next), и достать оттуда объект ip_hdr.nw_src (network_ layer src). Как видно, объектную модель взаимодействия POX и приложения писали не сетевики, а чистые программисты. Нет единообразия названия методов, протоколов, свойств объектов, языку питон довольно безразлично, если вы ошибетесь вдруг в название объекта или свойства – он и новое создать может.

Дальше больше. Документация носит явно девелоперский характер и не предназначена для конечного использования. Правильные решения находились при перекопке исходников POX на предмет искомых свойств и примеров после бесцельного блуждания по единственному мануалу. Справедливости ради стоит отметить наличие довольно сносных примеров в мануале по поводу работы с канальным Ethernet уровнем и с отсылкой базовых правил OpenFlow на коммутатор. Кстати, за время работы (около 5 часов) POX отвалился «всего» 2 раза. Это к вопросу о надежности python приложений. При тестировании его родителя NOX (написанного на с++) такого не наблюдалось.

Небольшой пример. Код для установки правила канальной коммутации (что ethernet свичи практически не умеют) будет выглядеть так:

fm = of.ofp_flow_mod()
fm.match.in_port = 3  // Правила для сравнения поступившего пакета. Можно использовать несколько полей  
fm.actions.append(of.ofp_action_output(port = 4)) // Правило что делать, если сравнение с match успешно

тут четко прописано — все что свалилось на 3 порт уйдет на 4-й. Без вариантов.

На самом деле этот tutorial является самым полезным по пониманию SDN и того, как оно работает. К сожалению на оф. сайте tutorial нет пошаговых примеров, их успешно озвучивали и придумывали спикеры Школы, за что им большое спасибо. Без них, думается, половина людей просто бы не поняла, как это работает.

4 Оборудование

Третий день был посвящен реальному железу. Один коммутатор Nec ProgrammableFlow разделенный на несколько VLAN, четыре из которых находились под управлением OpenFlow, четыре маршрутизатора TP-Link 1043, перепрошитые под OpenWRT c OpenFlow патчем, виртуальных хоста с контроллерами, 16 виртуальных хостов, из которых собиралась сеть. Все хосты имели две сетевые – одна для управления нами (внешняя сеть, для ssh), другая для тестовой сети openflow. Всех разбили на 4 группы, топология была следующая – у каждой группы 3 хоста присоединены в коммутатор в нужный VLAN, четвертый в роутер к проводному порту (кстати беспроводной порт выглядит с точки зрения контроллера также как и проводной).

Подробная топология (без номеров портов и прочего):

Осенняя школа по программно конфигурируемым сетям и реализация в домашних условиях

Задач было несколько:

  1. поднять контроллер POX с дефолтным приложением (L2_learning) на нужном порту (6633) и интерфейсе. Тут проблем не было.
    root@openflowtutorial:/home/openflow/pox# ./pox.py forwarding.l2_learning
    POX 0.0.0 / Copyright 2011 James McCauley
    DEBUG:core:POX 0.0.0 going up...
    DEBUG:core:Running on CPython (2.7.1+/Apr 11 2011 18:05:24)
    DEBUG:forwarding.l3_learning:Up...
    INFO:core:POX 0.0.0 is up.
    DEBUG:openflow.of_01:Listening for connections on 0.0.0.0:6633
    Ready.
    INFO:openflow.of_01:[Con 4/150867562545] Connected to 00-00-00-00-00-01
    

    надпись

    INFO:openflow.of_01:[Con 1/1] Connected to 00-00-00-00-00-01

    говорит о успешном подключении контроллера.

  2. Провести тестирование (попарные пинги). К сожалению, не было установленного iperf, поэтому не получилось протестировать производительность. Пинги вели себя как и положено – при обучении около 100-200 мс, в нормальном режиме 0.1-10мс (ведь на виртуальных машинах поднято).
  3. Поднять систему виртуализации сети FlowVisor для абстрагирования инстансов OpenFlow от физической сети. Сначала все пытались понять, как оно работает. FlowVisor — двунаправленный псевдо-NAT-сервер (сервер подмены адресации), который с точки зрения коммутатора является полноценным контроллером, а с точки зрения контроллера – коммутатором. К FlowVisor подключается несколько коммутаторов. Он имеет систему фильтрации, и пакеты от коммутатора попадают только в тот контроллер, куда настроил администратор. Можно блокировать от FlowVisor порты или целые коммутаторы и строить альтернативную логическую структуру сети.
    Каждая команда поднимала свой FlowVizor на порту 6633, разделяла всю сеть на 4 сегмента, настраивала свой сегмент и ссылки на соседские контроллеры. Контроллеры теперь запускались на другом порту (6634) и видели все коммутаторы как localhost (натились).

    image

FlowVisor это отдельная песня. Программная реализация сего комплекса сделана на адской смеси c++, python и java, причем java используется для конфигурирования. Вводишь команду – поднимается вся java-машина, происходит конфигурирование и все – java больше не нужна. Одна команда исполняется секунды две. А команд надо много, каждая команда требует ввода пароля или указания файла с паролем (clear text). Сначала надо создать слайсы – логически разделенные части сети, закрепленные за конкретным контроллером. Затем в каждый слайс надо добавить правила фильтров, что попадает в слайс, а что нет. Можно создать один дефолтный слайс, куда пойдет весь неклассифицированный трафик.

5 Делаем дома

Был найден tplink 741. При изучении сайта OpenWrt выяснилось, что OpenWrt на мою ревизию железа (v2.1) не ставится. Однако на форме говорят, что работает. Ставим Ubuntu на виртуалку и библиотеки (смотрим на сайте openwrt), льем исходники

svn co svn://svn.openwrt.org/openwrt/branches/backfire

Затем отдельно заливаем OpenFlow функциональность как пакет. Небольшое отступление — на компиляцию базовой берсии без web ушло 6 Гб, будте внимательны.

cd  backfire/package
git clone git://gitosis.stanford.edu/openflow-openwrt

И, главное, выбрать правильный бранч под архитектуру. У моего tplink это Atheros 71xx

cd openflow-openwrt
git checkout -b openflow-1.0/ar71 origin/openflow-1.0/tplink

Затем очень желательно обновить фиды порта openwrt. Идем в каталог backfire и

./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig

В меню выбираем Atheros AR71xx, TP-Link WR741ND v1 (как выяснилось, работает v1), в пакетах выбираем kmod-tun(Kernel Modules->Network Support), tc и OpenFlow(network). Сохраняемся, выходим.

Осенняя школа по программно конфигурируемым сетям и реализация в домашних условиях

Как выяснилось потом, нужно еще в ядро добавить QoS HTB, без него все очень медленно.

make kernel_menuconfig

Включить Hierarchical Token Bucket (HTB) (Networking Support->Networking options->QoS and/or fair queueing)
Сборка происходит обычным make, заняла около часа и 6 Гб места.

В папке bin/ar71xx будет, кроме всего прочего, файл openwrt-ar71xx-tl-wr741nd-v1-squashfs-sysupgrade.bin (есть еще -factory.bin, он для первоначальной прошивки openwrt)

Заливку на девайс лучше производить из какой-нибудь уже прошитой openwrt (например для v1) через scp (ssh cp). Заходим по ssh в OpenWrt и

scp root@ip_виртуалки:/путь_до_файла/openwrt-ar71xx-tl-wr741nd-v1-squashfs-sysupgrade.bin /tmp
sysupgrade -v /tmp/openwrt-ar71xx-tl-wr741nd-v1-squashfs-sysupgrade.bin

Как ни странно, все заработало с первого раза.


ps aux | grep ofprotocol
 976 root      1040 S    ofprotocol tcp:127.0.0.1:6634 tcp:192.168.1.10:6633 

Настройка самого OpenFlow занимает немного времени

cd /etc/config
vi openflow
config 'ofswitch'
	option 'dp' 'dp0'
	option 'ofports' 'eth0.0 eth0.1 eth0.2 eth0.3 '
	option 'ofctl' 'tcp:192.168.1.102:6633'
	option 'mode'  'outband'

Запускаем контролер сети (я взял POX как самый простой) —

root@openflowtutorial:/home/openflow/pox# ./pox.py forwarding.l3_learning
POX 0.0.0 / Copyright 2011 James McCauley
DEBUG:core:POX 0.0.0 going up...
DEBUG:core:Running on CPython (2.7.1+/Apr 11 2011 18:05:24)
DEBUG:forwarding.l3_learning:Up...
INFO:core:POX 0.0.0 is up.
DEBUG:openflow.of_01:Listening for connections on 0.0.0.0:6633
DEBUG:openflow.of_01:[Con 1/None] Socket error: Broken pipe
DEBUG:openflow.of_01:[Con 1/None] disconnecting
Ready.
INFO:openflow.of_01:[Con 4/150867562545] Connected to 00-23-20-68-50-31

Все подключилось, можно ипользовать. Единственное, что напрягло — Socket error: Broken pipe. Контроллер стал регулярно отваливаться (на то он и POX).

Что использовалось при написании поста

  1. Центр прикладных исследований компьютерных сетей — Сама школа по ПКС
  2. OpenFlow site — все там, и вики, и tutorial
  3. Wiki openwrt — без него никак

Автор: CrezZ

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js