แก้ไข: WIP: สาเหตุหลักสำหรับความล้มเหลวที่อธิบายไว้ด้านล่างเกิดจากฉันไม่ได้เปิดอินเทอร์เฟซโฮสต์ TAP ในเวลาที่เหมาะสม หากฉันอนุญาตให้ QEMU จัดการการสร้างอุปกรณ์แตะ ทุกอย่างจะทำงานตามที่คาดไว้ ฉันจะตรวจสอบความล้มเหลวในรายละเอียดเพิ่มเติมและให้คำอธิบายที่ชัดเจนยิ่งขึ้นเกี่ยวกับปัญหาเมื่อฉันได้รับ ขอบคุณ @anx สำหรับคำแนะนำ!
เป้าหมาย: วิ่ง dnsmasq
ภายในโฮสต์ QEMU VM ที่ให้บริการเน็ตบูท
จาก QEMU VM อื่นที่ทำงานบนโฮสต์
ฉันต้องการให้ dnsmasq VM ทำหน้าที่เป็นเกตเวย์ โดยมี NIC หนึ่งตัวเป็น
อินเทอร์เฟซ WAN อัปสตรีมพร้อมเซิร์ฟเวอร์ DHCP อัปสตรีม และอื่นๆ
อินเทอร์เฟซ LAN ส่วนตัว ซึ่ง VM อื่น ๆ จะเป็น
"เสียบ" และจะ netboot จาก dnsmasq ที่ฟังส่วนตัวนี้
อินเทอร์เฟซ LAN
ก่อนอื่น เพื่อให้ VM คุยกันได้ ฉันสร้างสะพานของตัวเอง
บนโฮสต์
ip link เพิ่มชื่อ vivianbr0 ประเภทบริดจ์
ลิงค์ ip ตั้งค่า vivianbr0 ขึ้น
เพื่อให้ VM คุยกันผ่านโฮสต์บริดจ์ ฉันจะต้องมีสองอย่าง
แตะอุปกรณ์ หนึ่งรายการสำหรับอินเทอร์เฟซ LAN ส่วนตัวบนเกตเวย์ VM และ
อีกอันสำหรับอินเทอร์เฟซเครือข่ายเดี่ยว VMs ส่วนตัว
ip tuntap เพิ่มโหมด tap tap0 ผู้ใช้ cturner
ip tuntap เพิ่มโหมด tap tap1 ผู้ใช้ cturner
ลิงค์ ip ตั้งค่า tap0 ขึ้น
ลิงค์ ip ตั้งค่า tap1 ขึ้น
ip link ตั้ง tap0 master vivianbr0
ip link ตั้ง tap1 master vivianbr0
สำหรับเกตเวย์ VM ฉันใช้ Arch Linux ISO เพื่อการทดสอบ
VM ถูกบูทด้วย NIC สองตัว ดังนั้น
qemu-ระบบ-x86_64 \
-ไฟล์ไดรฟ์ = arch-disk.qcow2,if=none,id=nvm \
-device nvme,serial=deadbeef,drive=nvm \
-cdrom archlinux-2021.09.01-x86_64.iso \
-บูต d \
-device virtio-net-pci,romfile=,netdev=net0,mac="DE:AD:BE:EF:00:11" \
-device virtio-net-pci,romfile=,netdev=net1,mac="DE:AD:BE:EF:00:12" \
`# จำลองการเสียบสายเคเบิล "อัปสตรีม" ด้วยโหมดเครือข่ายผู้ใช้` \
-ผู้ใช้ netdev,id=net0,hostfwd=tcp::60022-:22,hostfwd=tcp::8080-:80,hostfwd=tcp::8081-:8000,hostfwd=tcp::2375-:2375 \
`# และตอนนี้ถอดปลั๊กด้วยเครือข่าย TAP` \
-netdev แตะ,id=net1,ifname=tap0,script=no,downscript=no \
-เน็ตบริดจ์ br=วิเวียนbr0 \
-m 4G \
-เปิดใช้งาน-kvm
เมื่อเครื่องนี้บูทแล้ว ฉันเห็นสิ่งต่อไปนี้ในการกำหนดค่าบริดจ์
brctl แสดง vivianbr0
ชื่อบริดจ์ รหัสบริดจ์ อินเทอร์เฟซที่เปิดใช้งาน STP
vivianbr0 8000.46954a1ad851 ไม่แตะ0
แตะ1
แตะ 2
ผมถือว่า แตะ 2
ถูกสร้างขึ้นโดย QEMU...
ภายใน VM นี้มีสอง ifaces ens4
กับแมค
DE:AD:BE:EF:00:11 และ ens5
กับ MAC DE:AD:BE:EF:00:12. ภายในนี้
VM ฉันเริ่ม dnsmasq
,
ip addr เพิ่ม 10.42.0.1/24 dev ens5
dnsmasq -d --dhcp-range=10.42.0.10,10.42.0.100 --dhcp-script=/bin/echo --enable-tftp=ens5 --interface=ens5
สิ่งนี้เริ่มต้นโดยไม่มีข้อผิดพลาด
ตอนนี้ฉันพยายาม netboot VM อื่น เริ่มต้นบนโฮสต์แบบนี้
qemu-ระบบ-x86_64 \
-เครื่อง pc-q35-6.0,accel=kvm \
-m 1024 -smp 2, ซ็อกเก็ต = 2, แกน = 1, เธรด = 1 \
-netdev แตะ,id=net0,ifname=tap1,script=no,downscript=no \
-อุปกรณ์ virtio-net-pci,netdev=net0,bootindex=1,mac=DE:โฆษณา:BE:EF:00:13 \
-เน็ตบริดจ์ br=วิเวียนbr0 \
- เปิดใช้งาน kvm \
-vga เวอร์ทีโอ
แต่มันไม่สามารถบูตได้ ฉันตรวจสอบ วิเวียนbr0
โดยใช้ tcpdump
และ
สามารถดูคำขอ DHCP แต่ไม่มีการตอบกลับ ไม่มีอะไรไปถึง dnsmasq ที่รันภายใน VM แรก
tcpdump -i vivianbr0 -nN
tcpdump: เอาต์พุต verbose ถูกระงับ ใช้ -v[v]... สำหรับการถอดรหัสโปรโตคอลแบบเต็ม
กำลังฟัง vivianbr0, ประเภทลิงก์ EN10MB (Ethernet), ความยาวสแน็ปช็อต 262144 ไบต์
12:21:39.585229 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, คำขอจาก de:ad:be:ef:00:13 ความยาว 397
12:21:40.587741 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, คำขอจาก de:ad:be:ef:00:13 ความยาว 397
12:21:40.700038 IP6 fe80::6ce2:2aff:fe94:ba48.5353 > ff02::fb.5353: 0 [7q] PTR (QM)? _nfs._tcp.local พีทีอาร์ (QM)? _ftp._tcp.local. พีทีอาร์ (QM)? _webdav._tcp.local. พีทีอาร์ (QM)? _webdavs._tcp.local. พีทีอาร์ (QM)? _sftp-ssh._tcp.local พีทีอาร์ (QM)? _smb._tcp.local. พีทีอาร์ (QM)? _afpovertcp._tcp.local. (118)
12:21:42.619968 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, คำขอจาก de:ad:be:ef:00:13 ความยาว 397
12:21:46.684448 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, คำขอจาก de:ad:be:ef:00:13 ความยาว 397
12:22:30.609555 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, คำขอจาก de:ad:be:ef:00:12, ความยาว 289
12:23:33.796148 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, คำขอจาก de:ad:be:ef:00:12, ความยาว 289
12:24:38.673364 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, คำขอจาก de:ad:be:ef:00:12 ความยาว 289
ฉันเห็นคำขอ BOOTP จาก de:ad:be:ef:00:13
(netbooting VMs MAC addr) และจาก de:ad:be:ef:00:12
(NIC ส่วนตัวของเกตเวย์ VM) ซึ่งระบุว่ามีการกำหนดค่าบางอย่างไม่ถูกต้อง
ฉันจะทำงานนี้ได้อย่างไร