1 ปัญหา
เป้าหมายของฉันคือการรับส่งข้อมูล LAN ทั้งหมดถูกกำหนดเส้นทางผ่านเครื่องเสมือน (VM) ซึ่งทำหน้าที่เป็นเราเตอร์และไฟร์วอลล์ ควรกำหนดเส้นทาง VM อื่นๆ บนไฮเปอร์ไวเซอร์เดียวกันผ่านไฟร์วอลล์ VM ดูต่อไปนี้ ภาพร่างเครือข่าย. โฮสต์ทางกายภาพที่เชื่อมต่อกับสะพานหลักสามารถ ping ซึ่งกันและกันได้สำเร็จ แต่ VMs ยังไม่สามารถเข้าถึงได้
2 รายละเอียด
การกำหนดค่าเครือข่ายบนไฮเปอร์ไวเซอร์:
# =======
#สะพาน
# =======
# ---------------------
# สะพาน VLAN br-vlan-3
# ---------------------
ip link เพิ่มชื่อ br-vlan-3 ประเภทบริดจ์
ip addr เพิ่ม 10.66.3.11/24 dev br-vlan-3
ip link ตั้ง dev br-vlan-3 ขึ้นมา
# ---------------------
#สะพานท้ายเขื่อน
# ---------------------
ip link เพิ่มชื่อ br-trunk-up type bridge vlan_filtering 1 vlan_default_pvid 0
ip link ตั้งค่า br-trunk-up up
# ---------------
#สะพานลำ VM
# ---------------
ip link เพิ่มชื่อ br-trunk-vm ประเภทบริดจ์ vlan_filtering 1 vlan_default_pvid 0
ลิงค์ ip ตั้งค่า br-trunk-vm ขึ้น
# =====
#เจ้าภาพ
# =====
# ตั้งค่าอุปกรณ์ทางกายภาพขึ้น
ลิงค์ ip ตั้งค่า enp5s0 ขึ้น
ลิงค์ ip ตั้งค่า enp9s0f0 ขึ้น
ลิงค์ ip ตั้งค่า enp9s0f1 ขึ้น
ลิงค์ ip ตั้งค่า enp9s0f2 ขึ้น
ลิงค์ ip ตั้งค่า enp9s0f3 ขึ้น
# ----------------------
# desktop.3 br-vlan-3
# ----------------------
ip link เพิ่มลิงค์ enp9s0f1 ชื่อ enp9s0f1.3 พิมพ์ vlan id 3
ip ลิงค์ตั้งค่า dev enp9s0f1.3 ต้นแบบ br-vlan-3
ลิงค์ ip ตั้งค่า enp9s0f1.3 ขึ้น
# --------------------------
# desktop.100 br-trunk-vm
# --------------------------
ลิงค์ ip เพิ่มลิงค์ enp9s0f1 ชื่อ enp9s0f1.100 ประเภท vlan id 100
ชุดลิงค์ ip enp9s0f1.100 หลัก br-trunk-vm
ลิงค์ ip ตั้งค่า enp9s0f1.100 ขึ้น
บริดจ์ vlan เพิ่ม vid 100 dev enp9s0f1.100 master
บริดจ์ vlan เพิ่ม vid 100 dev br-trunk-vm ด้วยตนเอง
บริดจ์ vlan เพิ่ม vid 100 dev fw.100 pvid 100
แผนที่เครือข่าย
=======
เดสก์ทอป
=======
localhost:user ~ $ip ก
2: enp34s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP กลุ่มเริ่มต้น qlen 1000
ลิงค์/อีเธอร์ 00:d8:61:c4:b1:af brd ff:ff:ff:ff:ff:ff
4: br-vlan-100: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP กลุ่มเริ่มต้น qlen 1000
ลิงค์/อีเธอร์ 1a:b1:36:43:f0:e4 brd ff:ff:ff:ff:ff:ff
inet 10.66.100.44/24 ขอบเขต global br-vlan-100
valid_lft ตลอดไป reserved_lft ตลอดไป
7: enp.100@enp34s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-vlan-100 state UP กลุ่มเริ่มต้น qlen 1000
ลิงค์/อีเธอร์ 00:d8:61:c4:b1:af brd ff:ff:ff:ff:ff:ff
localhost:~ # cat /proc/net/vlan/enp.100
enp.100 VID: 100 REORDER_HDR: 1 dev->priv_flags: 1221
เฟรมทั้งหมดที่ได้รับ 0
ไบต์ทั้งหมดที่ได้รับ 0
ออกอากาศ/มัลติคาสต์ Rcvd 0
เฟรมทั้งหมดที่ส่ง 287
ไบต์ทั้งหมดที่ส่ง 53964
อุปกรณ์: enp34s0
การแมปลำดับความสำคัญของ INGRESS: 0:0 1:0 2:0 3:0 4:0 5:0 6:0 7:0
การแมปลำดับความสำคัญของ EGRESS:
==========
ไฮเปอร์ไวเซอร์
==========
ชื่อบริดจ์ รหัสบริดจ์ อินเทอร์เฟซที่เปิดใช้งาน STP
br-vlan-100 8000.1ab13643f0e4 ไม่มี enp.100
[ระบบ root@fedora]# ip
4: enp9s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP กลุ่มเริ่มต้น qlen 1000
ลิงค์/อีเธอร์ a0:36:9f:5d:09:19 brd ff:ff:ff:ff:ff:ff
13: br-trunk-vm: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP กลุ่มเริ่มต้น qlen 1000
ลิงค์/อีเธอร์ 56:7e:22:6a:23:2d brd ff:ff:ff:ff:ff:ff
16: enp9s0f1.100@enp9s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-trunk-vm สถานะกลุ่ม UP เริ่มต้น qlen 1000
ลิงค์/อีเธอร์ a0:36:9f:5d:09:19 brd ff:ff:ff:ff:ff:ff
21: fw.100: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-trunk-vm state UNKNOWN กลุ่มเริ่มต้น qlen 1000
ลิงค์/อีเธอร์ fe:54:00:3e:97:72 brd ff:ff:ff:ff:ff:ff
[ระบบ root@fedora]# brctl แสดง dev br-trunk-vm
ชื่อบริดจ์ รหัสบริดจ์ อินเทอร์เฟซที่เปิดใช้งาน STP
br-trunk-vm 8000.567e226a232d ไม่มี enp9s0f1.100
fw.100
fw.103
fw.3
===============
เครื่องจักรเสมือนจริง
===============
[root@fedora system] # แสดงบริดจ์ vlan
พอร์ต vlan-id
br-ลำ-vm 100
เอ็นพี9s0f1.100 100
virbr0 1 PVID ขาออกไม่ได้ติดแท็ก
fw.100 100 PVID ขาออกที่ไม่ได้ติดแท็ก
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP กลุ่มเริ่มต้น qlen 1000
ลิงค์/อีเธอร์ 52:54:00:3e:97:72 brd ff:ff:ff:ff:ff:ff
inet 10.66.100.10/24 ขอบเขตทั่วโลก enp1s0
valid_lft ตลอดไป reserved_lft ตลอดไป
การกำหนดค่าเครือข่าย Libvirt XML ของไฟร์วอลล์ VM:
<interface type='bridge'>
<mac address='52:54:00:3e:97:72'/>
<source bridge='br-trunk-vm'/>
<target dev='fw.100'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</interface>
3 ความพยายาม
ฉันลองกำหนดค่าทั้ง NIC ที่ติดแท็กและไม่ติดแท็กบนไฟร์วอลล์ VM สำหรับ NIC ที่ติดแท็ก ฉันได้สร้างสะพาน VLAN บนไฟร์วอลล์ VM และสร้างอุปกรณ์แตะเสมือนจากการแตะเสมือน fw.100 ด้วย VLAN 100: vlan100@fw.100. จากนั้นฉันตั้งค่าพอร์ตลำตัวของ vlan100@fw.100 ที่จะเชี่ยวชาญ: บริดจ์ vlan เพิ่ม vid 100 dev vlan100@fw.100 master. สำหรับแนวทาง NIC ที่ไม่ติดแท็ก ฉันได้กำหนดค่าไม่มี VLAN บนไฟร์วอลล์ VM และตั้งค่าพอร์ตหลักเป็น PVID 100 ที่ไม่ติดแท็ก บริดจ์ vlan เพิ่ม vid 100 dev fw.100 pvid 100 ไม่ติดแท็ก. ในทั้งสองกรณี ฉันไม่สามารถ ping ระหว่างโฮสต์เดสก์ท็อปและ VM ไฟร์วอลล์ได้
ปัญหานี้เกิดขึ้นกับเครื่องเสมือน libvirt KVM/QEMU เท่านั้น โฮสต์ที่ติดแท็ก VLAN ทางกายภาพสองรายการเชื่อมต่อกับบริดจ์ลำตัวของไฮเปอร์ไวเซอร์เนื่องจากมาสเตอร์สามารถ ping ซึ่งกันและกันได้
4 อัปเดต
ดูเหมือนว่า libvirt จะไม่รองรับบริดจ์ของ Linux กับ VLAN ตามบทความต่อไปนี้ VMs VLAN หยุดทำงานหากมีอุปกรณ์เสมือนตัวที่สองบนไฮเปอร์ไวเซอร์ที่มี VLAN เดียวกัน: https://alesnosek.com/blog/2015/09/07/bridging-vlan-trunk-to-the-guest/
สามารถใช้ openvswitch อีกทางหนึ่งได้ แต่การใช้บริดจ์สำหรับแต่ละ VM และโฮสต์จริงเป็นวิธีที่ดีกว่า จากนั้นไฮเปอร์ไวเซอร์อนุญาตให้ส่งต่อบริดจ์ของ VM และโฮสต์ไปยังบริดจ์ของไฟร์วอลล์ VM และการกำหนดเส้นทางที่เหลือจะทำภายใน VM ของไฟร์วอลล์