Ai cũng biết rằng tường lửa sẽ xóa các quy tắc Libvirt khi tải lại và do đó làm cho quá trình chuyển tiếp cổng tới máy ảo bị hỏng cho đến khi bạn khởi động lại libvirtd. Đây là những gì tôi đã làm:
- Tạo ra
/etc/systemd/system/firewalld-reload-hook.service
[Đơn vị]
Mô tả=móc tải lại tường lửa - chạy tập lệnh hook khi tải lại tường lửa
Muốn=dbus-broker.service
Sau=dbus-broker.service
[Dịch vụ]
Loại = đơn giản
ExecStart=/bin/bash -c '/bin/busctl monitor --system --json=short --match "interface=org.fedoraproject.FirewallD1,member=Reloaded" | trong khi đọc -r dòng; làm [ -x /sbin/firewalld-reload-hook ] && /sbin/firewalld-reload-hook ; xong'
[Cài đặt]
WantedBy=multi-user.target
- Tạo ra
/sbin/firewalld-reload-hook
#!/bin/bash
# Được gọi bởi /etc/systemd/system/firewalld-reload-hook.service
đặt -e
logger "$BASH_SOURCE: Đã kích hoạt hook tải lại tường lửa."
/usr/bin/systemctl khởi động lại libvirtd
logger "$BASH_SOURCE: Đã khởi động lại Libvirt."
thoát 0
và làm cho nó có thể thực thi được chmod +x /sbin/firewalld-reload-hook
- Cài đặt
libvirt-hook-qemu
bản sao git https://github.com/saschpe/libvirt-hook-qemu.git
thực hiện cài đặt
- Chỉnh sửa
/etc/libvirt/hooks/hooks.json
để phù hợp với nhu cầu của bạn. Đây chỉ là một ví dụ
{
"www": {
"private_ip": "192.168.122.100",
"port_map": {
"tcp": [80, 443]
}
},
"email": {
"private_ip": "192.168.122.101",
"port_map": {
"tcp": [25, 465]
}
}
}
- Kích hoạt và bắt đầu
tường lửa-reload-hook.service
systemctl kích hoạt tường lửad-reload-hook.service
systemctl bắt đầu tường lửad-reload-hook.service
tường lửa-cmd --reload
Tại thời điểm này systemctl khởi động lại libvirtd
và tường lửa-cmd --reload
tạo ra kết quả tương tự và tồn tại khi khởi động lại (đã thử nghiệm trên Debian bullseye với mạng nftables và libvirt 7.0/NAT)
Vì vậy, đây có phải là cách tốt nhất để làm điều đó?
Tham khảo
libvirt-hook-qemu, tường lửa-reload-hook.service, tường lửa.dbus