Загальнодоступна IP-адреса для контейнера LXC


26

Гаразд, тому я хочу знати, як робити мережу на контейнерах LXC. Не просто ту розпливчасту інформацію, яку ви отримуєте з інших веб-сайтів, а справжнє керівництво для початківців, щоб змусити їх працювати. Оскільки більшість прикладів в основному налаштовані на тестування людей, я хочу запустити сервіс на одному ... як наприклад, веб-сервер.

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

Якщо я хочу статично призначити IP контейнеру, як це зробити? Чи потрібно вносити будь-які зміни в конфігурацію моста на хості? Це насправді краще зробити це за допомогою параметра MACVLAN?

Будь-яка допомога буде вдячна.


Я не знайомий з LXC, але зазвичай ваш іспит збирається надати лише одну загальнодоступну IP-адресу. У вас є пакет з декількома статичними ips?
wlraider70

IP-адреси, що стоять перед загальнодоступними, - це не єдиний випадок використання. Ми хочемо, щоб 2-х загальнодоступних IP-адрес було присвоєно нашим контейнерам балансиру навантаження, але ми хочемо, щоб спеціальні IP-адреси локальних мереж були присвячені багатьом іншим службам. Таким чином, якщо ми переміщуємо контейнери на іншому обладнання, це так само просто, як перемістити IP (DNS не працює в цьому відношенні для деяких компонентів, які ми використовуємо)
David Parks

Відповіді:


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. Якщо вам не потрібен NAT-міст LXC (тобто всі ваші контейнери замість нього використовуватимуть новий міст), то в редагуванні /etc/default/lxcта зміні хоста змініть USE_LXC_BRIDGEна "false", а потім на хості sudo service lxc restart.


Спасибі! Є багато подібних питань навколо. Але ця відповідь нарешті допомогла мені працювати.
Mausy5043

1

Робі, дуже дякую за те, що опублікував цю відповідь, я відірвав волосся, намагаючись зробити це, і це єдиний метод, який працював!

Я подумав, що я повинен зазначити кілька речей, які я з'ясував, щоб допомогти уточнити вказівки для інших адміністраторів.

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

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

Також, якщо потрібно, додайте маршрут до поточних маршрутизаторів.

Мабуть, не найкраще рішення, але не вимагає великих зусиль! Ура.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.