Я знаю, который я могу присвоить статический 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
Это удовлетворило бы моим потребностям; к сожалению, выполнение так не имеет никакого эффекта.
Это решение работает путем исправления lxc новомодных сценариев. Это действительно разделяет сложную задачу перевода в рабочее состояние моста lxcbr0 и запуска dnsmasq
в два отдельных задания. Теперь Вы не должны перезапускать целое lxc-net
мост, чтобы просто перезагрузить dnsmasq
- перезагрузка эти sudo service restart lxc-dnsmasq
достаточна и не требует закрытия моста.
sudo service lxc-net stop
и удостоверяется, существует № lxcbr0 (или эквивалентный) мост. /etc/init/lxc-net.conf
со следующим содержанием: .
description "lxc network"
author "Serge Hallyn <serge.hallyn@canonical.com>"
start on starting lxc
stop on stopped lxc
env USE_LXC_BRIDGE="true"
env LXC_BRIDGE="lxcbr0"
env LXC_ADDR="10.0.3.1"
env LXC_NETMASK="255.255.255.0"
env LXC_NETWORK="10.0.3.0/24"
env varrun="/run/lxc"
env LXC_DOMAIN=""
pre-start script
[ -f /etc/default/lxc ] && . /etc/default/lxc
[ "x$USE_LXC_BRIDGE" = "xtrue" ] || { stop; exit 0; }
use_iptables_lock="-w"
iptables -w -L -n > /dev/null 2>&1 || use_iptables_lock=""
cleanup() {
# dnsmasq failed to start, clean up the bridge
iptables $use_iptables_lock -D INPUT -i ${LXC_BRIDGE} -p udp --dport 67 -j ACCEPT
iptables $use_iptables_lock -D INPUT -i ${LXC_BRIDGE} -p tcp --dport 67 -j ACCEPT
iptables $use_iptables_lock -D INPUT -i ${LXC_BRIDGE} -p udp --dport 53 -j ACCEPT
iptables $use_iptables_lock -D INPUT -i ${LXC_BRIDGE} -p tcp --dport 53 -j ACCEPT
iptables $use_iptables_lock -D FORWARD -i ${LXC_BRIDGE} -j ACCEPT
iptables $use_iptables_lock -D FORWARD -o ${LXC_BRIDGE} -j ACCEPT
iptables $use_iptables_lock -t nat -D POSTROUTING -s ${LXC_NETWORK} ! -d ${LXC_NETWORK} -j MASQUERADE || true
iptables $use_iptables_lock -t mangle -D POSTROUTING -o ${LXC_BRIDGE} -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
ifconfig ${LXC_BRIDGE} down || true
brctl delbr ${LXC_BRIDGE} || true
}
if [ -d /sys/class/net/${LXC_BRIDGE} ]; then
if [ ! -f ${varrun}/network_up ]; then
# bridge exists, but we didn't start it
stop;
fi
exit 0;
fi
# set up the lxc network
brctl addbr ${LXC_BRIDGE} || { echo "Missing bridge support in kernel"; stop; exit 0; }
echo 1 > /proc/sys/net/ipv4/ip_forward
mkdir -p ${varrun}
ifconfig ${LXC_BRIDGE} ${LXC_ADDR} netmask ${LXC_NETMASK} up
iptables $use_iptables_lock -I INPUT -i ${LXC_BRIDGE} -p udp --dport 67 -j ACCEPT
iptables $use_iptables_lock -I INPUT -i ${LXC_BRIDGE} -p tcp --dport 67 -j ACCEPT
iptables $use_iptables_lock -I INPUT -i ${LXC_BRIDGE} -p udp --dport 53 -j ACCEPT
iptables $use_iptables_lock -I INPUT -i ${LXC_BRIDGE} -p tcp --dport 53 -j ACCEPT
iptables $use_iptables_lock -I FORWARD -i ${LXC_BRIDGE} -j ACCEPT
iptables $use_iptables_lock -I FORWARD -o ${LXC_BRIDGE} -j ACCEPT
iptables $use_iptables_lock -t nat -A POSTROUTING -s ${LXC_NETWORK} ! -d ${LXC_NETWORK} -j MASQUERADE
iptables $use_iptables_lock -t mangle -A POSTROUTING -o ${LXC_BRIDGE} -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
touch ${varrun}/network_up
end script
post-stop script
[ -f /etc/default/lxc ] && . /etc/default/lxc
[ -f "${varrun}/network_up" ] || exit 0;
# if $LXC_BRIDGE has attached interfaces, don't shut it down
ls /sys/class/net/${LXC_BRIDGE}/brif/* > /dev/null 2>&1 && exit 0;
if [ -d /sys/class/net/${LXC_BRIDGE} ]; then
use_iptables_lock="-w"
iptables -w -L -n > /dev/null 2>&1 || use_iptables_lock=""
ifconfig ${LXC_BRIDGE} down
iptables $use_iptables_lock -D INPUT -i ${LXC_BRIDGE} -p udp --dport 67 -j ACCEPT
iptables $use_iptables_lock -D INPUT -i ${LXC_BRIDGE} -p tcp --dport 67 -j ACCEPT
iptables $use_iptables_lock -D INPUT -i ${LXC_BRIDGE} -p udp --dport 53 -j ACCEPT
iptables $use_iptables_lock -D INPUT -i ${LXC_BRIDGE} -p tcp --dport 53 -j ACCEPT
iptables $use_iptables_lock -D FORWARD -i ${LXC_BRIDGE} -j ACCEPT
iptables $use_iptables_lock -D FORWARD -o ${LXC_BRIDGE} -j ACCEPT
iptables $use_iptables_lock -t nat -D POSTROUTING -s ${LXC_NETWORK} ! -d ${LXC_NETWORK} -j MASQUERADE || true
iptables $use_iptables_lock -t mangle -D POSTROUTING -o ${LXC_BRIDGE} -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
pid=`cat ${varrun}/dnsmasq.pid 2>/dev/null` && kill -9 $pid || true
rm -f ${varrun}/dnsmasq.pid
brctl delbr ${LXC_BRIDGE}
fi
rm -f ${varrun}/network_up
end script
/etc/init/lxc-dnsmasq
со следующим содержанием: .
description "lxc dnsmasq service"
author "Adam Ryczkowski, ispired by Serge Hallyn <serge.hallyn@canonical.com>"
expect fork
start on started lxc-net
stop on stopped lxc-net
env USE_LXC_BRIDGE="true"
env LXC_BRIDGE="lxcbr0"
env LXC_ADDR="10.0.3.1"
env LXC_NETMASK="255.255.255.0"
env LXC_NETWORK="10.0.3.0/24"
env LXC_DHCP_RANGE="10.0.3.2,10.0.3.254"
env LXC_DHCP_MAX="253"
env LXC_DHCP_CONFILE=""
env varrun="/run/lxc-dnsmasq"
env LXC_DOMAIN=""
pre-start script
[ -f /etc/default/lxc ] && . /etc/default/lxc
[ "x$USE_LXC_BRIDGE" = "xtrue" ] || { stop; exit 0; }
if [ ! -d ${varrun} ]; then
mkdir -p ${varrun}
fi
opts="$LXC_DOMAIN_ARG -u lxc-dnsmasq --strict-order --bind-interfaces --pid-file=${varrun}/dnsmasq.pid --conf-file=${LXC_DHCP_CONFILE} --listen-address ${LXC_ADDR} --dhcp-range ${LXC_DHCP_RANGE} --dhcp-lease-max=${LXC_DHCP_MAX} --dhcp-no-override --except-interface=lo --interface=${LXC_BRIDGE} --dhcp-leasefile=/var/lib/misc/dnsmasq2.${LXC_BRIDGE}.leases --dhcp-authoritative --keep-in-foreground"
/usr/sbin/dnsmasq $opts &
end script
post-stop script
if [ -f ${varrun}/dnsmasq.pid ]; then
PID=`cat ${varrun}/dnsmasq.pid`
kill $PID
fi
end script
Я недавно столкнулся с этим, и я думаю, что нашел легкое решение. Я (только) протестировал его на Ubuntu 14.04.
Первый, не прокомментируйте эту строку/etc/default/lxc-net:
LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf
В/etc/lxc/dnsmasq.conf, определите dhcp-hostsfile:
dhcp-hostsfile=/etc/lxc/dnsmasq-hosts.conf
Тогда включают записи/etc/lxc/dnsmasq-hosts.conf как это:
mail,10.0.3.16
web,10.0.3.17
Остерегайтесь: изменения вступят в силу после перезапуска lxc-сети (который перезапускает dnsmasq):
service lxc-net restart
Впоследствии можно изменить/etc/lxc/dnsmasq-hosts.conf и отправить сигнал SIGHUP в dnsmasq:
killall -s SIGHUP dnsmasq
Так да, необходимо перезапустить lxc-сеть, но только однажды. Надежда это помогает.
Это хорошо работает в Ubuntu 14.04.1
Некомментарий эта строка /etc/default/lxc-net
#LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf
остановка все контейнеры, lxc-сеть перезапуска:
service lxc-net restart
Настраивают IP-адреса в /etc/lxc/dnsmasq.conf
dhcp-host={NAME},10.0.3.2
, где {NAME}
название Вашего контейнера LXC:
/var/lib/lxc/{NAME}
Ответ Tombart работает, если Вы достаточно терпеливы для ожидания обновления DNS, И Вы готовы перезапустить контейнер (гость) впоследствии.
то, Что следует, является рецептом, который требует, чтобы все другое возможно выполнение lxc контейнеры было закрыто . Если Вы не можете предоставить это, то я не вижу способа вызвать новую dnsmasq конфигурацию. (Поскольку некоторая передача сигналов reasone ПОНУКАЕТ к dnsmasq's, изодромному с предварением найденный в /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
, если устройство моста не снижается для хоста.
Вот простой сценарий Python, который выпускает LXC dnsmasq арендный договор. Можно выполнить его от хост-машины или подделать его от другого контейнера - да, который работает!:
#!/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')]))
perequisite для вышеупомянутого является scapy библиотекой Python:
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.
Я понимаю, что мой ответ является годами поздно, но возможно он помогает кому-то еще. Проблема была то, что Вы отредактировали код, характерный для пакета Ubuntu LXC (write_lxc_net
функция), который был предназначен, чтобы быть записанным в другое место назначения как строка, не обработанная в lxc-net
сам сценарий!
В результате процесс 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=""