
Я только что перешел с VirtualBox на Virt Manager с KVM и очень доволен этим переходом (моей изначальной мотивацией было использовать одну и ту же виртуализацию для виртуальных машин рабочего стола и виртуальных машин сервера, отказавшись от Virtualbox и vanilla Proxmox в пользу libvirt). Тем не менее, я на самом деле не знаю, что делаю, поэтому мне может понадобиться помощь.
Я запускаю Debian VMs на Debian host. Я определил простой мост на хосте (в /etc/network/interfaces) и поместил все свои VM на него. Хост запускает конфигурацию UFW по умолчанию. Все хорошо и хорошо, пока я не пытаюсь использовать nwfilters.
Я определил фильтр (virsh nwfilter-define) и добавил его к виртуальной машине «my-vm1» (она же reffilter filter='my-vm1-filter' в сетевом устройстве my-vm1).Трафик «my-vm1» фильтруется, как и ожидалось, НО другие виртуальные машины раздражающе теряют связь:
- перезагрузка этих других виртуальных машин не помогает: похоже, они не могут использовать DHCP
- остановка my-vm1 не помогает
- Для восстановления сети на других виртуальных машинах необходимо перезагрузить хост и не запускать my-vm1.
- Я пытался понять смысл изменения в iptables -L после запуска my-vm1, и это сбивает с толку. Но я вообще ничего не знаю об iptables.
Первый вопрос: есть ли какая-то известная проблема, шаг или ограничение при использовании nwfilters, которые я, к сожалению, пропустил?
А если нет, то какие предложения по поводу того, что попробовать дальше? Рад узнать что-то новое, имеющее отношение к моей проблеме.
решение1
Если кто-то сюда заглянет, вот некоторый прогресс:
- Я понял, что nft даст мне лучшую картину, чем iptables, на который ссылаются старые посты. Насколько я понял, libvirt сейчас использует nftables
- Оказывается, UFW плохо работает с Libvirt: если я его отключаю, то проблема исчезает, и другие виртуальные машины без nwfilter работают нормально.
- Где-то читал, что firewalld может лучше работать с libvirt, но не пробовал.
EDIT: Для новичков вроде меня firewalld действительно работает намного лучше, по крайней мере, для моего простого варианта использования:
- поместить хост-мост в зону «libvirt»
- службы, порты и т. д. этой зоны применяются только к входящему трафику хоста (а не к виртуальным машинам, которые затем могут полагаться на свой собственный nwfilter)
- Цель зоны libvirt должна оставаться «принять» (а не «отклонить» или «сбросить»): несколько нелогично, но пакеты, не охваченные службами/портами, не принимаются хостом, но «принять» необходимо для трафика виртуальной машины.