Публичный IP-адрес для контейнера LXC

26

Итак, я хочу знать, как создавать сети на контейнерах LXC. Не только расплывчатая информация, которую вы получаете с других веб-сайтов, но и настоящее руководство для начинающих, как заставить их работать. Поскольку большинство примеров в основном предназначены для людей, с которыми можно проводить тестирование, я хочу запустить службу на одном ... как веб-сервер, например.

Я использую Ubuntu 12.04 LTS, у меня установлен LXC, и я могу создать, запустить и остановить контейнер. Очевидно, мой сервер имеет открытый IP-адрес, и я хотел бы знать, как настроить контейнер, чтобы он тоже мог иметь открытый IP-адрес. Поскольку, кажется, уже существует мост от моего текущего контейнера, может показаться, что я должен либо предоставить контейнерам общедоступный для них диапазон DHCP, либо вручную назначить статический IP-адрес моему контейнеру.

Если я хочу статически назначить IP контейнеру, как мне это сделать? Нужно ли вносить какие-либо изменения в мою конфигурацию моста на хосте? На самом деле лучше сделать это с опцией MACVLAN?

Любая помощь будет оценена.

user132151
источник
Я не знаком с LXC, но обычно ваш провайдер дает вам только один публичный IP-адрес. У вас есть пакет с несколькими статическими ips?
wlraider70
Общедоступные IP-адреса - не единственный случай использования, мы хотим, чтобы нашим контейнерам балансировки нагрузки были назначены 2 общедоступных IP-адреса, но мы хотим, чтобы выделенные локальные IP-адреса были выделены для различных других служб. Таким образом, если мы перемещаем контейнеры на другом оборудовании, это так же просто, как перемещать IP (DNS не работает в этом отношении для некоторых компонентов, которые мы используем)
Дэвид Паркс,

Ответы:

23

Мой подход предполагает, что на вашем сервере есть один NIC, и вам нужно разделить этот NIC между хостом и гостями LXC. Это предполагает использование моста. Мост владеет и управляет eth0. Хост теперь настраивает свою собственную сеть br0вместо eth0. Гости LXC настроены для подключения к мосту.

  1. На хосте sudo apt-get install bridge-utils.

  2. На хосте замените eth0на мост:

    Это опасно Получите это неправильно, и вы можете быть заблокированы от вашего сервера. Убедитесь, что включен локальный вход в систему и что доступ к локальной консоли работает, чтобы вы могли отменить это изменение, если у вас возникнут проблемы.

    В /etc/network/interfaces:

    1. Заменить auto eth0на auto br0.
    2. Заменить:

      iface eth0 inet dhcp
      

      с:

      iface br0 inet dhcp
          bridge_ports eth0
      

      Если бы у вас была статическая конфигурация сети, вы бы заменили:

      iface eth0 inet static
          address ...
          netmask ...
          gateway ...
          etc.
      

      с:

      iface br0 inet static
          bridge_ports eth0
          address ...
          netmask ...
          gateway ...
          etc.
      

      Вы просто изменить eth0для br0и добавления bridge_ports eth0строки.

    3. Перезагрузите хост. Если бы вы делали это локально, то запустились бы sudo ifdown eth0до того, как начали, а sudo ifup br0потом и после. Обратите внимание, что мост может занять некоторое время, поэтому подождите пять минут после перезагрузки, прежде чем предположить, что все потеряно.

  3. Чтобы переместить указанный именованный контейнер LXC на общедоступный IP-адрес:

    1. Остановите контейнер.
    2. На хосте отредактируйте и измените на ./var/lib/lxc/container_name/configlxc.network.linkbr0
    3. На хосте отредактируйте и настройте ваш публичный IP-адрес, как обычно (DHCP или статическая конфигурация при необходимости). Обратите внимание, что интерфейс по-прежнему вызывается с точки зрения контейнера./var/lib/lxc/container_name/rootfs/etc/network/interfaceseth0
    4. Перезапустите контейнер.
  4. Чтобы изменить значение по умолчанию для новых контейнеров LXC, отредактируйте /etc/lxc/default.confна хосте и измените lxc.network.linkна br0.

  5. Если вам вообще не нужен предоставленный LXC мост NAT (т. Е. Все ваши контейнеры будут использовать новый мост вместо этого), то на хосте отредактируйте /etc/default/lxcи измените USE_LXC_BRIDGEна "false", а затем на хосте запустите sudo service lxc restart.

Роби Басак
источник
Благодарность! Есть много похожих вопросов вокруг. Но этот ответ, наконец, помог мне начать работать.
Mausy5043
1

Роби, большое спасибо за публикацию этого ответа, я старался изо всех сил пытаться добиться этого, и это был единственный метод, который сработал!

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

У моего хоста было несколько статических псевдонимов ip, назначенных для гостя eth0, например:

iface eth0:1 inet static
  address 5.5.5.5
  netmask 255.255.255.5
  gateway 5.5.5.1
etc.

Теперь мы не хотим настраивать br0 таким же образом, мы просто хотим один IP без псевдонимов, как указано выше, как Robie.

Допустим, вы хотите, чтобы 5.5.5.5 был назначен контейнеру debian8.

Отредактируйте /var/lib/lxc/debian8/etc/network/interfacesи добавьте:

iface eth0 inet static 
      address 5.5.5.5
      netmask 255.255.255.5
      gateway 5.5.5.1
    etc.

Затем выполните эту команду: route add default gw <gateway-ip, in my case 5.5.5.1>

После этого перезагрузите контейнер и все должно наконец заработать! :)

Грегори Вольф
источник
1

У меня была такая же проблема, и у меня есть это решение (быстрое и грязное).

server: eth0 = 10.1.0.77/24
server: lxdbr0 (lxd bridge) = 10.255.255.77/24

container: eth0 = 10.255.255.100/24 (same network as lxdbr0)
container: eth0:0 = 194.99.99.99/28  (public ip address on eth0 alias)

На сервере: route add -host 194.99.99.99 gw 10.255.255.100 dev lxdbr0

Также при необходимости добавьте маршрут к вышестоящим маршрутизаторам.

Возможно, не лучшее решение, но не требует больших усилий! Приветствия.

Андреа
источник