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

Вопрос или проблема

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

Ноутбук (IP: 192.168.1.100)
Хост: (IP:192.168.1.129)

Оба устройства, Ноутбук и Хост, подключены к роутеру (Интернет IP:192.168.1.1)¨

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

Разработка: 192.168.122.45
Офис: 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-Разработка

и настроил следующим образом:

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

После того как я внес изменения в правила iptables, в конфигурационных файлах 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.

Вы можете использовать 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 к HOST:PORT с HOST, измененным командой sed SEDEXP

ИСПОЛЬЗОВАНИЕ: sednc SEDEXP HOST [PORT]

Пример:

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

Это должно использоваться с ssh для подключения к виртуальным машинам внутри хоста. Добавьте строку вроде этой в ваш .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"}"

Обновление:

 Установка клиента Spice требует следующее (Linux, Kubuntu)
 - spice-client
 - spice-vdagent
 - (опционально) spice-vdagent

 (Windows - Хорошо работает с 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) не может загрузиться без подключенного монитора.

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

 -- Установил драйвер xorg dummy
       -- Не помогло, иногда я не мог даже запустить shell, я внес изменения в конфигурацию GRUB, чтобы всегда показывать меню
          для загрузки в режиме восстановления, чтобы я мог удалить 
          xorg.conf из /etc/X11, безопасно из shell. 
 -- Я использовал несколько vnc viewer/server'ов для доступа к моему 
    KDE диспетчеру окон
        -- x11vnc, tigervnc, tightvnc
    Нет успеха:
 -- Установил dummy driver для Xorg (ниже некоторые ссылки):

Headless X11, L’Xtreme..

Ответ или решение

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

Ваша задача включает доступ к виртуальной машине (VM), работающей на хосте с KVM, из внешней сети, в данном случае с ноутбука. Давайте рассмотрим необходимые шаги и возможные проблемы, связанные с вашим текущим сетевым настроением.

1. Сетевое окружение

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

  • Ноутбук (IP: 192.168.1.100)
  • Хост (IP: 192.168.1.129) с двумя виртуальными машинами:
    • Разработка (IP: 192.168.122.45)
    • Офис (IP: 192.168.122.46)
DHCP сервер

Ваш хост использует DHCP сервер с IP-адресом 192.168.122.1. Виртуальные машины получают IP-адреса из диапазона 192.168.122.2 – 192.168.122.254.

2. Настройка SPICE для доступа к VM

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

Конфигурация SPICE

Ваша конфигурация VM на данный момент выглядит так:

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

Это означает, что SPICE слушает только на локальном интерфейсе (127.0.0.1). Чтобы обеспечить доступ с ноутбука, вам нужно изменить параметр address на 0.0.0.0 или удалить данный элемент (если поддерживается), чтобы отключить ограничение на локальный адрес.

<graphics type="spice" port="5900" autoport="no" keymap='de-ch'>
</graphics>
Правила iptables

Ваши правила 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 --state NEW,RELATED,ESTABLISHED -d 192.168.122.0/24 -j ACCEPT

Эти правила перенаправляют трафик на порт 5900 хоста к виртуальной машине, однако, требуется убедиться в их корректности. Возможно, вам потребуется добавить правило для разрешения исходящего трафика от виртуальной машины в интернет, как вы уже упомянули:

iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -j SNAT --to-source 192.168.1.129

3. Дополнительные шаги

Установка SPICE клиента

Для доступа к вашей виртуальной машине необходимо установить SPICE-клиент:

4. Проверка подключения

После внесения всех изменений попробуйте подключиться к SPICE-клиенту с ноутбука по следующему адресу:

spice://192.168.1.129:5900

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

5. Устранение проблем с доступом

Если доступ по-прежнему не работает:

  • Проверьте логи вашего хоста и виртуальной машины на наличие ошибок.
  • Используйте tcpdump или netstat для диагностики сетевых соединений.
  • Убедитесь, что у вас нет конфликта IP-адресов в вашей сети, так как DHCP может назначить повторяющиеся IP.

Заключение

Настройка доступа к виртуальной машине через KVM с использованием SPICE может быть сложной задачей, но при наличии правильных конфигураций и правил iptables, это вполне выполнимая задача. Следуйте симметричному подходу, включая изменения в конфигурации SPICE, правление iptables и проверку сетевых подключений. Таким образом, вы сможете успешно обеспечить доступ с вашего ноутбука к виртуальной машине на хосте.

Оцените материал
Добавить комментарий

Капча загружается...