বিল্ট-ইন ডিএইচসিপি কীভাবে ম্যাকের ঠিকানা নয়, নামের ভিত্তিতে এলএক্সসি ধারককে একটি স্ট্যাটিক আইপি নির্ধারণ করতে দেয়


10

আমি জানি, আমি স্থির আইপি নিজেই ব্যবহার করতে পারি /etc/network/interfaces

আমি এটাও জানি, আমি খুঁজছেন দ্বারা LXC ধারক (যেমন MAC ঠিকানা পড়তে পারেন 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

এটি আমার প্রয়োজন অনুসারে হবে; দুর্ভাগ্যক্রমে এটি করার কোনও প্রভাব নেই।


2
এটি আমার পক্ষে কাজ করে তবে মনে রাখবেন যে এটি কার্যকর হওয়ার জন্য আপনাকে lxc- নেট পুনরায় চালু করতে হবে। এবং একটি জ্ঞাত সমস্যা আছে যে বর্তমানে কোনও ধারক চালু থাকলে lxc-নেট পুনরায় আরম্ভ করবে না। আপনাকে সেগুলি বন্ধ করতে হবে এবং তারপরে lxc- নেট পরিষেবাটি পুনরায় চালু করতে হবে।
এইচআরজে

এছাড়াও, আমি একমাত্র ধারকটির নাম ব্যবহার করে আইপি-ঠিকানা বরাদ্দ করতে সক্ষম হইনি। ধারকটির জন্য এবং ডিএইচসিপি কনফিগারেশনের জন্য আমাকে একটি ম্যাক ঠিকানা হার্ড-কোড করতে হয়েছিল।
এইচআরজে

@ এইচআরজে, আপনার dnsmasq.conf ফাইল পোস্ট করতে পারেন দয়া করে?
টনিটনি

উবুন্টুতে এইচআরজে 14.04-এ পুনরায় চালু করা lxc-netযদি আপনি আপনার lxcbr0 সেতুটি সরিয়ে না ফেলে তবে পুনরায় চালু করা কোনও কাজে দেয় না। আমার উত্তর দেখুন।
অ্যাডাম রাইজকোভস্কি

উত্তর:


17

আমি সম্প্রতি এটিতে ছুটে এসেছি এবং আমি মনে করি যে আমি একটি সহজ সমাধান পেয়েছি। আমি (কেবল) এটি উবুন্টু 14.04 এ পরীক্ষা করেছি।

প্রথমে, এই লাইনটি / ইত্যাদি / ডিফল্ট / এলএক্সসি-নেটকে অসুবিধে করুন:

LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf

/Etc/lxc/dnsmasq.conf এ, একটি ডিএইচসিপি-হোস্টফিল সংজ্ঞা দিন:

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

তারপরে /etc/lxc/dnsmasq-hosts.conf এ এন্ট্রি যুক্ত করুন:

mail,10.0.3.16
web,10.0.3.17

সাবধান: আপনি lxc- নেট পুনরায় চালু করার পরে পরিবর্তনগুলি কার্যকর হয়ে উঠবে (যা ড্যানমাসক পুনরায় আরম্ভ করে):

service lxc-net restart

এরপরে আপনি /etc/lxc/dnsmasq-hosts.conf সংশোধন করতে পারেন এবং সিএনএইচপি সংকেত dnsmasq এ প্রেরণ করতে পারেন:

killall -s SIGHUP dnsmasq

হ্যাঁ, আপনাকে lxc- নেট পুনরায় চালু করতে হবে তবে কেবল একবার। আশাকরি এটা সাহায্য করবে.


আমি বাহ্যিক ফাইলে হোস্টের তালিকা অর্পণ করার ধারণাটি পছন্দ করি। তদ্ব্যতীত, আপনার পদ্ধতিটি কারণ আমার থেকে আলাদা killall -s SIGHUP dnsmasq। আমি সম্মত হই, কেবলমাত্র "সিগআপ-ইনিং" ডিএনএসম্যাস্ক আরও কার্যকর তবে পুরো ডেমোনটি পুনরায় চালু করা (বিশেষত যদি এটির উপরের স্ক্রিপ্টগুলি প্যাচ না করে কাজ না করে)।
অ্যাডাম রাইজকভস্কি

পরিষেবাটি পুনরায় আরম্ভ lxc-netকরা কেবলমাত্র /etc/lxc/dnsmasq.conf (এবং তথ্যের এই অংশটি উপস্থিত রয়েছে /etc/default/lxc-netযা অজানা dnsmasq) এর থেকে ডিএনএমএসএএসসি কনফিগারেশনটি ব্যবহার করতে দেয় । আপনি যদি এটি আগে সেট করে রেখেছিলেন তবে কেবলমাত্র অন্য একটি সিগআপই যথেষ্ট UP
অ্যাডাম রাইজকভস্কি

সাবধানতা: চলমান পাত্রে থাকলে lxc-নেট dnsmasq পুনরায় আরম্ভ করবে না।
s3v3n

আইএমও এটি সেরা উত্তর
s3v3n

kill -HUP $(cat /var/run/lxc/dnsmasq.pid)আপনি ইনস্টল করতে চান না যদি killallবা অন্যান্য রিলোড dnsmasqদৃষ্টান্ত
gertas

4

এটি উবুন্টু 14.04.1 এ দুর্দান্ত কাজ করে

এই লাইন Uncomment /etc/default/lxc-net

#LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf

সমস্ত পাত্রে বন্ধ করুন, lxc- নেট পুনরায় চালু করুন:

service lxc-net restart

আইপি ঠিকানাগুলিতে কনফিগার করুন /etc/lxc/dnsmasq.conf

dhcp-host={NAME},10.0.3.2

{NAME}আপনার এলএক্সসি ধারকটির নাম কোথায় :

/var/lib/lxc/{NAME}

এটি কেবল তখনই কাজ করে যদি স্ক্রিপ্টটি lxcbr0 নেটওয়ার্ক বন্ধ করতে পারে , যা অন্যান্য lxc পাত্রে চলমান ক্ষেত্রে কেস বাদ দেয়। সংক্ষেপে, এটি এখন যেমন দাঁড়িয়েছে, আপনি সমস্ত ধারক পুনরায় চালু না করে স্ট্যাটিক ডিএইচসিপি ইজারা নির্ধারণ করতে পারবেন না।
অ্যাডাম রাইজকভস্কি

হ্যাঁ, এটি সত্য, এটি বেশ অসুবিধাজনক :( আমি /var/lib/lxc/<container-name>/rootfs/etc/network/interfacesফাইল সম্পাদনা করতে এবং
ধারকটিতে

সত্য, তবে তবে দু'জন অতিথিকে একই আইপি দেওয়ার বিরুদ্ধে আপনাকে রক্ষা করার মতো কিছুই নেই। আমার গৃহীত উত্তর দেখুন - এটি সমস্যার সমাধান করে।
অ্যাডাম রাইজকোভস্কি

1

টোনবার্টের উত্তর কাজ করে যদি আপনি ডিএনএস রিফ্রেশের জন্য অপেক্ষা করার মতো যথেষ্ট ধৈর্য ধরে থাকেন এবং আপনি কন্টেইনারটি (অতিথি) পরে পুনরায় চালু করতে রাজি হন।

নিম্নলিখিতটি এমন রেসিপিটি অনুসরণ করে যা প্রয়োজনীয়ভাবে চালিত অন্যান্য সমস্ত lxc ধারক বন্ধ করে দেওয়া দরকার । যদি আপনি এটির সামর্থ্য না রাখেন তবে আমি নতুন ডিএনএসম্যাস্ক কনফিগারেশন জোর করার কোনও উপায় দেখতে পাচ্ছি না। (কিছু রিসোন এইচপি ইঙ্গিত দিচ্ছে যে ডান্সমাস্কের পিডে এইচইপি সংকেত দেয় তাতেও /run/lxc/dnsmasq.pidকাজ হয় না))

সুতরাং আপনি যদি এমন কিছু পেতে চান যা তাত্ক্ষণিকভাবে কাজ করে এবং সেখানে অন্য কোনও এলএক্সসি পাত্রে চলছে না, তবে আমার উত্তরটি অনুসরণ করুন। $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উবুন্টুতে 14.04-তে একটি বাগ (বৈশিষ্ট্য?) রয়েছে dnsmasqযা ব্রিজ ডিভাইসটি হোস্টের জন্য ডাউন না করা থাকলে পুনরায় লোড করা রোধ করে ।


0

এই সমাধানটি lxc আপস্টার্ট স্ক্রিপ্টগুলি প্যাচ করে কাজ করে। এটি lxcbr0 ব্রিজটি সামনে আনার dnsmasqএবং দুটি পৃথক কাজ শুরু করার জটিল কাজকে বিভক্ত করে । এখন আপনাকে lxc-netকেবল পুনরায় লোড করার জন্য পুরো ব্রিজটি পুনরায় চালু করার দরকার নেই dnsmasq- পুনরায় লোড sudo service restart lxc-dnsmasqকরা যথেষ্ট এবং সেতুটি বন্ধ করার প্রয়োজন নেই।

  1. Lxc- নেট পরিষেবা বন্ধ করুন 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

এখানে সহজ পাইথন স্ক্রিপ্ট যা 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

আমি বুঝতে পারি আমার উত্তরটি কয়েক বছর দেরি হয়েছে, তবে এটি সম্ভবত অন্য কাউকে সহায়তা করে। সমস্যাটি হ'ল আপনি এলএক্সসি উবুন্টু প্যাকেজ ( 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=""
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.