Пользовательский мост в Ubuntu 16.04 с LXD

Проблема

Я использую два сетевых адаптера на хосте, на котором я хочу запустить LXD с профилем Docker. У меня DNSMASQ работает на интерфейсе 0 (enp0s10f0) и loopback. Я хочу, чтобы в контейнерах LXD использовалась отдельная сетевая карта (enp0s10f1). В настоящее время мне не нужно, чтобы контейнеры были доступны в сети напрямую. Итак, я создал мост (lxdbr1) вручную в / etc / network / interfaces с enp0s10f0 в качестве подчиненного устройства. Я хочу использовать ebtables + DNSMASQ с настраиваемой конфигурацией (которая может меняться для разных экземпляров контейнера) для фильтрации разрешенного исходящего трафика из контейнера. Я пытаюсь не использовать службу lxd-bridge и мост по умолчанию (lxdbr0), который она создает из-за моих требований выше.

Сейчас я столкнулся с двумя проблемами:

  1. Я прикрепил lxdbr1 к профилю LXD по умолчанию. Если я запускаю контейнер с профилями по умолчанию и docker, я действительно вижу интерфейс eth0 внутри контейнера. Однако у него нет IPv4-адреса и, похоже, он имеет случайные IPv6-адреса. Я считаю, что это потому, что это настройка по умолчанию, которую делает LXD. Я попытался отредактировать конфигурацию сети с помощью lxc device edit lxdbr1, но после добавления параметров ipv4.address, ipv4.nat, ipv6.address и ipv6.nat и сохранения файла команда редактирования выдает ошибку с сообщением «Ошибка анализа конфигурации: не найдено. ". Я проверил правильность написанного мной YAML с помощью форматтера. Так что не уверен, в чем проблема.
  2. Предполагая, что я смогу заставить вышеуказанное работать, нужно ли мне что-нибудь помимо этого? В википедии о маскарадинге Debian указано, что я должен также настроить маршруты по умолчанию с IP-адреса внешней сети на интерфейсе enp0s10f1 на внутренний IP-адрес, выделенный мосту. Эта часть меня тоже сбивает с толку.

Есть ли другие варианты попроще? Могу ли я, например, использовать мост по умолчанию, созданный LXD, сделать его постоянным, а затем использовать свои собственные экземпляры DNSMASQ (у меня может быть несколько) и свои собственные правила трафика?

Фон

Я работаю над созданием конвейера непрерывной доставки для команд, поставляющих службы или библиотеки на Linux. По разным причинам мы должны заблокировать хост и среду, в которой выполняются процессы сборки, подписи и публикации, предоставляя командам, использующим конвейер, максимальную гибкость для использования любого языка программирования, фреймворков или инструментов по своему усмотрению. Например, предположим, что команда хочет использовать Haskell и Rust (по любой причине) в версиях A и B; Я не хочу заниматься управлением такими объявлениями или предварительной установкой их для этой команды. В то же время я хочу убедиться, что они не используют случайные источники пакетов и не публикуют неподписанные пакеты. Итак, я придумал решение, которое может работать, в котором используются эфемерные контейнеры LXD (с Docker внутри) на разных этапах (сборка, тестирование, упаковка, публикация, архивирование), при этом любая работа, требуемая конвейером, выполняется между ними на хосте. перед запуском или после запуска каждого контейнера. Рабочий процесс будет примерно таким:

  • Выполните действия перед сборкой на хосте.
  • Вызов пользовательского скрипта сборки в контейнере.
  • Выполните действия после сборки на хосте.
  • Выполните предварительные шаги на хосте.
  • Вызов пользовательского тестового скрипта в контейнере.
  • Вызов шагов пост-тестирования на хосте.

И так далее.


person VJK    schedule 21.01.2017    source источник


Ответы (1)


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

Если вы не хотите, чтобы контейнеры на уровне 2 были открыты для вашей физической сети, создайте мост, который не будет содержать вашу физическую сеть. Затем вы можете запустить dnsmasq на этом мосту, чтобы контейнеры могли получить IP-адрес, а хост выступил в качестве шлюза.

person stgraber    schedule 24.01.2017