कैसे अंतर्निहित डीएचसीपी को नाम के आधार पर एलएक्ससी कंटेनर को एक स्थिर आईपी असाइन करना है, मैक पते को नहीं


10

मुझे पता है, कि मैं स्थिर IP को मैन्युअल रूप से असाइन कर सकता हूं /etc/network/interfaces

मुझे यह भी पता है, कि मैं LXC कंटेनर का MAC पता पढ़ सकता हूं (जैसे कि lxc.network.hwaddrप्रवेश की तलाश करके /var/lib/lxc/<container-name>/configऔर 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

यह मेरी आवश्यकताओं के अनुरूप होगा; दुर्भाग्य से ऐसा करने का कोई प्रभाव नहीं है।


2
यह मेरे लिए काम करता है, लेकिन ध्यान दें कि आपको प्रभावी होने के लिए lxc-net को पुनरारंभ करना होगा। और वहाँ एक ज्ञात मुद्दा है कि अगर कोई कंटेनर वर्तमान में शुरू किया गया है तो lxc-net नहीं है। आपको उन सभी को रोकने की आवश्यकता है और फिर lxc-net सेवा को पुनरारंभ करें।
HRJ

इसके अलावा, मैं अकेले कंटेनर नाम का उपयोग करके आईपी-पते निर्दिष्ट करने में सक्षम नहीं था। मुझे कंटेनर के लिए और डीएचसीपी कॉन्फ़िगरेशन के लिए मैक पते को हार्ड-कोड करना था।
एचआरजे

@HRJ, क्या आप अपनी dnsmasq.conf फाइल को पोस्ट कर सकते हैं?
टोनीटोनी

@HRJ उबंटू 14.04 को फिर से शुरू करने से lxc-netमदद नहीं मिलती है अगर आप अपने lxcbr0 पुल को नहीं हटाते हैं। मेरा जवाब देखिए।
एडम रिक्ज़ोस्की

जवाबों:


17

मैं हाल ही में इसमें भाग गया और मुझे लगता है कि मुझे एक आसान समाधान मिला। मैंने (केवल) इसे उबंटू 14.04 पर परीक्षण किया।

सबसे पहले, इस लाइन को अनइंस्टॉल करें / etc / default / lxc-net:

LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf

/Etc/lxc/dnsmasq.conf में, dhcp-Hostfile को परिभाषित करें:

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 को संशोधित कर सकते हैं और dnsmasq को SIGHUP संकेत भेज सकते हैं:

killall -s SIGHUP dnsmasq

तो हां, आपको lxc-net को पुनरारंभ करने की आवश्यकता है, लेकिन केवल एक बार। उम्मीद है की यह मदद करेगा।


मुझे मेजबानों की सूची बाहरी फाइल में सौंपने का विचार पसंद है। इसके अलावा, आपका तरीका खान से अलग है killall -s SIGHUP dnsmasq। मैं सहमत हूं, कि सिर्फ "SITEUP-ing" dnsmasq अधिक कुशल है तो पूरे डेमॉन को पुनरारंभ करना (विशेषकर यदि यह अपने ऊपर की स्क्रिप्ट को पैच किए बिना काम नहीं करता है)।
एडम रिक्ज़ोस्की

सेवा lxc-netको पुनः आरंभ करने के लिए केवल detmasq को /etc/lxc/dnsmasq.conf से कॉन्फ़िगरेशन का उपयोग करने की आवश्यकता है (और यह जानकारी मौजूद है /etc/default/lxc-netजिसमें अज्ञात है dnsmasq)। यदि आपने इसे पहले सेट किया था, तो बस एक और साइटअप पर्याप्त होना चाहिए।
एडम रिक्ज़ोस्की

खबरदार: अगर कंटेनर चल रहे हैं तो lxc-net dnsmasq को रीस्टार्ट नहीं करेगा।
s3v3n

IMO यह सबसे अच्छा जवाब है
s3v3n

kill -HUP $(cat /var/run/lxc/dnsmasq.pid)यदि आप killallअन्य dnsmasqइंस्टेंस को स्थापित या फिर से लोड नहीं करना चाहते हैं
gertas

4

यह 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}

यह तभी काम करता है जब स्क्रिप्ट lxcbr0 नेटवर्क को बंद कर सकती है , जो उस मामले को बाहर कर देता है जब अन्य lxc कंटेनर चल रहे होते हैं। संक्षेप में, जैसा कि यह अब खड़ा है, आप सभी कंटेनरों को पुनः आरंभ किए बिना स्थैतिक dhcp पट्टों को निर्दिष्ट नहीं कर सकते।
एडम रिक्ज़ोस्की

हां, यह सच है, यह काफी असुविधाजनक है :(। मैं /var/lib/lxc/<container-name>/rootfs/etc/network/interfacesफ़ाइल को संपादित करने और कंटेनर को स्टेटिक आईपी एड्रेस असाइन करने के लिए बहुत आसान समाधान
ढूंढता हूं

सच है, लेकिन फिर दो मेहमानों को एक ही आईपी देने के खिलाफ आपकी रक्षा करने के लिए कुछ भी नहीं है। मेरा स्वीकृत जवाब देखें - यह समस्या को हल करता है।
एडम रिक्ज़ोस्की

1

टॉमबार्ट का जवाब काम करता है यदि आप डीएनएस ताज़ा करने के लिए इंतजार करने के लिए पर्याप्त धैर्य रखते हैं और आप बाद में कंटेनर (अतिथि) को पुनरारंभ करने के लिए तैयार हैं।

इस प्रकार यह नुस्खा है जिसके लिए आवश्यक है कि सभी अन्य संभावित रूप से चलने वाले lxc कंटेनर बंद हो जाएं । यदि आप ऐसा नहीं कर सकते हैं, तो मुझे नया dnsmasq कॉन्फ़िगरेशन मजबूर करने का कोई तरीका नहीं दिखता है। (कुछ reasone संकेत के लिए HUP को dnsmasq के pid में पाया गया /run/lxc/dnsmasq.pidहै जो या तो काम नहीं करता है।)

तो अगर आप चाहते हैं कि कुछ ऐसा हो जो तुरंत काम करता हो और कोई अन्य lxc कंटेनर नहीं चल रहा हो, तो मेरे उत्तर का पालन करें। $nameउस नोड का नाम है जिसके लिए हम असाइनमेंट को रीसेट करना चाहते हैं, और $internalifLXC के ब्रिजिंग एडेप्टर का नाम है। यदि आप स्थापित करते हैं तो आप $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-toolslxcbr0

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.confUbuntu 14.04 में एक बग (सुविधा?) है जो dnsmasqतब तक फिर से लोड होने से रोकता है जब तक कि मेजबान के लिए पुल डिवाइस नीचे नहीं होता है।


0

यह समाधान lxc upstart स्क्रिप्ट को पैच करके काम करता है। यह lxcbr0 ब्रिज को लाने और dnsmasqदो अलग-अलग नौकरियों में शुरू करने के जटिल कार्य को विभाजित करता है । अब आपको पूरे lxc-netपुल को पुनः लोड dnsmasqकरने की sudo service restart lxc-dnsmasqआवश्यकता नहीं है - बस पुनः लोड करना पर्याप्त है और पुल को बंद करने की आवश्यकता नहीं है।

  1. Lxc-net सेवा बंद करें sudo service lxc-net stopऔर सुनिश्चित करें कि कोई lxcbr0 (या समतुल्य) पुल ऊपर नहीं है।
  2. /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
  1. /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

0

यहाँ सरल 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')]))

उपर्युक्त के लिए अति आवश्यक है पाइथन लाइब्रेरी:

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। कंटेनर खुद ही आईपी रखेगा इसलिए किसी भी नए कंटेनर को शुरू करने से पहले रोक दिया जाना चाहिए जो आईपी का पुन: उपयोग करना चाहिए।


1
यह अच्छा है! मुझे यह भी नहीं पता था कि डीएचसीपी समर्थन करता है! मैं इसकी पुष्टि करता हूं कि मैं इसकी पुष्टि करता हूं कि यह काम करता है।
एडम रिक्ज़ोस्की

0

मुझे लगता है कि मेरे उत्तर में वर्षों की देर है, लेकिन शायद यह किसी और की मदद करता है। मुद्दा यह था कि आपने 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=""
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.