- PVSM.RU - https://www.pvsm.ru -
В сентябре 2012 мне посчастливилось побывать на осенней школе [1] по программно-конфигурируемым сетям центра прикладных исследований компьютерных сетей [2]. На главное был приглашен Ник МакКеон, один из основателей и идейных вдохновителей SDN-сетей и OpenFlow в частности.
Основой практикума на оборудовании был перепрошитый коммутатор NEC неведомой в россии модели и несколько обычных роутеров tp-link 1043 с пропатченной OpenWrt (на самом деле просто пересобранной). Уже дома обнаружился роутер схожей модели, на котором я решил испробовать OpenFlow в действии уже в реальном мире. Но сначала о самой осенней школе.
Лекция начиналась с тех же картинок презентаций, которые доступны на стэндфордском сайте проекта OpenFlow. Однако смысловая нагрузка, добавленная Ником существенно уточняла и дополняла нехитрые графики презентации. Затем Ник рассказал и о новых проектах, в частности о автоматической верификации SDN, поиска колец в логической топологии, проверке применимости правил и т.д.
В течении лекции периодически случались брейки, на которых студенты и аспиранты засыпали Ника вопросами. Много вопросов Нику задать было сложно, та как Ник любит отвечать основательно и пространно, затрагивать смежные проблемы. В конце лекции я тоже попытался получить несколько ответов на насущные вопросы, возникшие как в течении, так и существовавшие до лекции. Особенно интересовало пояснение эксперимента [3] коллег Ника с беспроводным вещанием и параллельной настройкой точек доступа на вещание видео с минимальными задержками, где один человек с ноутбуком ездил по кампусу Стэнфорда на машинке для гольфа и вещал видео с веб-камеры. Ник пояснил, что в точках доступа был прошит OpenWRT дистрибутив с самописным приложением для взаимодействия с OpenFlow (сейчас оно доступно как package [4]).
Тут и зародилась идея попробывать реализовать этот эксперимент своими силами.
Второй день школы. Мы пробовали виртуальное окружение Mininet (OpenFlow tutorial [5]), которое является симулятором топологии на виртуальных хостах. Подключили к виртуально созданной сети внешний контроллер 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 нет пошаговых примеров, их успешно озвучивали и придумывали спикеры Школы, за что им большое спасибо. Без них, думается, половина людей просто бы не поняла, как это работает.
Третий день был посвящен реальному железу. Один коммутатор Nec ProgrammableFlow разделенный на несколько VLAN, четыре из которых находились под управлением OpenFlow, четыре маршрутизатора TP-Link 1043, перепрошитые под OpenWRT c OpenFlow патчем, виртуальных хоста с контроллерами, 16 виртуальных хостов, из которых собиралась сеть. Все хосты имели две сетевые – одна для управления нами (внешняя сеть, для ssh), другая для тестовой сети openflow. Всех разбили на 4 группы, топология была следующая – у каждой группы 3 хоста присоединены в коммутатор в нужный VLAN, четвертый в роутер к проводному порту (кстати беспроводной порт выглядит с точки зрения контроллера также как и проводной).
Подробная топология (без номеров портов и прочего):
Задач было несколько:
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
говорит о успешном подключении контроллера.
FlowVisor это отдельная песня. Программная реализация сего комплекса сделана на адской смеси c++, python и java, причем java используется для конфигурирования. Вводишь команду – поднимается вся java-машина, происходит конфигурирование и все – java больше не нужна. Одна команда исполняется секунды две. А команд надо много, каждая команда требует ввода пароля или указания файла с паролем (clear text). Сначала надо создать слайсы – логически разделенные части сети, закрепленные за конкретным контроллером. Затем в каждый слайс надо добавить правила фильтров, что попадает в слайс, а что нет. Можно создать один дефолтный слайс, куда пойдет весь неклассифицированный трафик.
Был найден 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).
Автор: CrezZ
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/openwrt/16229
Ссылки в тексте:
[1] осенней школе: http://habrahabr.ru/post/150529/
[2] центра прикладных исследований компьютерных сетей: http://arccn.ru/
[3] эксперимента: http://www.youtube.com/watch?v=ov1DZYINg3Y&list=PL0E8ACB19A8B5E17A&index=8&feature=plpp_video
[4] package: http://www.openflow.org/wk/index.php/OpenFlow_1.0_for_OpenWRT
[5] OpenFlow tutorial: http://www.openflow.org/wk/index.php/OpenFlow_Tutorial
[6] Image: http://radikal.ru/F/s017.radikal.ru/i405/1209/d3/6400e1d9cab7.jpg.html
[7] Image: http://radikal.ru/F/s001.radikal.ru/i193/1209/ac/8768fcb1bbaa.png.html
[8] OpenFlow site: http://openflow.org
[9] Wiki openwrt: http://wiki.openwrt.org/
Нажмите здесь для печати.