Авторские статьи

Управление сетью в LXD 2.3+


Стефан Грабер (Stéphane Graber) опубликовал вторую статью, которая не входит в основной цикл из 12 постов про LXD. В данной статье рассмотрены серьёзные улучшения по настройке сети. Теперь легко и просто можно создавать даже сложные сетевые конфигурации, которые потребуются пользователям LXD.

Введение

С появлением LXD 2.0 в Ubuntu 16.04 настройка сети стала удивительно простой. Можно использовать lxdbr0, который вам создал и настроил lxd init или использовать существующий физический интерфейс для контейнеров.

В целом всё работает, но немного смущал тот факт, что настройка моста lxdbr0, для примера, осуществлялась за пределами LXD. Эти скрипты поддерживали только один мост и никогда к ним не было API, что делает их удалённое конфигурирование не простым.

Но это всё в прошлом. LXD 2.3 приносит API для управления сетевыми настройками и продвинутые инструменты командной строки. Данная статья призвана раскрыть эти новые возможности.

Базовые возможности

Сейчас свежеустановленный LXD 2.3 поставляется без каких-либо сетевых настроек вообще. lxd init предложит вам настроить и поднять интерфейс, чтобы все новые контейнеры использовали его по умолчанию. Но для обучения мы всё будем делать сами руками, чтобы увидеть происходящее.

Создаём новую сеть со случайной IPv4 и IPv6 подсетью и включённым NAT.
lxc network create testbr0

Network testbr0 created

Посмотрим конфиг lxc network show testbr0

name: testbr0
config:
 ipv4.address: 10.150.19.1/24
 ipv4.nat: "true"
 ipv6.address: fd42:474b:622d:259d::1/64
 ipv6.nat: "true"
managed: true
type: bridge
usedby: []

Если вас не устраивает подсеть, которую выдали автоматически, то можно указать её явно.
lxc network create testbr0 ipv6.address=none ipv4.address=10.0.3.1/24 ipv4.nat=true

Network testbr0 created

Смотрим результат lxc network show testbr0

name: testbr0
config:
 ipv4.address: 10.0.3.1/24
 ipv4.nat: "true"
 ipv6.address: none
managed: true
type: bridge
usedby: []

Сеть создана и настроена, но толку от неё нет, пока её не станут использовать контейнеры. Если вновь созданную сеть вы захотите закрепить для всех контейнеров, то командуйте:
lxc network attach-profile testbr0 default eth0

Представим, что уже существует контейнер и мы хотим созданную сеть прикрепить к нему.
lxc network attach my-container default eth0

Предположим, что мы хотим классический bridge превратить в OVS bridge, так как мы установили программный openvswitch. Нужно просто сменить свойство "драйвер" - lxc network set testbr0 bridge.driver openvswitch

Если нужно сменить сразу много свойств, то лучше вызвать lxc network edit и в текстовом редакторе интерактивно всё поменять.

Static leases и port security

Одна из возможностей позволяет легко и просто управлять DHCP арендой. Всё что нам нужно это сетевоё устройство контейнера и правильно выставленное свойство.

# lxc init ubuntu:16.04 c1

Creating c1

# lxc network attach testbr0 c1 eth0
# lxc config device set c1 eth0 ipv4.address 10.0.3.123
# lxc start c1
# lxc list c1

+------+---------+-------------------+------+------------+-----------+
| NAME |  STATE  |        IPV4       | IPV6 |    TYPE    | SNAPSHOTS |
+------+---------+-------------------+------+------------+-----------+
|  c1  | RUNNING | 10.0.3.123 (eth0) |      | PERSISTENT | 0         |
+------+---------+-------------------+------+------------+-----------+

То же самое и для IPv6, только свойство ipv6.address.

Если вы хотите предотвратить смену MAC или перенаправление (forwarding) трафика на любой другой MAC, то можно включить технологию port security.

lxc config device set c1 eth0 security.mac_filtering true

DNS

LXD запускает DNS сервер для моста (bridge). Через свойство dns.domain можно указать домен. Доступно 3 режима работы (свойство dns.mode):

  • managed. Будет 1 запись DNS для контейнера, соответствующая его имени и IP адресу. Контейнер не сможет изменить данную запись через DHCP.
  • dynamic. Разрешается контейнеру самостоятельно обновлять запись DNS через DHCP. То есть имя (hostname) контейнера в рамках DHCP negotiation будет "прописано" в DNS.
  • none. Простой DNS с поддержкой рекурсивных запросов, но без каких-либо локальных записей.

По умолчанию используется режим managed, так как он безопасен, удобен и позволяет сделать DNS запись для контейнера, но не даёт подделать данные записи, посылая новые-фейковые через DHCP.

Использование туннелей

LXD поддерживает подключение к другим хостам, используя туннели GRE или VXLAN. Сеть LXD может иметь множество туннелей, которые прикреплены к нему, что облегчает объединение множества хостов. Туннели удобны при использовании в процессах разработки, тестирования и демонстрации. На производстве предпочитают VLAN для сегментации сети.

Предположим, у нас есть testbr0 на хосте по имени edfu и мы хотим запускать (spawn) контейнеры, используя это на хосте djanet. Самый простой способ реализовать это через multicast VXLAN. Этот тип туннеля работает только если оба хоста находятся в одном и том же физическом сегменте сети.

root@edfu:~# lxc network create testbr0 tunnel.lan.protocol=vxlan

Network testbr0 created

root@edfu:~# lxc network attach-profile testbr0 default eth0

Мы определили testbr0 мост на хосте edfu и подняли multicast VXLAN туннель для других хостов. В данном случае edfu будет выступать в роли некоего роутера, обеспечивая других DHCP, DNS. Другие хосты будут просто перенаправлять трафик через туннель.

root@djanet:~# lxc network create testbr0 ipv4.address=none ipv6.address=none tunnel.lan.protocol=vxlan

Network testbr0 created

root@djanet:~# lxc network attach-profile testbr0 default eth0

Теперь можно запускать контейнеры на любом хосте и видеть как они получают IP из единого пула и взаимодействуют с друг другом напрямую через туннель. Как было сказано ранее, мы используем multicast, что не очень хорошо работает через череду роутеров. Используйте тогда лучше unicast VXLAN или старый добрый GRE.

Для подсоединения другого хоста с помощью GRE сначала конфигурируем "главный" хост:
root@edfu:~# lxc network set testbr0 tunnel.nuturo.protocol gre
root@edfu:~# lxc network set testbr0 tunnel.nuturo.local 172.17.16.2
root@edfu:~# lxc network set testbr0 tunnel.nuturo.remote 172.17.16.9

Теперь правим хост "клиент":
root@nuturo:~# lxc network create testbr0 ipv4.address=none ipv6.address=none tunnel.edfu.protocol=gre tunnel.edfu.local=172.17.16.9 tunnel.edfu.remote=172.17.16.2

Network testbr0 created

root@nuturo:~# lxc network attach-profile testbr0 default eth0

Если будет предпочтительнее использовать vxlan, то
root@edfu:~# lxc network set testbr0 tunnel.edfu.id 10
root@edfu:~# lxc network set testbr0 tunnel.edfu.protocol vxlan

и
root@nuturo:~# lxc network set testbr0 tunnel.edfu.id 10
root@nuturo:~# lxc network set testbr0 tunnel.edfu.protocol vxlan

Здесь id требуется, чтобы избежать конфликтов с уже настроенным туннелем multicast vxlan.

Итог

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

Полный список того, что было освещено в данной статье вы можете прочесть в полной документации Network configuration.

Серия статей про LXD.
Серия статей про LXC.

Дата последней правки: 2023-12-27 13:58:38

RSS vasilisc.com   


Разделы

Главная
Новости
Ворох бумаг
Видео Linux
Игры в Linux
Безопасность
Статьи об Astra Linux
Статьи о FreeBSD
Статьи об Ubuntu
Статьи о Snappy
Статьи об Ubuntu Phone
Статьи о Kubuntu
Статьи о Xubuntu
Статьи о Lubuntu
Статьи об Open Source
Карта сайта