Хорошо известно, что firewalld сбрасывает правила Libvirt при перезагрузке и, таким образом, прерывает переадресацию портов на виртуальные машины, пока вы не перезапустите libvirtd. Вот что я сделал:
- Создавать
/etc/systemd/system/firewalld-reload-hook.service
[Ед. изм]
Description=firewalld reload hook — запустить скрипт ловушки при перезагрузке firewalld
Хочет = dbus-broker.service
После = dbus-broker.service
[Оказание услуг]
Тип=простой
ExecStart=/bin/bash -c '/bin/busctl monitor --system --json=short --match "interface=org.fedoraproject.FirewallD1,member=Reloaded" | при чтении строки -r; do [ -x /sbin/firewalld-reload-hook ] && /sbin/firewalld-reload-hook ; сделано'
[Установить]
WantedBy=многопользовательская.цель
- Создавать
/sbin/firewalld-reload-hook
#!/бин/баш
# Вызывается /etc/systemd/system/firewalld-reload-hook.service
установить -е
logger "$BASH_SOURCE: сработал хук перезагрузки брандмауэра."
/usr/bin/systemctl перезапустить libvirtd
logger "$BASH_SOURCE: Libvirt перезапущен."
выход 0
и сделать его исполняемым chmod +x /sbin/firewalld-reload-hook
- Установить
libvirt-hook-qemu
клон git https://github.com/saschpe/libvirt-hook-qemu.git
сделать установку
- Редактировать
/etc/libvirt/хуки/хуки.json
чтобы соответствовать вашим потребностям. Это просто пример
{
"www": {
"частный_ip": "192.168.122.100",
"port_map": {
"TCP": [80, 443]
}
},
"почта": {
"частный_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 --перезагрузить
На данном этапе systemctl перезапустить libvirtd
и брандмауэр-cmd --перезагрузить
дают те же результаты и выдерживают перезагрузки (проверено на Debian Bullseye с nftables и libvirt 7.0/NAT network)
Итак, это лучший способ сделать это?
Ссылаться
libvirt-hook-qemu, firewalld-reload-hook.service, firewalld.dbus