Настройка мостовых контейнеров 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.

sebastianwagner
источник
Спасибо! Это спасло мне жизнь ... мой контейнер всегда пытался получить новый адрес 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-адрес будет установлен на этот контейнер

Jayferret
источник
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