libvirt nwfilter нарушает сетевое взаимодействие других виртуальных машин

libvirt nwfilter нарушает сетевое взаимодействие других виртуальных машин

Я только что перешел с 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 должна оставаться «принять» (а не «отклонить» или «сбросить»): несколько нелогично, но пакеты, не охваченные службами/портами, не принимаются хостом, но «принять» необходимо для трафика виртуальной машины.

Связанный контент