Настройка мостовых контейнеров LXC со статическими IP-адресами


15

Я пытаюсь настроить несколько контейнеров LXC на хосте, каждый со своими публичными статическими IP-адресами.

На моем хосте установлена ​​последняя версия Ubuntu. Он имеет единственный сетевой интерфейс с именем eth0. Статические IP-адреса доступны для пинга из Интернета и называются eth0: 210, eth0: 211 ... Числа после двоеточия являются наименее значимым байтом адресов. В дополнение к этим интерфейсам у меня есть настройка br0 на общедоступном IP-адресе хоста. Есть также интерфейсы lo, veth2LPP9A и lxcbr0. У lxcbr0 есть адрес частного IP.

Хост / etc / network / interfaces выглядит следующим образом:

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

До сих пор я использовал различные онлайн-источники, в том числе контейнеры Bridging LXC для размещения eth0, чтобы у них был публичный IP-адрес, чтобы помочь мне настроить это.

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

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

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

Говоря о файле интерфейсов контейнера, он выглядит примерно так:

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-адресом контейнера, соединяет меня с хостом.

РЕДАКТИРОВАТЬ: Удаление статического IP-адреса контейнера с хоста действительно помогло, но теперь я получаю новую ошибку. Попытка пропинговать контейнер с хоста приводит к перенаправлению HostFrom, New nexthop. Пакеты просто идут от шлюза к хосту, несколько раз. Запуск traceroute с хоста показывает, что первая остановка на шлюзе. Тогда все остальные маршруты * * *. Я получаю ту же проблему независимо от того, включен контейнер в сеть или нет.

Ответы:


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 docs или 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.

Маска подсети есть: 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.