Назад | Перейти на главную страницу

Изменение правил брандмауэра libvirt между виртуальными сетями

На моем хосте виртуальной машины у меня есть две виртуальные сети libvirt:

У меня есть виртуальная машина за каждой из этих виртуальных сетей. Машины могут видеть хост и видеть Интернет. Однако, когда я пытаюсь подключиться из одной сети к другой, я получаю сообщение «В соединении отказано», даже если я подключаюсь к порту, который, как мне известно, открыт.

Я отключил UFW (хост - Ubuntu) и все еще не работает. Ничего не регистрируется, поэтому я не уверен, какое правило это блокирует. Мой блок FORWARD (я полагаю, созданный virtlib):

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             192.168.122.0/24     ctstate RELATED,ESTABLISHED
ACCEPT     all  --  192.168.122.0/24     anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             192.168.130.0/24     ctstate RELATED,ESTABLISHED
ACCEPT     all  --  192.168.130.0/24     anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Если я очищу все правила брандмауэра, то виртуальные машины в разных виртуальных сетях могут общаться друг с другом, но, конечно, они не могут разговаривать с хостами виртуальных машин.

Я обнаружил, избавился ли я от этих правил:

-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -o virbr1 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr1 -j REJECT --reject-with icmp-port-unreachable

После этого виртуальные машины могли разговаривать друг с другом. Это здорово, но как мне указать libvirt изменить способ создания правил пересылки, чтобы не запрещать трафик между виртуальными сетями?

Спасибо за любые советы, указатели или URL-адреса!

Это происходит потому, что вы настроили свои виртуальные сети как сети «nat».

Такая сеть настроена так, что она может получить доступ только к:

  • Другие виртуальные машины в той же виртуальной сети
  • Гостья
  • Внешняя сеть (обычно Интернет)

В частности, как вы обнаружили, доступ к любым другим виртуальным сетям на хосте заблокирован.


Для решения этой проблемы требуется два шага:

  1. Перенастройте каждую виртуальную сеть как «маршрутизируемую» без NAT. В этом случае libvirtd не будет пытаться изолировать виртуальные сети друг от друга, но также не будет выполнять NAT.

    Вам нужно будет сделать это, отредактировав XML (с virsh net-edit networkname; графический интерфейс virt-manager не может внести это изменение):

      <forward mode='nat'/>
    

    следует изменить на:

      <forward mode='route'/>
    

    Это изменение вступает в силу, когда вы выключаете все виртуальные машины, использующие сеть, останавливаете сеть (virsh net-stop networkname), перезапустите сеть (virsh net-start networkname) и перезапустите все виртуальные машины, использующие сеть.

  2. Затем вам также нужно будет ввести свои собственные правила маскировки, если вы хотите, чтобы виртуальные машины имели доступ в Интернет.

    Например, в раздел нат таблицы из /etc/ufw/before.rules:

    -A POSTROUTING -s 192.168.122.0/24 -o eth0 -j MASQUERADE
    -A POSTROUTING -s 192.168.130.0/24 -o eth0 -j MASQUERADE
    

В качестве альтернативы вы можете забыть обо всем этом и создать новую виртуальную сеть, которая изолированныеи дайте каждой виртуальной машине второй виртуальный сетевой адаптер, подключенный к изолированной сети. После этого виртуальные машины могут обмениваться данными через эту сеть.