Как включить встроенный DHCP статический IP-адрес в контейнер LXC на основе имени, а не MAC-адреса

Я знаю, что я могу назначить статический IP вручную, используя /etc/network/interfaces.

Я также знаю, что я могу прочитать MAC-адрес контейнера LXC (например, просмотрев запись lxc.network.hwaddr в /var/lib/lxc/<container-name>/config и назначить IP-адрес, используя записи dhcp-host=<mac-addr>,10.0.3.3 в /etc/dnsmasq.d/<some file>.

В файле /etc/default/lxc-net я читал

# Uncomment the next line if you'd like to use a conf-file for the lxcbr0
# dnsmasq.  For instance, you can use 'dhcp-host=mail1,10.0.3.100' to have
# container 'mail1' always get ip address 10.0.3.100.
#LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf

Это соответствовало бы моим потребностям, к сожалению, это не имеет никакого эффекта.

1
задан 12 April 2014 в 15:35

5 ответов

В последнее время я столкнулся с этим, и я думаю, что нашел легкое решение. I (только) проверил его на Ubuntu 14.04.

Сначала раскомментируем эту строку / etc / default / lxc-net:

LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf

В /etc/lxc/dnsmasq.conf , определите файл dhcp-hosts:

dhcp-hostsfile=/etc/lxc/dnsmasq-hosts.conf

Затем добавьте записи в /etc/lxc/dnsmasq-hosts.conf следующим образом:

mail,10.0.3.16
web,10.0.3.17

Остерегайтесь: изменения вступят в силу после перезапуска lxc-net (который перезапускает dnsmasq):

service lxc-net restart

После этого вы можете изменить /etc/lxc/dnsmasq-hosts.conf и отправить сигнал SIGHUP в dnsmasq:

[ f5]

Итак, да, вам нужно перезапустить lxc-net, но только один раз. Надеюсь, это поможет.

15
ответ дан 24 May 2018 в 09:32
  • 1
    Мне нравится идея делегирования списка хостов внешнему файлу. Кроме того, ваш метод отличается от моего из-за killall -s SIGHUP dnsmasq. Я согласен, что просто «SIGHUP-ing» dnsmasq более эффективен, а затем перезагружает весь демон (особенно если он не работает без исправления его сценариев выскочки). – Adam Ryczkowski 8 January 2015 в 13:51
  • 2
    Перезапуск службы lxc-net требуется только для того, чтобы dnsmasq использовал конфигурацию из /etc/lxc/dnsmasq.conf (и эта часть информации присутствует в /etc/default/lxc-net, которая неизвестна dnsmasq). Если вы его уже задали, достаточно еще одного SIGHUP. – Adam Ryczkowski 8 January 2015 в 13:53
  • 3
    Остерегайтесь: lxc-net не перезапустит dnsmasq, если есть запущенные контейнеры. – s3v3n 9 March 2015 в 14:34
  • 4
    ИМО это лучший ответ – s3v3n 9 March 2015 в 14:38
  • 5
    kill -HUP $(cat /var/run/lxc/dnsmasq.pid), если вы не хотите устанавливать killall или перезагружать другие экземпляры dnsmasq – gertas 18 November 2016 в 11:52

Он отлично работает в Ubuntu 14.04.1

Раскомментировать эту строку /etc/default/lxc-net

#LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf

остановить все контейнеры, перезапустить lxc-net:

service lxc-net restart

Настроить ip-адреса в /etc/lxc/dnsmasq.conf

dhcp-host={NAME},10.0.3.2

, где {NAME} - имя вашего контейнера LXC:

/var/lib/lxc/{NAME}
4
ответ дан 24 May 2018 в 09:32
  • 1
    Он работает , только если скрипт может отключить сеть lxcbr0 , что исключает случай, когда работают другие контейнеры lxc. Короче говоря, поскольку он стоит сейчас, вы не можете назначать статическую аренду dhcp без перезапуска всех контейнеров. – Adam Ryczkowski 5 November 2014 в 13:33
  • 2
    Да, это правда, это довольно неудобно :( Я нахожу гораздо более легкое решение для редактирования файла /var/lib/lxc/<container-name>/rootfs/etc/network/interfaces и назначения статического IP-адреса в контейнер. – Tombart 6 November 2014 в 15:08
  • 3
    Правда, но тогда вам нечего защищать от предоставления двум гостям одного и того же IP-адреса. См. Мой принятый ответ - он решает проблему. – Adam Ryczkowski 6 November 2014 в 15:36

Ответ Tombart работает, если вы достаточно терпеливы, чтобы ждать обновления DNS. После этого вы готовы перезапустить контейнер (гость).

Далее следует рецепт, который требует, чтобы все остальные, возможно, запущенные контейнеры lxc были закрыты. Если вы не можете этого себе позволить, я не вижу возможности форсировать новую конфигурацию dnsmasq. (Для какой-либо передачи сигналов HAS в pd dnsmasq, найденных в /run/lxc/dnsmasq.pid, тоже не работает.)

Итак, если вы хотите, чтобы что-то работало мгновенно, и нет других контейнеров lxc, следуйте моему ответу , $name - это имя узла, для которого мы хотим сбросить присвоение, а $internalif - имя мостового адаптера LXC. Вы можете получить значение $internalif, например. augtool -L -A --transform "Shellvars incl /etc/default/lxc-net" get "/files/etc/default/lxc-net/LXC_BRIDGE" | sed -En 's/\/.* = (.*)/\1/p', если вы установите augeas-tools, но обычно это просто lxcbr0.

sudo lxc-stop -n $name >/dev/null
sudo service lxc-net stop >/dev/null
if [ -d /sys/class/net/$internalif ]; then
   sudo brctl delbr $internalif >/dev/null #Why? See below.
fi
sudo rm /var/lib/misc/dnsmasq.$internalif.leases
sudo service lxc-net start >/dev/null
sudo lxc-start -d -n $name >/dev/null
sleep 5

К сожалению, в /etc/init/lxc-net.conf в Ubuntu 14.04 есть ошибка (функция?), которая предотвращает перезагрузку dnsmasq, если мостовое устройство не установлено для хоста.

1
ответ дан 24 May 2018 в 09:32

Вот простой скрипт python, который выпускает LXC dnsmasq lease. Вы можете запустить его с хост-компьютера или подделать его из другого контейнера - да, что работает!:

#!/usr/bin/env python
from scapy.all import *
conf.checkIPaddr=False
leaseMAC = '00:16:3e:11:71:b0' #container MAC here
releaseIP='10.0.3.33' #container IP here
serverIP='10.0.3.1'
hostname='container-name-here'
rawMAC = leaseMAC.replace(':','').decode('hex')
send(IP(dst=serverIP) / \
     UDP(sport=68,dport=67) / \
     BOOTP(chaddr=rawMAC, ciaddr=releaseIP, xid=RandInt()) / \
     DHCP(options=[('message-type','release'),('server_id',serverIP),('hostname',hostname), ('end')]))

Перцепция для выше - это scapy python library:

pip install scapy

После запуска вы должны увидеть в системном журнале что-то вроде:

dnsmasq-dhcp[3242]: DHCPRELEASE(lxcbr0) 10.0.3.33 00:16:3e:11:71:b0 container-name-here

Чтобы подтвердить, просто проверьте, удалена ли запись из /var/lib/misc/dnsmasq.lxcbr0.leases. Сам контейнер будет поддерживать IP-адрес, поэтому его следует остановить до запуска любого нового контейнера, который должен повторно использовать IP.

0
ответ дан 24 May 2018 в 09:32
  • 1
    Это круто! Я даже не знал, что DHCP поддерживает это! Я сразу же подтвержу, что это работает. – Adam Ryczkowski 16 December 2016 в 13:34

Я понимаю, что мой ответ - это годы, но, возможно, это помогает кому-то другому. Проблема заключалась в том, что вы отредактировали код, специфичный для пакета LXC Ubuntu (функция write_lxc_net), который должен был быть записан в другое место назначения в виде строки, не обработанной в самом скрипте lxc-net!

As В результате процесс dnsmasq не получил конфигурационный файл, который вы пытались передать ему, оставив «без эффекта», как вы говорите.

Вместо этого вы хотите установить эту переменную в верхней части скрипта, среди остальных:

#!/bin/sh -

distrosysconfdir="/etc/default"
varrun="/run/lxc"
varlib="/var/lib"

# These can be overridden in /etc/default/lxc
#   or in /etc/default/lxc-net

USE_LXC_BRIDGE="true"
LXC_BRIDGE="lxcbr0"
LXC_BRIDGE_MAC="00:16:3e:00:00:00"
LXC_ADDR="10.0.3.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="10.0.3.0/24"
LXC_DHCP_RANGE="10.0.3.2,10.0.3.254"
LXC_DHCP_MAX="253"
LXC_DHCP_CONFILE="/etc/lxc/dnsmasq.conf"   <-- Here for instance
LXC_DOMAIN=""
0
ответ дан 24 May 2018 в 09:32

Другие вопросы по тегам:

Похожие вопросы: