У меня следующая установка:
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):
Затем вам нужно открыть порты на вашем хосте: 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):
Ты можешь использовать 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"}"