ถ้าฉันใช้ Virtualbox เพื่อหมุน VM ฉันสามารถเลือก "เชื่อมต่อ" เป็นประเภทอะแดปเตอร์เครือข่ายและส่งผลให้ NIC แขก/เสมือนเชื่อมต่อกับ LAN จริงของฉัน และรับ LAN IP จากเราเตอร์ของฉัน (ผ่าน DHCP)

ฉันต้องการใช้ฟังก์ชันเดียวกันนี้ แต่แทนที่จะใช้ Virtualbox ฉันต้องการใช้คอนเทนเนอร์ lxc/lxd

ฉันจะบรรลุเป้าหมายนี้ได้อย่างไร

แก้ไข 1

ฉันใช้ Ubuntu และลองทำตามคำแนะนำนี้:

https://insights.ubuntu.com/2015/11/10/converting-eth0-to-br0-and-getting-all-your-lxc-or-lxd-onto-your-lan/

...แต่มันไม่ช่วยอะไร อินเทอร์เฟซโฮสต์ดั้งเดิมควรมี IP ในภายหลังหรือไม่ เพราะมันไม่เป็นเช่นนั้นเมื่อฉันลองใช้การเชื่อมต่อแบบแมนนวล

แก้ไข2

ถ้ามันช่วยได้ โฮสต์ lxd/lxc ของฉันคือเครื่องเสมือน Virtualbox ที่ทำงานบน Ubuntu ตั้งค่าด้วยบริดจ์เครือข่ายไปยังอีเทอร์เน็ต NIC จริงของฉัน

แก้ไข 3

ถ้าฉันใช้ tcpdump เพื่อตรวจสอบทราฟฟิก icmp บนอินเตอร์เฟสบริดจ์ อินเตอร์เฟสฟิสิคัล/โฮสต์ และอินเตอร์เฟสคอนเทนเนอร์/เสมือน เฉพาะคอนเทนเนอร์/เสมือนเท่านั้นที่ไม่ได้รับทราฟฟิกใดๆ อีกสองคนทำ

แก้ไข 4

ตามคู่มือนี้:

http://www.microhowto.info/troubleshooting/troubleshooting_ethernet_bridging_on_linux.html

ฉันไม่มีปัญหากับการตั้งค่าบริดจ์ของฉัน

ตามที่กล่าวไว้ใน "แก้ไข 3" อินเทอร์เฟซคอนเทนเนอร์ไม่ได้รับการเข้าชมใดๆ ต้องหาสาเหตุ แต่ไม่รู้จะทำไง...

ฉันรู้สึกว่ามันเกี่ยวข้องกับเส้นทาง

คอนเทนเนอร์ไม่มีเส้นทางในขณะที่โฮสต์ทำ

แก้ไข 5

การใช้ tcpdump เพื่อตรวจสอบการรับส่งข้อมูล arp แสดงว่าการรับส่งข้อมูล arp กำลังเข้าสู่คอนเทนเนอร์/อินเทอร์เฟซเสมือน

ดังนั้นจึงเป็นเพียงปริมาณการใช้ icmp ที่ไม่ใช่

แก้ไข 6

ถ้าฉันตั้งค่า IP แบบคงที่ในคอนเทนเนอร์ (ผ่าน /etc/network/intefaces*) ซึ่งจะทำให้ฉันสามารถ ping คอนเทนเนอร์จากโฮสต์ (ซึ่งเป็นเครื่อง Virtualbox)

ถ้าฉันเปลี่ยนการกำหนดค่าเครือข่ายใน Virtualbox เพื่ออนุญาตการรับส่งข้อมูลที่หลากหลาย ฉันสามารถ ping คอนเทนเนอร์จากเครื่องจริงของฉัน (โฮสต์ของเครื่อง Virtualbox) จากที่นี่ ฉันยังไม่สามารถ ping เกิน LAN จริงจากภายในคอนเทนเนอร์ได้

ขั้นตอนสุดท้าย ถ้าฉันเพิ่มเส้นทาง "เริ่มต้น" ด้วยตนเองในคอนเทนเนอร์ดังนี้:

route add default gw 192.168.0.1 eth0

ที่อนุญาตให้ฉัน ping นอก LAN จริงจากภายในคอนเทนเนอร์

ดังนั้นเว้นแต่จะมีคนอื่นให้คำอธิบายได้ (ฉันจะรอก่อนที่จะโพสต์คำตอบ) ฉันเดาว่าการขาดการสนับสนุนคอนเทนเนอร์ DHCP (ผ่านการเชื่อมโยง) มีส่วนเกี่ยวข้องกับข้อเท็จจริงที่ว่า lxc/lxd ใช้ netmasq เพื่อจัดการ DHCP (และ DNS)

answer
  1. หากโฮสต์ LXD ของคุณเป็นเครื่องเสมือนจริง ๆ ตรวจสอบให้แน่ใจว่าอะแดปเตอร์เครือข่ายของเครื่องเสมือนได้รับการกำหนดค่าให้เป็นโหมดสำส่อน เพื่อให้การรับส่งข้อมูลคอนเทนเนอร์ LXD ผ่านจากฟิสิคัลไปยังเครือข่ายเสมือน
  2. ตั้งค่าที่อยู่ IP แบบคงที่ในคอนเทนเนอร์ lxd เนื่องจาก DHCP (จากฟิสิคัลเกตเวย์ของคุณ) ดูเหมือนจะไม่ทำงาน

ในการแก้ไขครั้งที่ 6 ของฉัน ฉันบอกว่าฉันต้องเพิ่มเส้นทางเริ่มต้นในคอนเทนเนอร์ด้วยตนเอง แต่นั่นไม่เป็นความจริง ฉันต้องทำอย่างนั้นเพราะฉันลืมระบุที่อยู่ IP เกตเวย์ LAN ใน/etc/network/interfacesไฟล์ ดังนั้นไม่ใช่ปัญหา LXD เพียงอย่าลืมระบุ

คุณต้องสร้างอินเทอร์เฟซบริดจ์ ซึ่งอินเทอร์เฟซ OS โฮสต์ของคุณจะเป็นขาเดียว จากนั้นแนบคอนเทนเนอร์ lxc กับบริดจ์นี้ ด้วยวิธีนี้ คุณจะได้การเชื่อมต่อบริดจ์ที่เหมาะสม

ส่วนหนึ่งของการกำหนดค่าคอนเทนเนอร์ของคุณจะมีลักษณะดังนี้:

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0

แม้ว่าการกำหนดค่าบริดจ์ OS ของคุณจะเป็นแบบเฉพาะ distro

สิ่งที่คุณต้องการโดยทั่วไปคือคอนเทนเนอร์เพื่อใช้เกตเวย์เริ่มต้นที่สามารถส่งต่อการรับส่งข้อมูลไปยังส่วนที่เหลือของเครือข่ายของคุณ และเส้นทางแบบคงที่บนเราเตอร์ของคุณที่สามารถส่งต่อกลับไปยังระบบนั้นได้ นี่อาจเป็นโฮสต์ lxd ของคุณ (โดยใช้การส่งต่อ IPใน Linux) หรือคุณอาจมีคอนเทนเนอร์เฉพาะสำหรับจัดการเส้นทาง (อาจเรียกใช้ไฟร์วอลล์เพื่อจำกัดคอนเทนเนอร์ IP/พอร์ตที่สามารถเข้าถึงได้)

หากคุณกำลังใช้บริดจ์ lxdbr0 เริ่มต้น และต้องการเปลี่ยนเกตเวย์สำหรับคอนเทนเนอร์ คุณสามารถใช้การตั้งค่าraw.dnsmasq โดยปกติจะถูกตั้งค่าเป็น IP ที่คุณใช้สำหรับโฮสต์ lxd เมื่อกำหนดค่าบริดจ์ แต่สามารถเปลี่ยนได้โดยใช้dhcp-option=3:

lxc network show lxdbr0
config:
  ipv4.address: 192.168.4.1/24
  ipv6.address: none
  raw.dnsmasq: dhcp-option=3,192.168.4.2
description: ""
name: lxdbr0
type: bridge
used_by:
- /1.0/containers/ubuntu-test
managed: true

ip route showเมื่อคุณแล้วรีสตาร์ทภาชนะที่คุณสามารถมองเห็นประตูใหม่โดยใช้

เมื่อคอนเทนเนอร์ถูกตั้งค่าให้ใช้เกตเวย์เริ่มต้นที่ต้องการ ตรวจสอบให้แน่ใจว่าระบบได้รับการตั้งค่าให้ส่งต่อแพ็กเก็ต IP ณ จุดนี้คอนเทนเนอร์ของคุณควรสามารถ ping IP อื่น ๆ บนโฮสต์นั้นได้ แต่จะเข้าถึงสิ่งอื่นบนเครือข่ายไม่ได้ เนื่องจากส่วนที่เหลือของเครือข่ายไม่มีข้อมูลการกำหนดเส้นทางสำหรับวิธีส่งคืนปลายทางของแพ็กเก็ตสำหรับซับเน็ตคอนเทนเนอร์

หากนี่คือเครือข่ายภายในบ้านที่อยู่เบื้องหลังเราเตอร์ คุณสามารถเพิ่มเส้นทางแบบคงที่บนเราเตอร์ที่บ้านของคุณเพื่อบอกให้ทราบว่าจะส่งแพ็กเก็ตเหล่านั้นไปที่ใด หากโฮสต์ lxd ของคุณใช้ IP แบบคงที่ 192.168.0.2 และคอนเทนเนอร์ของคุณใช้ซับเน็ตที่ 192.168.4.0/24 คุณจะต้องเพิ่มซับเน็ตนั้นเป็นเส้นทางคงที่โดยมีโฮสต์ .2 IP โฮสต์ของคุณเป็นเกตเวย์ ซึ่งจะทำให้สามารถกำหนดเส้นทางแพ็กเก็ตระหว่างคอนเทนเนอร์และเครือข่ายท้องถิ่นโดยใช้โฮสต์ lxd ของคุณเป็นเกตเวย์ระหว่างสองเครือข่าย