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

Гостевая ОС qemu-kvm может получить доступ к хосту через мост, но не может получить доступ к другим устройствам в той же сети

Я хочу запустить гостевую систему qemu-kvm с Debian 9 в качестве ОС на хосте Debian 10. Хост подключен к локальной сети, и я хотел бы, чтобы гость был «видимым» для локальной сети, как если бы это было обычное устройство, подключенное напрямую к сети. Для этого я настроил мост под названием br0 на хосте путем редактирования /etc/network/interfaces следующим образом:

auto lo
iface lo inet loopback

allow-hotplug eth0
auto eth0
iface eth0 inet manual
    up ifconfig eth0 promisc up
    down ifconfig eth0 promisc down

auto br0
iface br0 inet static
    hwaddress ether 08:60:6e:69:4a:b5
    address 192.168.1.11
    netmask 255.255.255.0
    gateway 192.168.1.1

    bridge_ports eth0
    bridge_stp on
    bridge_fd 0

MAC-адрес, настроенный для моста, такой же, как и у моего eth0 интерфейс.

После этого изменения сеть моего хоста, похоже, работает нормально.

С помощью sudo virsh edit debian9 (где debian9 это имя гостя), я отредактировал сетевой интерфейс по умолчанию следующим образом:

    <interface type='bridge'>
      <mac address='52:54:00:bc:8c:97'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
    </interface>

Внутри гостя я назначил статический IP-адрес, отредактировав /etc/network/interfaces следующим образом, поскольку он не получил IP-адрес с использованием DHCP:

source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback

allow-hotplug enp1s0
auto enp1s0
iface enp1s0 inet static
    address 192.168.1.13
    netmask 255.255.255.0
    gateway 192.168.1.1

Кажется, что гость правильно отображается в br0 мост на хосте, когда я делаю sudo brctl show:

bridge name     bridge id               STP enabled     interfaces
br0             8000.08606e694ab5       yes             eth0
                                                        vnet0
docker0         8000.024202321e8f       no              veth7291e29
virbr0          8000.5254005aa541       yes             virbr0-nic

Теперь хост может правильно подключиться к гостю (например, с помощью ping или ssh), а гость может правильно подключиться к хосту, но другие устройства в той же локальной сети не могут получить доступ к гостю, или наоборот.

Я подозреваю, что это должно быть связано с какой-то проблемой брандмауэра / маршрутизации на хосте, но я не уверен, как это диагностировать дальше. Ниже приводится результат работы iptables -S на хосте. Я сам не настраивал какие-либо правила iptables: большинство из них связаны с сетью NAT libvirt по умолчанию или установкой докера на хосте:

-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT
-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A OUTPUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT
-A DOCKER -d 172.17.0.1/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8050 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN

Есть ли у кого-нибудь предложения, как я могу сделать гостя "видимым" в локальной сети?

Это происходит потому, что FORWARD политика сети DROP.

Вы могли бы использовать

iptables -I FORWARD -i br0 -j ACCEPT
iptables -I FORWARD -o br0 -j ACCEPT

принимать весь перенаправленный трафик из / в br0 интерфейс.

Это также причина, по которой клиент не получает адрес через DHCP. Пакеты DHCP от клиента отбрасываются FORWARD политика.