На моем хосте виртуальной машины у меня есть две виртуальные сети 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».
Такая сеть настроена так, что она может получить доступ только к:
В частности, как вы обнаружили, доступ к любым другим виртуальным сетям на хосте заблокирован.
Для решения этой проблемы требуется два шага:
Перенастройте каждую виртуальную сеть как «маршрутизируемую» без NAT. В этом случае libvirtd не будет пытаться изолировать виртуальные сети друг от друга, но также не будет выполнять NAT.
Вам нужно будет сделать это, отредактировав XML (с virsh net-edit networkname; графический интерфейс virt-manager не может внести это изменение):
<forward mode='nat'/>
следует изменить на:
<forward mode='route'/>
Это изменение вступает в силу, когда вы выключаете все виртуальные машины, использующие сеть, останавливаете сеть (virsh net-stop networkname), перезапустите сеть (virsh net-start networkname) и перезапустите все виртуальные машины, использующие сеть.
Затем вам также нужно будет ввести свои собственные правила маскировки, если вы хотите, чтобы виртуальные машины имели доступ в Интернет.
Например, в раздел нат таблицы из /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
В качестве альтернативы вы можете забыть обо всем этом и создать новую виртуальную сеть, которая изолированныеи дайте каждой виртуальной машине второй виртуальный сетевой адаптер, подключенный к изолированной сети. После этого виртуальные машины могут обмениваться данными через эту сеть.