Вопрос или проблема
У меня следующая настройка:
Ноутбук (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):
Затем необходимо открыть порты на вашем хосте: 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 (ниже некоторые ссылки):
Ответ или решение
Доступ к виртуальной машине 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-клиент:
- Для Linux:
spice-client
,spice-vdagent
. - Для Windows: Скачайте бинарные файлы SPICE.
4. Проверка подключения
После внесения всех изменений попробуйте подключиться к SPICE-клиенту с ноутбука по следующему адресу:
spice://192.168.1.129:5900
Убедитесь, что ваше сетевое окружение настроено правильно, маршрутизатор не блокирует порты, и вы можете успешно обращаться к хосту из ноутбука.
5. Устранение проблем с доступом
Если доступ по-прежнему не работает:
- Проверьте логи вашего хоста и виртуальной машины на наличие ошибок.
- Используйте
tcpdump
илиnetstat
для диагностики сетевых соединений. - Убедитесь, что у вас нет конфликта IP-адресов в вашей сети, так как DHCP может назначить повторяющиеся IP.
Заключение
Настройка доступа к виртуальной машине через KVM с использованием SPICE может быть сложной задачей, но при наличии правильных конфигураций и правил iptables, это вполне выполнимая задача. Следуйте симметричному подходу, включая изменения в конфигурации SPICE, правление iptables и проверку сетевых подключений. Таким образом, вы сможете успешно обеспечить доступ с вашего ноутбука к виртуальной машине на хосте.