วิธีกำหนดค่าที่อยู่ IP ภายนอกสำหรับแขกของ LXC


18

ฉันสำรวจคุณสมบัติ LXC ใน Ubuntu 12.04 และฉันต้องการตั้งค่าเครือข่ายเช่นนี้:

client1:   192.168.56.101/24
lxc-host:  192.168.56.102/24
guest1     192.168.56.201/24
guest2     192.168.56.202/24
guest3     192.166.56.203/24

ฉันแค่ต้องการเครือข่าย "แบน" ที่แขกสามารถเข้าถึง LAN ได้อย่างเต็มที่และมองเห็นได้จากลูกค้า ฉันคุ้นเคยกับการเชื่อมต่อเครือข่ายด้วย libvirt / KVM ดังที่อธิบายไว้ที่นี่: http://libvirt.org/formatdomain.html#elementsNICSBridge

บนโฮสต์:

# /etc/network/interfaces
auto br0
iface br0 inet static
    address 192.168.56.102
    netmask 255.255.255.0
    broadcast 192.168.56.255
    bridge_ports eth1

lxc.conf สำหรับแขกรายแรก:

# /var/lib/lxc/guest1/config:
lxc.network.type=veth
lxc.network.link=br0
lxc.network.flags=up
lxc.network.hwaddr=00:16:3e:13:48:4e
lxc.network.ipv4=192.168.56.201/24

ดูเหมือนว่า 192.168.56.201 จะมองไม่เห็นกับโลกภายนอกซึ่งไม่ใช่สิ่งที่ฉันต้องการ ดูเหมือนว่าฉันต้องทำสิ่งใดสิ่งหนึ่งต่อไปนี้:

1) ตั้งค่าการกำหนดเส้นทางด้วยตัวเองบนโฮสต์และแขก

2) ทำอะไรบางอย่าง hokey ... lxc.network.type=physสร้างการเชื่อมต่อเสมือนบนโฮสต์ไปข้างหน้าของเวลาและกำหนดค่าบุคคลที่จะใช้พวกเขา ฉันไม่รู้ว่ามันจะใช้งานได้จริงหรือเปล่า

ฉันมุ่งเน้นไปที่ Ubuntu แต่คำตอบสำหรับ RHEL / Fedora ก็มีประโยชน์เช่นกัน ....


1
ติดตาม: ฉันตั้ง br0 เป็นโหมด promiscuous และดูเหมือนว่าจะทำสิ่งที่ฉันต้องการตอนนี้ ฉันเดาว่านี่เป็นแบบฝึกหัดมาตรฐาน แต่มันไม่ได้กล่าวถึงบทเรียนแบบฝึกหัด LXC มากมายที่ฉันได้อ่าน ฉันจะทิ้งคำถามนี้ไว้สักครู่เพื่อรับความคิดเห็นใด ๆ ...
twblamer

ฉันทำประมาณเดียวกัน (ยกเว้นการตั้งค่าด้วยตนเองอีกเล็กน้อย): สคริปต์ netup ในการกำหนดค่า lxc แต่ละรายการเพื่อเพิ่ม veth to the bridge (บนโฮสต์) การตั้งค่า IP ด้วยตนเองในแต่ละคอนเทนเนอร์สคริปต์ / อินเตอร์เฟสเพิ่มเติมในแต่ละคอนเทนเนอร์เพื่อตั้งค่า up routing (ผ่านการส่งต่อ ip4 บนโฮสต์) แต่เท่าที่ฉันเห็นโซลูชันทั้งสองหมายความว่าคอนเทนเนอร์สามารถตั้งค่าที่อยู่ IP ของตัวเองให้เป็นอะไรก็ได้ (และการเพิ่มอินเทอร์เฟซหลักของโฮสต์ไปยังบริดจ์นั้นไม่สะดวกเล็กน้อย) ดังนั้นฉันจึงสนใจข้อเสนอแนะ / วิธีแก้ปัญหา
HoverHell

คำตอบ:


13

มันค่อนข้างถูกต้อง - แม้ว่าคุณจะพลาดสายแบบนี้:

lxc.network.ipv4.gateway = X.X.X.X

ฉันมีแขก LXC ที่ทำงานบน Debian ก่อนอื่นคุณตั้งค่าบริดจ์โฮสต์ (วิธีง่าย ๆ ) ใน/etc/network/interfaces:

auto wan
iface wan inet static
        address 72.X.X.X
        netmask 255.255.255.0
        gateway 72.X.X.1
        bridge_ports wan_phy    # this line is important.
        bridge_stp off
        bridge_fd 2
        bridge_maxwait 20

ในกรณีของคุณที่คุณเรียกมันและฉันเรียกมันว่าbr0 wanสะพานสามารถเรียกได้ทุกอย่างที่คุณต้องการ คุณทำให้สิ่งนี้ทำงานได้ก่อน - หากล้มเหลวให้ตรวจสอบด้วย (เช่น)brctl

จากนั้นตั้งค่า LXC ของคุณเพื่อเข้าร่วมบริดจ์นั้น:

lxc.utsname = FOO
lxc.network.type = veth
lxc.network.link = wan                  # remember, this is what I call my bridge
lxc.network.flags = up
lxc.network.name = v-wan                # optional, I believe
lxc.network.ipv4 = 72.X.X.Y/24          # different IP than the host
lxc.network.ipv4.gateway = 72.X.X.1     # same as on the host

ในฐานะที่เป็น HoverHell หมายเหตุคนที่มีรูทในคอนเทนเนอร์สามารถเปลี่ยนที่อยู่ IP ได้ อ๋อ มันเป็นบริดจ์ (หรือที่รู้จักว่าสวิตช์อีเธอร์เน็ต) หากคุณต้องการป้องกันสิ่งนั้นคุณสามารถใช้กฎไฟร์วอลล์บนโฮสต์ - อย่างน้อยในกรณีของฉันแพ็กเก็ตต้องผ่าน iptables ของโฮสต์


10
ขอบคุณทุกคน มันช่างเป็นเรื่องเศร้า แต่ฉันเพิ่งกลับมาที่นี่พบสิ่งนี้ผ่านทาง google และลืมว่าฉันเป็นผู้ถามเดิม ...
twblamer

2
@derobert: ไม่แน่ใจว่ามันพร้อมใช้งานแล้ว แต่autoยังเป็นค่าที่ถูกต้องสำหรับlxc.network.ipv4.gatewayและเพื่อความเข้าใจของฉันค่าเริ่มต้นของ IP ของบริดจ์ที่เชื่อมต่อกับ veth-interface
0xC0000022L

อินเตอร์เฟสบริดจ์ต้องใช้ IP ของตัวเองหรือไม่ หากwan_phyกำลังเผชิญกับอินเทอร์เน็ตบริดจ์ IP จะต้องเป็นที่อยู่ IPv4 สาธารณะอีกอันที่ถูกต้องเพราะจะต้องอยู่ในซับเน็ตเดียวกันกับที่อยู่ IPv4 สาธารณะอื่น ๆ ที่ฉันจะกำหนดค่าแขก lxc ด้วยใช่ไหม? แต่ดูเหมือนว่าสิ้นเปลืองมาก askubuntu.com/a/884293/394569แนะนำว่าไม่จำเป็นต้องกำหนดค่าที่อยู่บริดจ์
josch

@josch ในตัวอย่างนั้น wan_phy ไม่มี IP แต่อยู่บนสะพานแทน ฉันสงสัยว่ามันต้องการ IP เลยแม้ว่าคุณจะไม่ต้องการให้ "โฮสต์" มี IP ภายนอก
Derobert

6

ฉันยังไม่ได้เข้าสู่ LXC อย่างสมบูรณ์

แต่ฉันมีการตั้งค่าหลาย ๆ ตู้คอนเทนเนอร์ที่มี IP แบบคงที่ของตัวเองใน LAN ซึ่งให้บริการอินเทอร์เน็ตสำหรับบางเว็บไซต์ของฉัน ...

บางทีนี่อาจช่วยคุณได้ในสิ่งที่คุณต้องการ

ฉันใช้หลาย ๆ คอนเทนเนอร์อย่างนั้น

บนเครื่องโฮสต์ฉันแก้ไขไฟล์โฮสต์เพิ่มแต่ละคอนเทนเนอร์และเครื่องโฮสต์: vi / etc / hosts

lxc host machine:   192.168.1.100
container1:   192.168.1.101
container2:     192.168.1.102
container3:   192.168.56.102
container4:   192.166.56.103

หลังจากบันทึก ...

อีกครั้งบนเครื่องโฮสต์ฉันตั้งค่าเครือข่าย & บริดจ์เป็น:

# /etc/network/interfaces
auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0
        **address** 192.168.1.100
        netmask 255.255.255.0
        **network 192.168.1.1**
        **broadcast** 192.168.1.100
        gateway 192.168.1.1
        dns-nameservers 8.8.8.8 8.8.4.4

ด้านบนเครือข่ายคือเราเตอร์ของฉันสำหรับ LAN (ภายใน) ที่ อยู่และออกอากาศเป็นเครื่องโฮสต์ IP ภายในซึ่งฉันใช้ VHOST สำหรับการเข้าถึงอินเทอร์เน็ต webservers, ftp และอื่น ๆ ในภายหลัง

สำหรับภาชนะบรรจุ LXC 1-4 ฉันตั้งค่า CONFIG LIKE SO:

LXC CONFIG
lxc.network.type=veth
lxc.network.link=br0
lxc.network.flags=up
lxc.network.hwaddr=00:16:3e:13:48:4e
**lxc.network.ipv4=192.168.1.101**

ตอนนี้คอนเทนเนอร์ 1 IP = 192.168.1.101

ฉันทำซ้ำสำหรับคอนเทนเนอร์เพิ่มเติมเพื่อให้มี ip แบบคงที่ของตัวเองบน LAN ..

ในคอนเทนเนอร์ 1-4

เข้าสู่ระบบจากโฮสต์:

lxc-console -n CONTAINERNAME,

& ฉันตั้งค่าแต่ละเครือข่ายคอนเทนเนอร์เป็นแบบคงที่, eth0 เป็น:

auto eth0
iface eth0 inet static
        address 192.168.1.101
        netmask 255.255.255.0
        network 192.168.0.0
        broadcast 192.168.1.101
        gateway 192.168.1.1
        dns-nameservers 8.8.8.8 8.8.4.4

แต่ละคอนเทนเนอร์มี IP ของตัวเอง (ในพื้นที่) พร้อมใช้งานบน LAN คุณสามารถ SSH แต่ละ IP ท้องถิ่นสำหรับการทดสอบโดยใช้พุตตี้!

หลังจากนั้นฉันค่อนข้างแน่ใจว่าคุณควรจะหาวิธีการเรียกใช้ผ่านทางอินเทอร์เน็ตหลังจากตัวอย่างเช่น vhost เพื่อ container ip / load balancer / proxy / etc

บางทีการตั้งค่านี้สามารถช่วยได้


หากคุณกำหนดค่า IP และเกตเวย์ ฯลฯ ในการกำหนดค่าคอนเทนเนอร์ LXC ไม่จำเป็นต้องทำซ้ำภายในคอนเทนเนอร์ ตั้งค่าifacestanza เป็นmanual(ไม่ใช่staticหรือdhcp) แทน up, down, dns-nameserversฯลฯ ยังสามารถใช้ใน Debian ฯลฯ
0xC0000022L

1

ฉันยังไม่ได้เล่นกับ LXC แต่บทความนี้ควรช่วยคุณ: การกำหนดค่าเครือข่ายโดยใช้สะพานอีเธอร์เน็ต (ตรวจสอบวิธีที่ 2)

เพื่อให้คำแนะนำเกี่ยวกับการกำหนดค่าบางอย่าง (ฉันถือว่าคุณมี br0 อย่างเหมาะสมแล้ว):

  1. คุณต้องสร้างอุปกรณ์สัตวแพทย์คู่หนึ่งโดยใช้ ip link add type veth
  2. คำสั่งก่อนหน้านี้ได้สร้าง 2 อินเตอร์เฟสเสมือน: veth0 และ veth1
  3. ตอนนี้เพิ่มอินเตอร์เฟสเสมือน veth0 เข้ากับบริดจ์: brctl addif br0 veth0
  4. ในเชลล์ lxc ของคุณพิมพ์: ns_exec -nm -- /bin/bash
  5. ตอนนี้เราต้องตั้งค่า virtual อื่น ๆ ถ้าเป็นเนมสเปซเครือข่ายของเชลล์ lxc: ip link set veth1 netns PID_OF_LXC_SHELL
  6. ตอนนี้โดยการกำหนดค่า veth1 ในเชลล์ lxc ไปยังที่อยู่ IP ที่คุณต้องการ (เช่น 192.168.56.201) คุณควรจะตั้งค่าทั้งหมด

คุณยังไม่ได้ทดสอบสิ่งนี้เลยเหรอ? คุณอาจได้รับเงินรางวัล แต่คำตอบของคุณไม่ได้ช่วยอะไรเลยและฉันมีการตั้งค่าแบบเดียวกับ OP
Jonas G. Drange

ฉันจะช่วยคุณได้มากขึ้นได้อย่างไร มีคำตอบของฉันในขั้นตอนเดียวที่ไม่ได้ผลหรือคุณทำมันแล้วและมันไม่ได้แก้ปัญหาหรือไม่? ไม่เช่นนั้นในคำตอบของฉัน LXC อยู่ในรายการสิ่งที่ต้องทำของฉัน แต่ฉันยังไม่ได้เริ่มการทดสอบจริง
Huygens
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.