Сети Open vSwitch#

Действия по настройке сети Open vSwitch выполняются в ОС СН под учетной записью администратора ОС СН с высоким уровнем целостности. Действия по по созданию виртуальных сетей в ПВ выполняются под учетной записью администратора ПВ.

Сети Open vSwitch создаются на базе программного коммутатора Open vSwitch.

Open vSwitch — программный многоуровневый коммутатор, обеспечивающий изоляцию сети с помощью сетей VLAN путем тегирования портов и фильтрацию базовой сети с помощью OpenFlow.

Архитектура OVS состоит из трех основных компонентов: базы данных, непосредственно программного коммутатора и управляющего контроллера. На каждом из физических узлов вместе с гипервизором располагаются собственные БД и коммутатор. Эти два компонента образуют отдельно стоящий коммутатор, не знающий о других программных коммутаторах на соседних узлах.

Предупреждение

Группы безопасности данным сетевым режимом не поддерживаются.

Особенности конфигурирования#

Конфигурация всех Open vSwitch коммутаторов, портов, настройки поддерживаемых протоколов хранятся в собственной базе данных OVS (OVSDB). В стандартной конфигурации в OVSDB существуют следующие таблицы:

  • Open_vSwitch — Cхема;

  • Bridge;

  • Port;

  • Interface;

  • Flow_Table — конфигурация OpenFlow;

  • QoS;

  • Mirror;

  • Controller — параметры подключения к контроллеру OpenFlow;

  • Manager — конфигурация OVSDB;

  • NetFlow;

  • SSL;

  • sFlow;

  • IPFIX;

  • Flow_Sample_Collector_Set.

Изначально почти все таблицы пусты, так как конфигурация отсутствует. Утилита ovs-vsctl предоставляет интерфейс для внесения изменений в БД. Для внесения изменений используется команда вида:

sudo ovs-vsctl <команда> <таблица> <запись> <ключ=значение>

Для создания программного коммутатора с именем ovs-sw0 необходимо выполнить следующую команду:

sudo ovs-vsctl add-br ovs-sw0

После появляется возможность подключения ВМ. При этом ВМ, подключенные к ovs-sw0, будут работать в изолированной сети. Для того, чтобы предоставить им доступ к внешней сети, необходимо подключить к ovs-sw0 в качестве порта физический интерфейс eth0, выполнив команду:

sudo ovs-vsctl add-port ovs-sw0 eth0

Для того чтобы разрешить порту eth0 пропускать во внешнюю сеть трафик из определенных VLAN, необходимо выполнить команду:

sudo ovs-vsctl set port eth0 trunks=10,20,30,40,50

Ниже представлен список вариантов команд с параметрами вызова:

  • list <таблица> <запись>;

  • find <таблица> <условие>;

  • get <таблица> <запись> <ключ=значение>;

  • add <таблица> <запись> <ключ=значение>;

  • remove <таблица> <запись> <ключ=значение>;

  • clear <таблица> <запись> <ключ>;

  • create <таблица> <запись> <ключ=значение>;

  • destroy <таблица> <запись>;

  • wait-until <таблица> <запись> <ключ=значение>.

Для просмотра записей, присутствующих в таблице, описывающей порты, выполнить команду:

sudo ovs-vsctl list port

Для вывода списка портов, включенных в VLAN, необходимо выполнить команду:

sudo ovs-vsctl find port tag=10

Агрегирование физических интерфейсов#

Для повышения пропускной способности и уровня отказоустойчивости в Open vSwitch коммутатор могут быть включены несколько физических интерфейсов с задействованной на них агрегацией по протоколу LACP (Link Aggregation Control Protocol). Выполняется на канальном уровне путем создания объединенного интерфейса (Bonding).

Для создания объединенного интерфейса на базе физических интерфейсов eth0 и eth1 необходимо выполнить следующую команду:

sudo ovs-vsctl add-bond ovs-sw0 bond0 eth0 eth1

После следует включить lacp на созданном объединенном интерфейсе:

sudo ovs-vsctl set port bond0 lacp=active

На этом настройка отказоустойчивости сетевых интерфейсов завершена.

Зеркалирование портов#

Open vSwitch позволяет направлять копию потока трафика из одного или нескольких интерфейсов в другой. Так же он может организовать перенаправление трафика из всей VLAN в конкретный порт или наоборот. Зеркалироваться может только входящий, только исходящий или оба типа трафика. Использование такой возможности позволит вести контроль сетевого трафика, передаваемого между ВМ с целью обнаружения (предупреждения) компьютерных атак.

Примечание

Пример

Зеркалирование трафика из интерфейса vnet2, принадлежащего одной ВМ, в специально созданный для прослушивания порт mirror0 с типом internal:

sudo ovs-vsctl -- set Bridge ovs-sw0 mirrors=@m -- --id=@mirror0 get Port mirror0 -- --id=@vnet2 get Port vnet2 --  --id=@m create Mirror name=mymirror select-dst-port=@vnet2  select-src-port=@vnet2 output-port=@mirror0

где:

  • конструкцией –id=@<имя_переменной> определяется использование переменной;

  • командой set Bridge ovs-sw0 mirrors=@m создается зеркало, имя и параметры которого получаются из переменной @m;

  • командой –id=@mirror0 get Port mirror0 –id=@vnet2 get Port vnet2 определяются значения переменных @mirror0, @vnet2;

  • переменной @vnet2— записываются идентификаторы соответствующих портов;

  • командой –id=@m create Mirror name=mymirror select-dst-port=@vnet2 select-src-port=@vnet2 output-port=@mirror0 определяется значение переменной @m;

  • переменной @m — записываются имя и параметры зеркала;

  • select-dst-port — зеркалирование входящего трафика;

  • select-src-port — зеркалирование исходящего трафика;

  • output-port — место перенаправления трафика.

С помощью консольной утилиты tcpdump, запущенной на сервере виртуализации, можно прослушивать весь трафик поступающий, например, на порт mirror0. Для этого необходимо выполнить команду:

tcpdump -i mirror0

Также можно организовать ретрансляцию всех пакетов, например, пришедших на порт eth0 или eth1 на порт eth2:

sudo ovs-vsctl -- set Bridge ovs-sw0 mirrors=@m -- --id=@eth0 get Port eth0 -- --id=@eth1 get Port eth1 -- --id=@eth2 get Port eth2 -- --id=@m create Mirror name=mymirror -- select-dst-port=@eth0,@eth1  select-src-port=@eth0,@eth1 output-port=@eth2

где:

  • конструкцией –id=@<имя_переменной> определяется использование переменной;

  • командой set Bridge ovs-sw0 mirrors=@m создается зеркало, имя и параметры которого получаются из переменной @m;

  • командой –id=@eth0 get Port eth0 –id=@eth1 get Port eth1 –id=@eth2 get Port eth2 определяются значения переменных @eth0, @eth1 и @eth2;

  • командой –id=@m create Mirror name=mymirror select-dst-port=@eth0, @eth1 select-src-port=@eth0,@eth1 output-port=@eth2 определяется значение переменной @m;

  • переменной @m — записываются имя и параметры зеркала;

  • select-dst-port — зеркалирование входящего трафика;

  • select-src-port — зеркалирование исходящего трафика;

  • output-port — место перенаправления трафика.

Для отмены зеркалирования выполнить команду:

sudo ovs-vsctl remove Bridge ovs-sw0 mirrors mymirror

Настройка сервера виртуализации#

Предупреждение

Действия по настройке ПВ для использования виртуальных сетей выполняются в ОС СН под учетной записью администратора ОС СН с высоким уровнем целостности.

Требования#

Для настройки данного сетевого режима необходимо чтобы на каждом сервере виртуализации был установлен пакет openvswitch-switch (данный пакет размещен в базовом репозитории ОС СН).

Настройка#

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

Примечание

Пример

Узел, который направляет трафик виртуальных сетей через сетевой интерфейс enp0s8. Пример вывода после выполнения команды:

sudo ovs-vsctl show c61ba96f-fc11-4db9-9636-408e763f529e Bridge "ovsbr0"
Port "ovsbr0"
Interface "ovsbr0" type: internal
Port "enp0s8"
Interface "enp0s8"

Общие настройки ПВ#

Предупреждение

Действия по настройке ПВ для использования виртуальных сетей выполняются в ОС СН под учетной записью администратора ОС СН с высоким уровнем целостности.

Значение параметра VLAN_ID рассчитывается в соответствии с настройками, указанными в конфигурационном файле /etc/one/oned.conf.

Изменением данного параметра можно зарезервировать некоторые сети VLAN, и они не будут назначаться виртуальной сети. Можно также указать первый номер VLAN_ID. При создании новой изолированной сети находит свободный номер VLAN_ID из пула VLAN.

В файле /var/lib/one/remotes/vnm/OpenNebulaNetwork.conf можно откорректировать параметр настройки arp_cache_poisoning, отвечающий за подключение правила предотвращения изменения кэша ARP (ARP Cache Poisoning).

Предупреждение

После корректировки значения параметра arp_cache_poisoning необходимо выполнить команду onehost sync для применения изменений на всех узлах виртуализации.

Создание сети#

Предупреждение

Действия по созданию виртуальных сетей в ПВ выполняются под учетной записью администратора ПВ.

Для создания облачной сети Open vSwitch необходимо задать значения:

Параметр

Значение

Обязательный

NAME

Имя облачной сети

ДА

VN_MAD

ovswitch

ДА

PHYDEV

Имя физического сетевого устройства, которое будет подключено к мосту

ДА

BRIDGE

Имя сетевого моста, назначается по умолчанию onebr.<net_id> или onebr.<vlan_id>

НЕТ

VLAN_ID

Идентификационный номер сети VLAN. Будет сгенерирован, если не указан и для параметра AUTOMATIC_VLAN_ID установлено значение YES

НЕТ

AUTOMATIC_VLAN_ID

Игнорируется, если параметр VLAN_ID определен. Следует установить значение YES, если необходимо в автоматическом режиме генерировать идентификационный номер сети VLAN

НЕТ

MTU

Максимальный передаваемый модуль данных (MTU) для сети Open vSwitch

НЕТ

Примечание

Пример

Создание сети Open vSwitch с использованием конфигурационного файла:

  1. Создать файл new-net.conf со следующим содержанием:

# параметры физической сети
NAME = "ovswitch_net"
VN_MAD = "ovswitch"
BRIDGE = vbr1
VLAN_ID = 50 # optional
# доступное адресное пространство
AR=[TYPE = "IP4", IP = "172.16.1.100", SIZE = "100" ]
# параметры контекстуализации
NETWORK_ADDRESS = "172.16.1.0" NETWORK_MASK = "255.255.255.0"
DNS = "172.16.1.1" GATEWAY = "172.16.1.1"
  1. Выполнить команду:

onevnet create new-net.conf

Пример вывода после выполнения команды:

ID: 1

Многоканальные сети VLAN (VLAN транкинг)#

Предупреждение

Действия по настройке VLAN транкинга в ПВ выполняются под учетной записью администратора ПВ.

VLAN транкинг поддерживается путем добавления тега VLAN_TAGGED_ID: к элементу NIC в шаблоне ВМ или шаблоне виртуальной сети. Тег позволяет указать диапазон сетей VLAN, подлежащий тегированию, например, 1,10,30,32.

Правила OpenFlow#

MAC-спуфинг#

Данные правила предотвращают выход любого трафика с порта, если был изменен MAC-адрес.

Примечание

Пример

in_port=<PORT>,dl_src=<MAC>,priority=40000,actions=normal in_port=<PORT>,priority=39000,actions=normal

IP-захват#

Данные правила предотвращают выход любого трафика с порта для IPv4, если не настроен IP-адрес для ВМ.

Примечание

Пример

in_port=<PORT>,arp,dl_src=<MAC>priority=45000,actions=drop
in_port=<PORT>,arp,dl_src=<MAC>,nw_src=<IP>,priority=46000,actions=normal

Черные порты#

Применяется одно правило на порт.

Примечание

Пример

tcp,dl_dst=<MAC>,tp_dst=<PORT>,actions=drop

ICMP-игнорирование#

С помощью данной настройки можно, например, заблокировать ping-запросы к ВМ.

Примечание

Пример

icmp,dl_dst=<MAC>,actions=drop