ฉันได้กำหนดค่า linux VM โดยใช้ virsh/libvirt/kvm และมีปัญหากับเครือข่ายบริดจ์
เครือข่าย NAT เริ่มต้นจาก libvirt ทำงานได้ดี แต่ฉันต้องการบริดจ์ไปยังอินเทอร์เฟซสาธารณะ
ฉันได้ลบเครือข่ายเริ่มต้นโดยใช้ virsh และเปลี่ยนการตั้งค่าเครือข่าย VM ใน virsh เป็น:
<interface type='bridge'>
<mac address='02:00:00:c1:8f:95'/>
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</interface>
บนระบบโฮสต์ฉันได้กำหนดค่าบริดจ์แล้ว:
# brctl แสดง br0
ชื่อบริดจ์ รหัสบริดจ์ อินเทอร์เฟซที่เปิดใช้งาน STP
br0 8000.a0423f494574 ใช่ enp97s0f0
vnet0
# brctl showstp br0
br0
รหัสบริดจ์ 8000.a0423f494574
กำหนดรูท 8000.a0423f494574
รูทพอร์ต 0 เส้นทางต้นทุน 0
อายุสูงสุด 20.00 น. อายุสะพานสูงสุด 20.00 น
สวัสดีเวลา 2.00 สะพานสวัสดีเวลา 2.00 น
เดินหน้าล่าช้า 15.00 สะพาน เดินหน้าล่าช้า 15.00 น
อายุการใช้งาน 300.00
สวัสดี จับเวลา 0.86 tcn จับเวลา 0.00
ตัวจับเวลาการเปลี่ยนแปลงโทโพโลยี 0.00 gc ตัวจับเวลา 240.41
ธง
เอ็นพี97s0f0 (1)
พอร์ต id 8001 สถานะการส่งต่อ
เส้นทาง root 8000.a0423f494574 ที่กำหนดราคา 100
บริดจ์ที่กำหนด 8000.a0423f494574 ตัวจับเวลาอายุข้อความ 0.00
พอร์ตที่กำหนด 8001 ตัวตั้งเวลาหน่วงไปข้างหน้า 0.00
ค่าใช้จ่ายที่กำหนด 0 ตัวจับเวลา 0.00
ธง
วีเน็ต0 (2)
พอร์ต id 8002 สถานะการส่งต่อ
เส้นทาง root 8000.a0423f494574 ที่กำหนดราคา 100
บริดจ์ที่กำหนด 8000.a0423f494574 ตัวจับเวลาอายุข้อความ 0.00
พอร์ตที่กำหนด 8002 ตัวตั้งเวลาหน่วงไปข้างหน้า 0.00
ค่าใช้จ่ายที่กำหนด 0 ตัวจับเวลา 0.00
โดยที่ enp97s0f0 เป็น NIC สาธารณะ และ vnet0 เป็น virtual nic ที่ใช้โดย libvirt
ฉันได้กำหนดค่า IP และเกตเวย์บน VM แล้ว แต่ไม่มีการตอบกลับสำหรับการส่ง Ping
ฉันได้ทำ tcpdump บนเครื่องโฮสต์ระหว่างการส่ง Ping จาก VM ไปยัง 1.1.1.1 cloudflare dns ทั้งบน vnet0 และ br0 นี่คือผลลัพธ์:
# tcpdump -i vnet0 -n โฮสต์ VM.VM.VM.VM
ทิ้ง privs เป็น tcpdump
tcpdump: เอาต์พุต verbose ถูกระงับ ใช้ -v หรือ -vv สำหรับการถอดรหัสโปรโตคอลแบบเต็ม
กำลังฟังบน vnet0, ประเภทลิงก์ EN10MB (Ethernet), ขนาดการจับภาพ 262144 ไบต์
15:13:50.863273 IP VM.VM.VM.VM > 1.1.1.1: คำขอ echo ICMP, id 2016, seq 80, ความยาว 64
15:13:51.887267 IP VM.VM.VM.VM > 1.1.1.1: คำขอ echo ของ ICMP, id 2016, seq 81, ความยาว 64
15:13:52.911271 IP VM.VM.VM.VM > 1.1.1.1: คำขอ echo ของ ICMP, id 2016, seq 82, ความยาว 64
15:13:53.935270 IP VM.VM.VM.VM > 1.1.1.1: คำขอ echo ของ ICMP, id 2016, seq 83, ความยาว 64
# tcpdump -i br0 -n โฮสต์ VM.VM.VM.VM
ทิ้ง privs เป็น tcpdump
tcpdump: เอาต์พุต verbose ถูกระงับ ใช้ -v หรือ -vv สำหรับการถอดรหัสโปรโตคอลแบบเต็ม
กำลังฟัง br0, ประเภทลิงก์ EN10MB (Ethernet), ขนาดการจับภาพ 262144 ไบต์
15:12:33.039228 IP VM.VM.VM.VM > 1.1.1.1: คำขอ echo ของ ICMP, id 2016, seq 4, ความยาว 64
15:12:33.045522 IP 1.1.1.1 > VM.VM.VM.VM: ICMP echo reply, id 2016, seq 4, length 64
15:12:33.045532 IP 1.1.1.1 > VM.VM.VM.VM: ICMP echo reply, id 2016, seq 4, length 64
15:12:34.063111 IP VM.VM.VM.VM > 1.1.1.1: คำขอ echo ของ ICMP, id 2016, seq 5, ความยาว 64
15:12:34.069501 IP 1.1.1.1 > VM.VM.VM.VM: ICMP echo reply, id 2016, seq 5, length 64
15:12:34.069510 IP 1.1.1.1 > VM.VM.VM.VM: ICMP echo reply, id 2016, seq 5, length 64
15:12:35.087281 IP VM.VM.VM.VM > 1.1.1.1: คำขอ echo ของ ICMP, id 2016, seq 6, ความยาว 64
15:12:35.093640 IP 1.1.1.1 > VM.VM.VM.VM: ICMP echo reply, id 2016, seq 6, length 64
15:12:35.093649 IP 1.1.1.1 > VM.VM.VM.VM: ICMP echo reply, id 2016, seq 6, length 64
ดังนั้นฉันจึงเห็นได้ว่า VM กำลังส่งคำขอ ping ผ่าน vnet0 บริดจ์ br0 กำลังส่งต่อคำขอนี้ไปยัง 1.1.1.1 และ 1.1.1.1 กำลังส่งการตอบกลับกลับไปที่บริดจ์ จากนั้นแพ็คเก็ตจะหายไปและไม่เคยเข้าถึงอินเทอร์เฟซ VM
นั่นคือเหตุผลที่ฉันคิดว่าปัญหานั้นอาจเชื่อมต่อกับการกรองแพ็กเก็ตบางประเภทบนโฮสต์ แต่ฉันได้ตรวจสอบตัวแปรมากมายและทุกอย่างก็ดูโอเค:
/proc/sys/net/ipv4/ip_forward : 1
/proc/sys/net/ipv4/conf/br0/forwarding : 1
/proc/sys/net/ipv4/conf/vnet0/forwarding : 1
/proc/sys/net/ipv4/conf/enp97s0f0/ส่งต่อ : 1
/proc/sys/net/bridge/bridge-nf-call-iptables: ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว
# iptables -L
เชนอินพุท (ยอมรับนโยบาย)
เป้าหมาย prot เลือกปลายทางต้นทาง
ส่งต่อไปข้างหน้า (ยอมรับนโยบาย)
เป้าหมาย prot เลือกปลายทางต้นทาง
Chain OUTPUT (ยอมรับนโยบาย)
เป้าหมาย prot เลือกปลายทางต้นทาง
# ebtables -L
ตารางบริดจ์: ตัวกรอง
บริดจ์เชน: INPUT รายการ: 0 นโยบาย: ACCEPT
บริดจ์เชน: FORWARD รายการ: 0 นโยบาย: ACCEPT
บริดจ์เชน: OUTPUT รายการ: 0 นโยบาย: ACCEPT
# ชุดกฎรายการ nft
ตัวกรองสะพานตาราง {
ห่วงโซ่อินพุต {
ประเภท ตัวกรอง เบ็ด ตัวกรองลำดับความสำคัญอินพุต; นโยบายยอมรับ;
}
ห่วงโซ่ไปข้างหน้า {
ประเภทตัวกรอง hook ตัวกรองลำดับความสำคัญไปข้างหน้า; นโยบายยอมรับ;
}
เอาท์พุทลูกโซ่ {
ประเภทตัวกรองลำดับความสำคัญของเอาต์พุตของตะขอตัวกรอง; นโยบายยอมรับ;
}
}
ตัวกรอง ip ตาราง {
ห่วงโซ่อินพุต {
ประเภท ตัวกรอง เบ็ด ตัวกรองลำดับความสำคัญอินพุต; นโยบายยอมรับ;
}
ห่วงโซ่ไปข้างหน้า {
ประเภทตัวกรอง hook ตัวกรองลำดับความสำคัญไปข้างหน้า; นโยบายยอมรับ;
}
เอาท์พุทลูกโซ่ {
ประเภทตัวกรองลำดับความสำคัญของเอาต์พุตของตะขอตัวกรอง; นโยบายยอมรับ;
}
}
[root@HOST ~] # ไอพี
1: จริง: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN กลุ่มเริ่มต้น qlen 1,000
ลิงค์ / ย้อนกลับ 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 ขอบเขตโฮสต์เลย
valid_lft ตลอดไป reserved_lft ตลอดไป
inet6 ::1/128 ขอบเขตโฮสต์
valid_lft ตลอดไป reserved_lft ตลอดไป
2: enp97s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 สถานะกลุ่ม UP เริ่มต้น qlen 1000
ลิงค์/อีเธอร์ a0:42:3f:49:45:74 brd ff:ff:ff:ff:ff:ff
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP กลุ่มเริ่มต้น qlen 1000
ลิงค์/อีเธอร์ a0:42:3f:49:45:74 brd ff:ff:ff:ff:ff:ff
inet xxx.xxx.xxx.xxx/24 ขอบเขตโกลบอลไดนามิก noprefixroute br0
valid_lft 71705วินาทีที่ต้องการ_lft 71705วินาที
inet6 fe80::6559:22b2:dccd:3b24/64 ลิงค์ขอบเขต noprefixroute
valid_lft ตลอดไป reserved_lft ตลอดไป
4: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UNKNOWN กลุ่มเริ่มต้น qlen 1,000
ลิงค์/อีเธอร์ fe:00:00:c1:8f:95 brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc00:ff:fec1:8f95/64 ลิงค์ขอบเขต
valid_lft ตลอดไป reserved_lft ตลอดไป
[root@VM ~]# ip addr แสดง
1: lo: mtu 65536 qdisc noqueue state UNKNOWN กลุ่มเริ่มต้น qlen 1,000
ลิงค์ / ย้อนกลับ 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 ขอบเขตโฮสต์เลย
valid_lft ตลอดไป reserved_lft ตลอดไป
inet6 ::1/128 ขอบเขตโฮสต์
valid_lft ตลอดไป reserved_lft ตลอดไป
2: enp1s0: mtu 1500 qdisc fq_codel สถานะกลุ่ม UP เริ่มต้น qlen 1,000
ลิงค์/อีเธอร์ 02:00:00:c1:8f:95 brd ff:ff:ff:ff:ff:ff
inet VM.VM.VM.VM/24 ขอบเขตทั่วโลก enp1s0
valid_lft ตลอดไป reserved_lft ตลอดไป
[root@HOST ~]# บริดจ์ลิงก์
2: enp97s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 สถานะการส่งต่อลำดับความสำคัญ 32 ราคา 100
8: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 สถานะการส่งต่อลำดับความสำคัญ 32 ราคา 100
[root@HOST ~]# แสดงบริดจ์ fdb
fc:bd:67:ff:ec:6a ผู้พัฒนา enp97s0f0 มาสเตอร์ br0
fc:bd:67:ff:ec:31 ผู้พัฒนา enp97s0f0 มาสเตอร์ br0
2c:dd:e9:0d:9d:31 ผู้พัฒนา enp97s0f0 ต้นแบบ br0
fe:ed:de:ad:be:ef dev enp97s0f0 มาสเตอร์ br0
a0:42:3f:49:45:74 dev enp97s0f0 vlan 1 master br0 ถาวร
a0:42:3f:49:45:74 dev enp97s0f0 มาสเตอร์ br0 ถาวร
01:00:5e:00:00:01 dev enp97s0f0 เองถาวร
33:33:00:00:00:01 dev enp97s0f0 เองถาวร
01:00:5e:00:00:01 dev br0 ด้วยตนเองอย่างถาวร
33:33:00:00:00:01 พัฒนาตนเองถาวร
33:33:ff:cd:3b:24 dev br0 ด้วยตนเองอย่างถาวร
01:00:5e:00:00:6a dev br0 ด้วยตนเองอย่างถาวร
33:33:00:00:00:6a dev br0 ด้วยตนเองอย่างถาวร
02:00:00:c1:8f:95 dev vnet0 มาสเตอร์ br0
fe:00:00:c1:8f:95 dev vnet0 vlan 1 master br0 ถาวร
fe:00:00:c1:8f:95 dev vnet0 master br0 ถาวร
33:33:00:00:00:01 dev vnet0 เองถาวร
01:00:5e:00:00:01 dev vnet0 เองถาวร
33:33:ff:c1:8f:95 dev vnet0 เองถาวร
[root@HOST ~]# แสดงบริดจ์ vlan
พอร์ต vlan-id
enp97s0f0 1 PVID ขาออกที่ไม่ได้ติดแท็ก
vnet0 1 PVID ขาออกที่ไม่ได้ติดแท็ก
ระบบโฮสต์คือ Centos8 ที่มีเคอร์เนล 5.13.12-1.el8.elrepo.x86_64
ระบบ VM เป็นการติดตั้งเริ่มต้นของ Centos8
แก้ไข:
ถ้าฉันกำหนดค่า IP ของเครือข่ายส่วนตัวบนโฮสต์ br0 และบนอินเทอร์เฟซ VM enp1s0 VM จะสามารถ ping โฮสต์ได้ และโฮสต์สามารถ ping VM ได้ แต่ยังไม่สามารถ ping อะไรนอกเครือข่ายท้องถิ่นได้