Yerleşik DHCP'nin LXC kapsayıcısına MAC adresine değil, ada göre statik bir IP atamasına izin verme


10

Statik IP'yi manuel olarak kullanarak atayabileceğimi biliyorum /etc/network/interfaces.

Ben de bakarak LXC kabın (örneğin MAC adresini okuyabildiğini, biliyorum lxc.network.hwaddrgirişin /var/lib/lxc/<container-name>/configve girişleri kullanarak tabanlı IP atamak dhcp-host=<mac-addr>,10.0.3.3içinde /etc/dnsmasq.d/<some file>.

/etc/default/lxc-netOkuduğum dosyada

# 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

Bu benim ihtiyaçlarımı karşılayacaktı; ne yazık ki böyle bir etkisi yoktur.


2
Benim için çalışıyor, ancak etkili olması için lxc-net'i yeniden başlatmanız gerektiğini unutmayın. Ve şu anda herhangi bir kapsayıcı başlatılırsa lxc-net'in yeniden başlatılmadığı bilinen bir sorun vardır. Hepsini durdurmanız ve ardından lxc-net hizmetini yeniden başlatmanız gerekir.
HRJ

Ayrıca, yalnızca kapsayıcı adını kullanarak ip adresleri atayamadım. Kapsayıcı ve DHCP yapılandırması için bir MAC adresini kodlamak zorunda kaldım.
HRJ

@HRJ, lütfen dnsmasq.conf dosyanızı gönderebilir misiniz?
tonytony

@HRJ Ubuntu 14.04'te lxcbr0 köprünüzü lxc-netkaldırmazsanız yeniden başlatma size yardımcı olmaz. Cevabımı gör.
Adam Ryczkowski

Yanıtlar:


17

Son zamanlarda bununla karşılaştım ve bence kolay bir çözüm buldum. Ben (sadece) Ubuntu 14.04 üzerinde test ettim.

İlk olarak, bu satırı / etc / default / lxc-net:

LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf

/Etc/lxc/dnsmasq.conf dosyasında bir dhcp-hostsfile tanımlayın:

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

Sonra /etc/lxc/dnsmasq-hosts.conf dosyasına şu şekilde giriş ekleyin:

mail,10.0.3.16
web,10.0.3.17

Dikkat: lxc-net (dnsmasq'ı yeniden başlatan) yeniden başlattıktan sonra değişiklikler etkili olacaktır:

service lxc-net restart

Daha sonra /etc/lxc/dnsmasq-hosts.conf dosyasını değiştirebilir ve SIGHUP sinyalini dnsmasq'a gönderebilirsiniz:

killall -s SIGHUP dnsmasq

Yani evet, lxc-net'i yeniden başlatmanız gerekiyor, ancak sadece bir kez. Bu yardımcı olur umarım.


Ana bilgisayar listesini harici bir dosyaya devretme fikrini seviyorum. Bunun yanı sıra, yönteminiz nedeniyle benimkinden farklı killall -s SIGHUP dnsmasq. Katılıyorum, sadece "SIGHUP-ing" dnsmasq tüm daemon'u yeniden başlattıktan sonra daha etkili olduğunu kabul eder (özellikle de başlangıç ​​komut dosyalarını yamalamadan çalışmazsa).
Adam Ryczkowski

Hizmetin yeniden başlatılması lxc-net, yalnızca dnsmasq'ın /etc/lxc/dnsmasq.conf dosyasındaki yapılandırmayı kullanmasına izin vermek için gereklidir (ve içinde /etc/default/lxc-netbilinmeyen bu bilgi parçası bulunur dnsmasq). Daha önce ayarladıysanız, sadece başka bir SIGHUP yeterli olacaktır.
Adam Ryczkowski

Dikkat: Çalışan kaplar varsa lxc-net dnsmasq'i yeniden başlatmaz.
s3v3n

IMO bu en iyi cevaptır
s3v3n

kill -HUP $(cat /var/run/lxc/dnsmasq.pid)killalldiğer dnsmasqörnekleri yüklemek veya yeniden yüklemek istemiyorsanız
gertas

4

Ubuntu'da iyi çalışıyor 14.04.1

Bu satırı kaldır /etc/default/lxc-net

#LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf

tüm kapları durdurun, lxc-net'i yeniden başlatın:

service lxc-net restart

İçindeki IP adreslerini yapılandır /etc/lxc/dnsmasq.conf

dhcp-host={NAME},10.0.3.2

nerede {NAME}senin LXC kabın adıdır:

/var/lib/lxc/{NAME}

Yalnızca komut dosyası lxcbr0 ağını kapatabilirse çalışır , bu da çalışan başka lxc kapları olduğunda durumu hariç tutar. Kısacası, şu anda olduğu gibi, tüm kapları yeniden başlatmadan statik dhcp kiralamalarını atayamazsınız.
Adam Ryczkowski

Evet, bu doğru, oldukça rahatsız edici :(. /var/lib/lxc/<container-name>/rootfs/etc/network/interfacesDosya düzenlemek ve konteynere statik ip adresi atamak için çok daha kolay bir çözüm buluyorum .
Tombart

Doğru, ama sonra iki misafir aynı IP vermek için sizi koruyacak hiçbir şey yoktur. Kabul edilen cevabımı gör - sorunu çözdü.
Adam Ryczkowski

1

Tombart'ın yanıtı, DNS yenilemesini bekleyecek kadar sabırlıysanız ve daha sonra kapsayıcıyı (misafir) yeniden başlatmak istediğinizde işe yarar.

Aşağıda, tüm diğer çalışan lxc kaplarının kapatılmasını gerektiren tarif yer almaktadır . Eğer bunu karşılayamıyorsanız, yeni dnsmasq yapılandırmasını zorlamanın bir yolunu göremiyorum. (Bazı sebeplerden dolayı HUP'u bulunan dnsmasq'in pidine bildirmek /run/lxc/dnsmasq.pidde işe yaramaz.)

Anında çalışan bir şey istiyorsanız ve çalışan başka bir lxc kapları yoksa, cevabımı takip edin. $nameatamayı sıfırlamak istediğimiz düğümün $internalifadı ve LXC'nin köprülü bağdaştırıcısının adıdır. Sen değerini elde edebilirsiniz $internaliförneğin ile augtool -L -A --transform "Shellvars incl /etc/default/lxc-net" get "/files/etc/default/lxc-net/LXC_BRIDGE" | sed -En 's/\/.* = (.*)/\1/p'yüklerseniz augeas-toolsancak genellikle sadece olduğunu 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

Ne yazık ki, /etc/init/lxc-net.confUbuntu 14.04'te dnsmasqköprü aygıtı ana bilgisayar için kapalı değilse yeniden yüklemeyi engelleyen bir hata (özellik?) Var .


0

Bu çözüm, lxc uptart komut dosyalarını yamalayarak çalışır. Bu, lxcbr0 köprüsünü yukarı kaldırmak ve a'yı dnsmasqiki ayrı işe ayırmak gibi karmaşık bir görevi paylaşır . Şimdi lxc-netsadece yeniden yüklemek için tüm köprüyü yeniden başlatmanız gerekmez dnsmasq- yeniden yükleme sudo service restart lxc-dnsmasqyeterlidir ve köprüyü kapatmayı gerektirmez.

  1. Lxc-net hizmetini durdurun ve yukarı sudo service lxc-net stoplxcbr0 (veya eşdeğeri) köprü olmadığından emin olun.
  2. Öğesinin içeriğini /etc/init/lxc-net.confaşağıdaki içeriklerle değiştirin:

.

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
  1. /etc/init/lxc-dnsmasqAşağıdaki içeriğe sahip başka bir dosya ekleyin :

.

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

0

İşte LXC dnsmasq kiralama serbest python betiği. Ana makineden çalıştırabilir veya başka bir kaptan dövme yapabilirsiniz - evet işe yarıyor !:

#!/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')]))

Yukarıdaki önkoşul scapy python kütüphanesidir:

pip install scapy

Çalıştırdıktan sonra sistem günlüğünde şöyle bir şey görmelisiniz:

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

Onaylamak için girişin kaldırılıp kaldırılmadığını kontrol edin /var/lib/misc/dnsmasq.lxcbr0.leases. Kabın kendisi IP'yi tutacaktır, böylece IP'yi yeniden kullanması gereken herhangi bir yeni kabı başlatmadan önce durdurulması gerekir.


1
Çok havalı! DHCP'nin bunu desteklediğini bile bilmiyordum! Çalıştığını onayladıktan hemen sonra oylayacağım.
Adam Ryczkowski

0

Cevabımın yıllar geçtiğini anlıyorum, ama belki başka birine yardım eder. Sorun, write_lxc_netbaşka bir hedefe dize olarak yazılması amaçlanan LXC Ubuntu paketine ( işlev) özgü kodu, kodun içinde işlenmemiş olarak düzenlemiş olmanızdı lxc-net!

Sonuç olarak, dnsmasq işlemi, iletmeye çalıştığınız yapılandırma dosyasını almadı ve söylediğiniz gibi "etki bırakmadı".

Bunun yerine, bu değişkeni komut dosyasının üst kısmına yakın bir yerde, geri kalanlar arasında ayarlamak istersiniz:

#!/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=""
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.