Налаштування мостових контейнерів LXC зі статичними IP-адресами


15

Я намагаюся встановити декілька контейнерів LXC на хості, кожен з яких має власні загальнодоступні статичні IP-адреси.

Мій хост працює з останньою Ubuntu. Він має єдиний мережевий інтерфейс з назвою eth0. Статичні IP-адреси є доступними до Інтернету і називаються eth0: 210, eth0: 211 ... Числа після двокрапки - найменш значущий байт адрес. На додаток до цих інтерфейсів, у мене є br0 налаштування на загальнодоступній IP-адресі хоста. Існують також інтерфейси lo, veth2LPP9A та lxcbr0. Lxcbr0 має адресу приватного IP-адреси.

Інтерфейси хоста / тощо / мережі / виглядають так:

auto br0
iface br0 inet static
        bridge_ports eth0
        bridge_fd 0
        [...]

Поки що я використовував різні інтернет-джерела, включаючи мостики контейнерів LXC для розміщення eth0, щоб вони могли мати публічний IP, щоб допомогти мені налаштувати це.

Конфігураційний файл контейнера має:

lxc.network.type = veth
lxc.network.link = br0

Я видалив статичну конфігурацію lxc.network.ipv4 з цього файлу, оскільки це спричинило проблеми. Коли я запускав lxc-ls --fancy з цією конфігурацією, я побачив би один і той же загальнодоступний IP-код у висновку. Крім того, це буде заплутане з конфігурацією підмережі інтерфейсів / etc / network / інтерфейсів контейнера.

Якщо говорити про файл інтерфейсів контейнера, він виглядає приблизно так:

auto eth0
iface eth0 inet static
        address [...]
        netmask 255.255.255.255
        #gateway [...]
        dns-nameservers 8.8.8.8

        post-up route add [...] dev eth0
        post-up route add default gw [...]
        post-down route del [...] dev eth0
        post-down route del default gw [...]

Мені довелося прокоментувати шлюз і додати команди команд маршруту до цього файлу. В іншому випадку на завантаження контейнера знадобиться хвилин.

Файли / proc / sys / net / bridge / bridge-nf- * встановлені на 0. Значення / proc / sys / net / ipv4 / ip_forward дорівнює 1.

Проблема полягає в тому, що хоча контейнер "route -n" виглядає так, як належить, я не можу пінг-оф-контейнер. SSHing до того, яким повинен бути IP-контейнер, підключає мене до хоста.

EDIT: Видалення статичного IP-адреси контейнера з хоста все-таки допомогло, але тепер я отримую нову помилку. Спроба пінг-контейнера з хоста призводить до перенаправлення HostFrom, New nexthop. Пакети просто йдуть від шлюзу до хоста, кілька разів. Виконання трассеру від хоста показує, що перша зупинка знаходиться на шлюзі. Тоді всі інші маршрути є * * *. Я отримую ту ж проблему незалежно від того, контейнер в Інтернеті чи ні.

Відповіді:


17

Насправді ви можете встановити адресу і шлюз з всередині на хості і налаштувати контейнер , щоб не зачепити інтерфейс на всіх , використовуючи ключове слово manual.

Розмістіть це в межах гостей /etc/network/interfaces:

auto eth0
iface eth0 inet manual

Також залиште його до конфігураційного файлу контейнера для налаштування інтерфейсу:

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxc-bridge-nat
lxc.network.ipv4 = 192.168.100.16/24
lxc.network.ipv4.gateway = auto

Гість поводитиметься так, що його BIOS вже налаштував інтерфейс і просто ним користується.

Особливо досліджуйте lxc.network.ipv4.gateway.


Дякую! Це врятувало мені життя ... мій контейнер завжди намагався отримати нову dhcp адресу ... встановлення його на фіксоване значення всередині контейнера (статичне) призвело до того, що контейнер навіть не завантажується!
Домінік Дорн

Зауважте, що це не працює добре, якщо хост призупинено та відновлено. Lxc продовжує виділяти ip-адресу, але хост вважає, що у нього вже немає ip-адреси. Я знайшов, що краще налаштувати dnsmasq для lxc-net і роздавати там фіксовану адресу.
HRJ

@HRJ - У коментарі чи посиланні на запит слід включити "як", а не просто говорити "зроби це". Це технічний сайт, і вам слід сказати щось корисне.
Ян Макінтош

2
Здається, що правильне місце для цього - і в / etc / default / lxc, де ви можете встановити діапазон (див. LXC_DHCP_RANGE), і в /etc/dnsmasq.d-available/lxc відповідно до документів dnsmasq або manpage
Ian Macintosh


4

Так як ви мости, вам необхідно встановити IP - адреса в контейнері тільки , а не на хості. Хост повинен мати лише власні IP-адреси.


2

Я просто зробив це днями з Ubuntu 14.04. Це просто. Вам просто потрібно відредагувати /etc/network/interfacesфайл у контейнері та встановити це:

auto eth0
iface eth0 inet static
 address $IP
 netmask $NETMASK
 gateway $GW
 dns-nameservers $DNS

Замініть кожну змінну на потрібне значення.

Вам НЕ потрібно робити нічого іншого!

PS: Помітьте пробіл перед деякими рядками. Це обов’язково.


Це призвело до того, що мій контейнер більше не завантажується (сервер ubuntu 14.04). Відповідь від sebastianwagner працює для мене.
Домінік Дорн

2

Найкращий спосіб, який я знаходжу, і найшвидше - це використовувати lxc-профілі

lxc profile list - командуйте списком усіх профілів, які у вас є

lxc profile copy default minecraft(це ім’я вашого нового профілю)

Потім lxc profile edit minecraft

Це підійде

devices:
  eth0:
    ipv4.address: 192.168.1.114/24  - add this line and enter any ip address you like
    name: eth0
    nictype: macvlan - this is my setting
    parent: enp0s25
    type: nic
  root:
    path: /
    pool: lxc_zfs
    type: disk
name: mine
used_by:

потім збережіть його

наступний призначте профіль такому контейнеру LXC, як цей

lxc profile assign YOUR_CONTAINER_NAME YOUR_NEW_PROFILE_NAME

тоді просто перезавантажте контейнер, і ваша нова ip-адреса встановлена ​​для цього контейнера


1

Я можу правильно встановити свої контейнери lxc після відповіді @Enrique Moreno Tent, тому я поясню, що робити більш детально, якщо ви не знаєте, як налаштувати інші елементи.

1. Доступ до контейнера LXC за допомогою lxc-attachкоманди

Команда:

$ lxc-attach -n YOUR-CONTAINER-NAME

2. Перегляньте ваші поточні конфігурації з ifconfig

Командування

root@mycontainer:~# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.3.160  netmask 255.255.255.0  broadcast 10.0.3.255
        inet6 fe80::216:3eff:fec9:2fa0  prefixlen 64  scopeid 0x20<link>
        ether 00:16:3e:c9:2f:a0  txqueuelen 1000  (Ethernet)
        RX packets 62  bytes 7142 (7.1 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 60  bytes 9788 (9.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 20285  bytes 175021803 (175.0 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 20285  bytes 175021803 (175.0 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

`` `

3. Отримання адреси, мережевої маски та шлюзу

Бачачи результат ifconfigкоманди вище, ми бачимо:

Адреса - це адреса, яку ви хочете, ви можете змінити її на 10.0.3.166.

Netmask є: 255.255.255.0

Шлюз : для шлюзу ви використовуєте адресу широкомовної передачі, тут є 10.0.3.255

Як ви бачите вище, у вас зараз є вся інформація, необхідна для заповнення вашого гостя (контейнера) /etc/network/interfaces.

4. Отримання dns-nameserversзначення.

Видайте команду:

cat /etc/resolv.conf

Але, мабуть, найкраще використовувати Google DNS, котрий випали 8.8.8.8і8.8.4.4

5. Редагування /etc/network/interfacesВНУТРИ КОНТЕЙНЕР

auto eth0 iface eth0 inet static address 10.0.3.166 netmask 255.255.255.0 gateway 10.0.3.255 dns-nameservers 8.8.8.8


ifconfigбув замінений ip aна більш пізніх версіях Debian / Ubuntu linuxconfig.org / ...
rvazquezglez
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.