เป็นที่ทราบกันดีว่าไฟร์วอลล์จะล้างกฎของ Libvirt เมื่อโหลดซ้ำ และทำให้การส่งต่อพอร์ตไปยัง VM เสียหายจนกว่าคุณจะรีสตาร์ท libvirtd นี่คือสิ่งที่ฉันทำ:
- สร้าง
/etc/systemd/system/firewalld-reload-hook.service
[หน่วย]
Description=firewalld reload hook - รันสคริปต์ hook บน firewalld reload
ต้องการ = dbus-broker.service
After=dbus-broker.service
[บริการ]
ประเภท = ง่าย
ExecStart=/bin/bash -c '/bin/busctl monitor --system --json=short --match "interface=org.fedoraproject.FirewallD1,member=Reloaded" | ขณะอ่าน -r บรรทัด ; ทำ [ -x /sbin/firewalld-reload-hook ] && /sbin/firewalld-reload-hook ; เสร็จแล้ว'
[ติดตั้ง]
WantedBy=multi-user.target
- สร้าง
/sbin/firewalld-reload-hook
#!/bin/bash
# เรียกใช้โดย /etc/systemd/system/firewalld-reload-hook.service
ตั้ง -e
คนตัดไม้ "$BASH_SOURCE: Firewalld reload hook ทริกเกอร์"
/usr/bin/systemctl รีสตาร์ท libvirtd
คนตัดไม้ "$BASH_SOURCE: Libvirt รีสตาร์ท"
ทางออก 0
และทำให้ปฏิบัติการได้ chmod +x /sbin/firewalld-reload-hook
- ติดตั้ง
libvirt-hook-qemu
คอมไพล์โคลน https://github.com/saschpe/libvirt-hook-qemu.git
ทำการติดตั้ง
- แก้ไข
/etc/libvirt/hooks/hooks.json
เพื่อให้ตรงกับความต้องการของคุณ นี่เป็นเพียงตัวอย่างเท่านั้น
{
"www": {
"private_ip": "192.168.122.100",
"port_map": {
"tcp": [80, 443]
}
},
"จดหมาย": {
"private_ip": "192.168.122.101",
"port_map": {
"tcp": [25, 465]
}
}
}
- เปิดใช้งานและเริ่มต้น
firewalld-reload-hook.service
systemctl เปิดใช้งาน firewalld-reload-hook.service
systemctl เริ่ม firewalld-reload-hook.service
ไฟร์วอลล์ cmd --reload
ณ จุดนี้ systemctl รีสตาร์ท libvirtd
และ ไฟร์วอลล์ cmd --reload
ให้ผลลัพธ์เดียวกันและรอดชีวิตจากการรีบูต (ทดสอบบน Debian bullseye ด้วย nftables และเครือข่าย libvirt 7.0/NAT)
นี่เป็นวิธีที่ดีที่สุดในการทำเช่นนี้หรือไม่?
อ้างอิง
libvirt-hook-qemu, firewalld-reload-hook.service, firewalld.dbus