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: [email protected]
. จากนั้นฉันตั้งค่าพอร์ตลำตัวของ [email protected]
ที่จะเชี่ยวชาญ: บริดจ์ vlan เพิ่ม vid 100 dev [email protected] 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 ของไฟร์วอลล์