Управляющая консоль Xentaur

Материал из Xgu.ru

Перейти к: навигация, поиск
stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.

Если вы считаете, что её стоило бы доработать как можно быстрее, пожалуйста, скажите об этом.

Автор: Игорь Чубин
Короткий URL: xentaur/console

< Xentaur

Управляющая консоль Xentaur — автоматизированный механизм управления устройствами через их стандартный интерфейс.

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

Механизм позволяет автоматизировать процесс начальной настройки систем. Как правило, этот процесс содержит много рутинных операций, которые всегда хочется переложить на компьютер. Например, настройку IP-адресов, маршрутизации, начальных учётных записей, паролей для доступа к ним, различных интерфейсов для сетевого доступа и множество других.

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


Для примера рассмотрим простейшую задачу. Мы хотим развернуть виртуальную сеть, заданной топологии, состоящую из нескольких маршрутизаторов, различной архитектуры (пусть это будет несколько виртуальных маршрутизаторов Cisco и несколько систем quagga, работающих под управлением Linux или FreeBSD). Для того чтобы сделать задачу более общей, пусть сеть состоит не только из виртуальных устройств, но в её состав входит ещё и несколько реальных устройств.

Мы описываем топологию сети. Дальше она должна быть создана.

У всех устройств должны быть настроены IP-адреса на интерфейсах. IP-адреса должны подчиняться какому-то простому функциональному или табличному закону. Между всеми устройствами должна быть поднята динамическая маршрутизация. На всех устройствах должны быть установлены имена.


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

В Xentaur используется следующий подход. Консоли всех устройств подключаются через оконный менеджер screen. Каждая консоль занимает одно окно screen. Управляющая консоль, фактически представляющая собой интерпретатор ipython, с загруженными модулями Xentaur, тоже работает в одном из окон screen. Управление происходит с её помощью.

Команды Xentaur это просто функции python, доступные из интерпретатора ipython. Фактически, управление средой происходит прямо изнутри её: администратор попадает прямо внутрь программы и вызывает её функции, оперируя с её объектами.

Команды консоли можно разделить на две группы:

* команды по управлению собственно виртуальной сетью;
* команды по настройке виртуальных устройств.

Команды для управления топологией, воздействуют на состояние узлов и связей.

Виртуальные машины:

  • Создание
  • Удаление
  • Перезагрузка
  • Изменение конфигурации

Связи:

  • Создание
  • Удаление
  • Изменение свойств (задержка, потери)
  • Запись трафика

Команды по управлению устройствами воздействуют на управляющие консоли устройств.

При выполнении внутри консоли ipython команд для управления устройствами генерируются текстовые последовательности, передающиеся screen, который в свою очередь передает их в консоли устройств.

Такой подход не зависит от природы устройств (то есть, от того, являются ли они реальными или виртуальными), а также от того, каким образом к ним осуществляется доступ (xm console, minicom, ssh, telnet).

Использование ipython для управления имеет несколько преимуществ:

  • гибкость (можно выполнять любые действия с машинами и соединениями, которые только можно описать на языке python);
  • полный доступ к структурам данных (управление происходит изнутри системы, поэтому пользователю доступны все структуры данных и код, доступный изнутри самого приложения);
  • простота развития (в ходе экспериментов могут быть выработаны удачные программные конструкции, которые впоследствии можно интегрировать в код Xentaur или его модулей, и тем самым расширить его функционал);
  • богатство инструментария, доступное из ipython (базы данных, статистический анализ и прочий математический аппарат python);
  • Мягкая кривая изучения (использование языка python позволяет обойтись без изучения нового языка конфигурирования).

Такой подход обладает следующими преимуществами:

  • гибкость (можно выполнять любые действия с машинами и линками, которые только можно описать на языке python)
  • простота развития (в ходе экспериментов могут быть выработаны удачные программные конструкции, которые впоследствии можно интегрировать в код Xentaur или его модулей и тем самым расширить его функционал)

Содержание

[править] Приёмы работы с ipython

[несколько слов об ipython]

[править] Объекты

Каждому объекту сети сопоставлен программный, объект, при помощи которого происходит управление объектом сети.

Список узлов сети называется nodes, а мостов -- bridges.

Просмотреть эти списки можно, если просто ввести их названия в приглашение.

In [1]: bridges
Out[1]: ['br1', 'br2', 'br3', 'br4', 'br5', 'br6', 'cat1', 'cat2']

In [2]: nodes
Out[2]: 
['qua1',
 'qua2',
 'dyn3',
 'qua4',
 'qua5',
 'dyn6',
 'cisco1',
 'linux1',
 'windows1',
 'mac1']

Объекты узлов доступны по имени n_имя, где имя ­--- это имя соответствующего узла.

Объекты мостов доступны по имени b_имя.

Операции, которые можно выполнить с соответствующим объектом, доступны как методы этого объекта. Просмотреть их список можно, если набрать имя объекта, поставить . и нажать табуляцию.

In [6]: b_br2.<Tab>
b_br2.__class__       b_br2.down            b_br2.is_real
b_br2.__doc__         b_br2.dump_start      b_br2.is_turned_down
b_br2.__init__        b_br2.graphviz_line   b_br2.name
b_br2.__module__      b_br2.is_cross        b_br2.show
b_br2.a               b_br2.is_hidden       b_br2.up

Выполнить какую-либо операцию можно если набрать её имя полностью и нажать Enter. Обязательно в конце вызова нужно поставить символы (), даже если операция не требует аргументов.

In [7]: b_br2.down()
Bridge br2 is turned down already

[править] Работа с узлами

[править] Запуск, останов и перезапуск узлов

[править] Создание новых узлов

[править] Работа с виртуальной сетью

[править] Работа с мостами

Здесь service0 — имя моста, с которым выполняются операции.

In [1]: b_service0.show()
272: service0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc noqueue 
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff

In [2]: b_service0.down()

In [3]: b_service0.show()
272: service0: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue 
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff

In [4]: b_service0.up()

In [5]: b_service0.show()
272: service0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc noqueue 
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff

[править] Работа с интерфейсами

  • int_disconnect(domain, int_number) — отключить подключённый интерфейс
  • int_connect(domain, int_number, bridge) — подключить ранее отключённый
  • int_reconnect(domain, int_number, bridge) — переподключить подключённый интерфейс к новому мосту
  • show_int(domain, int_number) — вернуть имя моста, к которому подключен интерфейс
In [6]: vbridges_table
Out[6]: 
{'dyn1': ['vlan101', 'vlan102'],
 'dyn2': ['vlan101', 'vlan103'],
 'dyn3': ['vlan102', 'vlan103', 'vlan104'],
 'qua4': ['vlan105', 'vlan106', 'vlan111'],
 'qua5': ['vlan110', 'vlan111'],
 'qua6': ['vlan109', 'vlan110'],
 'qua7': ['vlan108', 'vlan109'],
 'qua8': ['vlan107', 'vlan108'],
 'qua9': ['vlan106', 'vlan107']}

In [7]: int_disconnect('dyn1',0)

In [8]: vbridges_table
Out[8]: 
{'dyn1': ['', 'vlan102'],
 'dyn2': ['vlan101', 'vlan103'],
 'dyn3': ['vlan102', 'vlan103', 'vlan104'],
 'qua4': ['vlan105', 'vlan106', 'vlan111'],
 'qua5': ['vlan110', 'vlan111'],
 'qua6': ['vlan109', 'vlan110'],
 'qua7': ['vlan108', 'vlan109'],
 'qua8': ['vlan107', 'vlan108'],
 'qua9': ['vlan106', 'vlan107']}

In [9]: int_connect('dyn1', 0, 'vlan107')

In [10]: vbridges_table
Out[10]: 
{'dyn1': ['vlan107', 'vlan102'],
 'dyn2': ['vlan101', 'vlan103'],
 'dyn3': ['vlan102', 'vlan103', 'vlan104'],
 'qua4': ['vlan105', 'vlan106', 'vlan111'],
 'qua5': ['vlan110', 'vlan111'],
 'qua6': ['vlan109', 'vlan110'],
 'qua7': ['vlan108', 'vlan109'],
 'qua8': ['vlan107', 'vlan108'],
 'qua9': ['vlan106', 'vlan107']}

[править] Запись трафика на мосту

  • bridge.dump_start(filter, port) — записать трафик, передающийся через мост bridge. Необязательный параметр filter (в формате Berkeley Packet Filter) указывает, какой именно трафик должен быть записан. При его отсутствии записывается весь трафик, передающийся через мост
In [1]: b_service0.dump_start()
Writing dump... (press Ctrl-C to stop)
Done.
 Dump is written to xentaur.dump
Out[1]: 0

Записанный трафик можно впоследствии проанализировать с помощью wireshark:

%# wireshark -r xentaur.dump

Можно просматривать трафик непосредственно в реальном времени, как изнутри системы, на которой выполняются виртуальные системы, так и удалённо.

Запись трафика для просмотра по сети начинается командой:

In [1]: b_service0.dump_start(port=3020)
Writing dump... (press Ctrl-C to stop)
Done.
Out[1]: 0

Перехваченный трафик будет доступен на порту 3020.

Теперь на компьютере-клиенте запускается wireshark, который показывает перехваченный трафик (здесь dom0 это IP-адрес или доменное имя хост-системы):

%$ nc dom0 3020 | wireshark -k -i -

[править] Работа с консолью устройств

  • ctrl-x d -- Выйти из консоли и перейти в Unix-shell

Для того чтобы вернуться обратно:

screen -r


[править] Автоматизированная настройка устройств из управляющей консоли xentaur

Пример 1. Установить имя хоста равное имени домена.

for i in [1,2,3,4,5,6]:                                                  
      write_to(i,"\nena\nconf t\nhostname "+domains[i-1]+"\nend\n")

Пример 2. Включить оба ethernet-интерфейса.

faX_up="""
ena
conf t
int fa0/0
no shutdown
exit
int fa1/0
no shutdown
exit
exit
exit
"""
for i in [1,2,3,4,5,6]:                                                  
      write_to(i,faX_up)

Пример 3. Установить адреса на интерфейсах

cisco_set_ip_on_int="""
int fa%s/0
no ip address
ip address %s 255.255.255.0
exit
"""

i=0
for dom in domains:
    i+=1
    write_to(i,"\nena\nconf t\n")
    j=0
    for br in  vbridges_table[dom][1:]:
        write_to(i,cisco_set_ip_on_int % (j, "192.168.%s.%s"%(bridges.index(br),i)))
        j+=1
    write_to(i,"\nend\n")

Пример 4. Включение OSPF для сети 192.168.0.0/26

write_to(domains,"\nena\nconf t\nrouter ospf\nnetwork 192.168.0.0 0.0.255.255 area 0\nend\n")


Возможности расширенного управления

(удобный интерфейс для использования традиционных инструментов с целью управления)



Xentaur
Xentaur

Инсталляция и использование Xentaur
Инсталляция | Консоль | Интеграция с реальной сетью | Описание сети
(репозиторий: http://xgu.ru/hg/xentaur)
Компоненты
Узлы: Xen | Xenomips (Dynamips + Pixemu + Xen) | Qemu
Сеть: linux bridges | ebtables | vnet | gvpe | vde | QoS в Linux | iptables
Управление: IPython | GNU Screen