Вопрос или проблема
При вызове virt-install с параметром --network user
результатом является виртуальная машина (или домен в терминологии libvirt), которая создается в стандартном гипервизоре, т.е. в qemu:///session
с настроенной сетью SLIRP.
Но как мне на самом деле подключиться к sshd, работающему внутри этого нового гостя?
В мануале virt-install указано:
user [:] Подключиться к LAN через SLIRP. Используйте это только при запуске QEMU-гостя от неподсвеченного пользователя. Это предоставляет очень ограниченную форму NAT.
И похоже, что какая-то сеть на стороне гостя была создана:
$ virsh domifaddr myvm --source agent
Name MAC address Protocol Address
-------------------------------------------------------------------------------
lo 00:00:00:00:00:00 ipv4 127.0.0.1/8
- - ipv6 ::1/128
enp1s0 52:54:00:e4:08:1b ipv4 10.0.2.15/24
[..]
Но как мне фактически подключиться по ssh с хоста Fedora к гостю?
Нужно ли мне настроить дополнительное перенаправление портов с помощью virsh?
На всякий случай, на этом компьютере пользовательская модель непривилегированной сети с обычным qemu работает, однако, я ожидаю, что libvirt предоставит какие-то разумные настройки по умолчанию и полную конфигурацию при использовании --network user
. Например, выбирая свободный порт из диапазона за меня и предлагая какую-то интуицию, чтобы узнать, какой порт хоста перенаправляется.
Кроме того, при вызове virt-install к системному virtd, т.е. с параметром --connect qemu://system --network default ...
, команда domifaddr
virsh работает из коробки, и я могу подключиться по ssh к указанному IP-адресу без дальнейших сложностей.
Ответ или решение
Чтобы подключиться к SSH-серверу (sshd) внутри виртуальной машины (VM), созданной с использованием libvirt и сети SLIRP, необходимо понимать некоторые аспекты настройки сети и доступа. В этом ответе я опишу шаги, которые позволят вам осуществить такое подключение.
1. Базовая информация о SLIRP
SLIRP — это механизм для создания ограниченных сетевых подключений, который предоставляет возможность NAT (Network Address Translation) для студентов или пользователей без прав суперпользователя. Когда вы создаете виртуальную машину с параметрами --network user
, libvirt автоматически настраивает SLIRP. В этом случае виртуальная машина получает IP-адрес из изолированной подсети, что препятствует её прямому доступу из хостовой ОС.
2. Получение IP-адреса виртуальной машины
Для начала необходимо получить IP-адрес вашей виртуальной машины. Используйте следующую команду:
virsh domifaddr myvm --source agent
Вы уже привели пример, из которого видно, что адрес вашей виртуальной машины — 10.0.2.15
. Это внутренний адрес, доступный только изнутри сети SLIRP.
3. Настройка SSH на виртуальной машине
Перед тем как подключаться по SSH, убедитесь, что SSH-сервер установлен и запущен на вашей виртуальной машине. На Ubuntu или Debian вы можете сделать это с помощью:
sudo apt update
sudo apt install openssh-server
sudo systemctl start ssh
sudo systemctl enable ssh
4. Настройка перенаправления портов
С SLIRP libvirt не поддерживает автоматическое перенаправление портов, как это происходит при использовании системного режима. Таким образом, для подключения по SSH вам необходимо установить перенаправление порта маршрутизатора, использующего SLIRP. Для этого выполните следующие шаги:
-
Откройте файл конфигурации VM:
Можно использоватьvirsh edit myvm
, чтобы открыть XML-файл конфигурации вашей виртуальной машины. -
Добавьте перенаправление порта:
Добавьте следующий блок XML внутри элемента<interface>
:<port forwarding> <forward mode='nat'> <listen> <ip address='0.0.0.0'/> </listen> <target> <port forward='22'/> </target> </forward> </port>
Это действие перенаправит запросы на порт 22 (SSH) вашей VM на свободный порт хоста.
5. Соединение по SSH
Теперь необходимо узнать, какой порт на вашем хосте перенаправлен на порт 22 внутри вашей виртуальной машины. Вы можете воспользоваться командой:
sudo virsh net-dhcp-leases default
Запомните, какой адрес и порт перенаправлен. Теперь вы можете подключиться:
ssh -p [port] user@localhost
Где [port]
– это локальный порт, который был перенаправлен на виртуальную машину, а user
– это имя пользователя, зарегистрированного на вашей виртуальной машине.
Заключение
Подключение к виртуальной машине через SLIRP требует дополнительных шагов по ручному перенаправлению портов, так как libvirt не предоставляет автоматического механизма для этого. С помощью вышеописанных шагов вы сможете успешно подключиться к sshd на вашей виртуальной машине. Если вы планируете использовать виртуальную машину в долгосрочной перспективе и нужны более гибкие сетевые возможности, рекомендуется рассмотреть переключение на системный режим с использованием --connect qemu://system
, который предоставляет больше возможностей для сетевого управления.
Используйте приведенные рекомендации для успешного подключения к виртуальным машинам через SLIRP и оптимизации вашего рабочего процесса в среде libvirt.