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

KVM - доступ с внешнего компьютера к виртуальной машине

У меня следующая установка:

Notebook (IP: 192.168.1.100)
Host: (IP:192.168.1.129)

И ноутбук, и хост подключены к маршрутизатору (IP-адрес в Интернете: 192.168.1.1) ¨

На хосте (Host) есть две виртуальные машины (Development, Office). Хост, поскольку он использует DHCP-сервер (KVM), назначает следующие IP-адреса виртуальным машинам:

Development: 192.168.122.45
Office: 192.168.122.46

DHCP-сервер для хоста имеет IP-адрес 192.168.122.1.

Теперь мне нравится получать доступ к виртуальной машине разработки из моего ноутбука (192.168.1.100) через порт 5900 для удаленной работы с этой виртуальной машиной.

Я использовал несколько маршрутов iptables, чтобы добиться этого на хосте, где расположены виртуальные машины:

iptables -t nat -I PREROUTING -p tcp -d 192.168.1.129 --dport 5900 -j DNAT --to-destination 192.168.122.45
iptables -I FORWARD -m state -d 192.168.122.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT

К сожалению, у меня не получилось связать Spice с виртуальной машиной разработки.

 spice://192.168.1.129:5900

Я редактировал свою виртуальную машину с помощью

virsh edit VM-Development

и настроен так:

<graphics type='spice' port='5900' autoport='no' listen='127.0.0.1' keymap='de-ch'>
   <listen type='address' address='127.0.0.1'/>

После того, как я сделал iptables roules, файлы конфигурации XML содержат новую запись:

<video>
    <model type='qxiptables -t nat -I PREROUTING -p tcp -d 192.168.1.129 --dport 5900 -j DNAT --to-destination 192.168.122.45 iptables -I FORWARD -m state -d 192.168.122.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT l' ram='65536' vram='65536' vgamem='16384' heads='1'/>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>

В чем дело? Я использовал несколько подсказок, но не могу заставить их работать. Еще посмотрел, что у роутера порт 5900 открыт.

Обновить:

 Installation of Spice client needs the following (Linux, Kubuntu)
 - spice-client
 - spice-vdagent
 - (optional) spice-vdagent

 (Windows - Works well with Windows10):

Двоичные файлы Windows

Затем вам нужно открыть порты на вашем хосте: 5900 (незащищенный), 5901 (безопасный - требуется дополнительная настройка). Я сделал это с помощью gufw, очень простого инструмента для создания межсетевого экрана. Этот инструмент создает записи для iptables. Далее я сделал маршрутизируемую сеть. Для большего удобства я экспортировал перед переменной окружения $ EDITOR:

export EDITOR=nano

Теперь вам нужно указать имя вашей сети: Имя вашей сети, которое вы получаете из Диспетчера виртуальных машин:

virt-viewer  (sudo apt-get install virt-viewer)

Там под разделом NIC помещается имя вашей сети: в моем случае это "default". Отредактируйте сейчас настройки сети:

virsh net-edit default

изменить настройки сети сделать:

<network>
   <name>default</name>
   <uuid>cc45a671-e8d8-4149-a6a5-xxxxxxxxxx</uuid>
   <forward mode='route'/>
   <bridge name='virbr0' stp='on' delay='0'/>
   <mac address='AA:FF:DD:EE:55:77'/>
   <ip address='192.168.122.1' netmask='255.255.255.0'>
     <dhcp>
         <range start='192.168.122.2' end='192.168.122.254'/>
     </dhcp>
   </ip>
</network>

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

С этими настройками я мог подключиться к моей виртуальной машине!

Единственная проблема, которая не была решена, заключается в том, что виртуальные машины недоступны для использования в Интернете или, в моем случае, какое-либо соединение с внешним миром (только открытые порты).

Для этого я использовал правило брандмауэра:

sudo iptables -t nat -A POSTROUTING -s 192.168.122.45 -j SNAT --to-source 192.168.1.129

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

Теперь я был почти счастлив :-), но на самом деле моя работа еще не была закончена. Моя система состояла из хоста с 4 виртуальными машинами на нем: я мог подключать их со своего ноутбука через разные настройки порта (5900, 5902, 5904, 5906). Проблема была в мониторе. Я не хочу, чтобы на моем хосте был монитор. Поэтому я удалил кабель HDMI и ... больше не смог подключиться, потому что графический оконный менеджер sddm (KDE 5) не может загружаться без подключенного монитора.

Дальнейшие шаги в процессе:

 -- Installed a xorg dummy driver
       -- Didn't help, sometimes I wasn't able to start even a shell, I             made configuration changes to GRUB, to show me always a menu
          to start in recovery mode, so I could delete 
          xorg.conf int /etc/X11 securely from a shell. 
 -- I used several vnc viewers/servers to get access to my 
    KDE windows manager
        -- x11vnc, tigervnc, tightvnc
    No success:
 -- Installed a dummy driver for Xorg (below some links):

Безголовый X11, L'Xtreme ..

Ты можешь использовать ssh HOST nc в качестве прокси:

Host *.saturnin.* *.saturnin bb-*
   ProxyCommand ssh -q -A saturnin.lab.eng.brq.redhat.com nc %h %p
   IdentityFile ~/.ssh/bot_rsa
   User root

Недостаток: это требует наличия записей в /etc/hosts на хосте.

В качестве альтернативы я использую nc с sed, чтобы получить локальное имя / IP:

Host tbb-*
   ProxyCommand ssh -q -A saturnin.lab.eng.brq.redhat.com sednc 's/^tbb-//' %h %p
   IdentityFile ~/.ssh/bot_rsa
   User root

Host 192.168.*.cimrman.* 192.168.*.cimrman
   ProxyCommand ssh -q -A cimrman.lab.eng.brq.redhat.com sednc 's/\.cimrman.*//' %h %p
   IdentityFile ~/.ssh/bot_rsa
   User root

sednc выглядит так:

#!/bin/bash

if [[ $1 == -h || $1 == --help ]]; then
  cat <<END
sednc - nc to a HOST:PORT with HOST modified by an sed command SEDEXP

USAGE: sednc SEDEXP HOST [PORT]

Example:

    sednc 's/^bb-//' bb-rawhide

This is to be used with ssh to connect to a VMs inside a host. Add line like this to your .ssh/config:

    Host bb-*
        ProxyCommand ssh -q -A HOST sednc 's/^bb-//' %h %p

END
  exit 0
fi

HOST="$2"
TRANSLATED="$(sed -e "$1" <<<"$2")"

#echo "$TRANSLATED">&2
nc "$TRANSLATED" "${3:-"22"}"