¿Cómo SSH de host a invitado usando QEMU?

30

¿Cómo configuro ssh desde el host al invitado usando qemu? Puedo usar la redirección de puertos cuando inicio la VM sin ningún parámetro especial, como se muestra a continuación:

/usr/bin/qemu-system-x86_64 -hda ubuntu1204 -m 512 -redir tcp:7777::8001

Pero cuando trato de arrancar usando lo siguiente:

/usr/bin/qemu-system-x86_64 \
-m 1024 \
-name vserialtest \
-hda ubuntu1204 \
-chardev socket,host=localhost,port=7777,server,nowait,id=port1-char \
-device virtio-serial \
-device virtserialport,id=port1,chardev=port1-char,name=org.fedoraproject.port.0 \
-net user,hostfwd=tcp:7777::8001

Me sale el siguiente error y la VM no arranca:

qemu-system-x86_64: -net user,hostfwd=tcp:7777::8001: invalid host
forwarding rule 'tcp:7777::8001'
qemu-system-x86_64: -net user,hostfwd=tcp:7777::8001: Device 'user'
could not be initialized

Tenga en cuenta que puedo iniciar la VM sin el -netparámetro sin ningún problema, sin embargo, quiero configurar ssh desde el host al invitado. ssh de invitado a host funciona bien como se esperaba.

Editar

He intentado usar

-net user,hostfwd=tcp::7777-:8001

tanto como

-net user,hostfwd=tcp::7777:8001

pero aún así el error persiste y la VM no arranca.

Jobin
fuente
stackoverflow
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

37

Creo que el error no proviene de la declaración -net, sino de:

-chardev socket,host=localhost,port=7777,server,nowait,id=port1-char

La declaración ya utiliza el puerto 7777. Para el reenvío de puertos, con

-net user,hostfwd=tcp::7777-:8001

funciona bien cuando no se configura el canal serie virtio.

Si entiendo bien, ¿desea configurar un canal serie virtio para comunicarse desde el host a la VM utilizando un socket de dominio Unix?

En este caso, lo siguiente podría hacer el trabajo:

/usr/bin/qemu-system-x86_64 \
-m 1024 \
-name vserialtest \
-hda ubuntu1204 \
-chardev socket,path=/tmp/port1,server,nowait,id=port1-char \
-device virtio-serial \
-device virtserialport,id=port1,chardev=port1-char,name=org.fedoraproject.port.0 \
-net user,hostfwd=tcp::7777-:8001

EDITAR:

Un ejemplo de cómo conectarse desde el host usando ssh a la VM:

-net user,hostfwd=tcp::10022-:22
-net nic

Este reenvío de host asigna el puerto localhost (host) 10022 al puerto 22 en la VM. Una vez que la VM se inició de esta manera, puede acceder desde el host local de la siguiente manera:

ssh vmuser@localhost -p10022

El comando -net nic inicializa una tarjeta de interfaz de red virtual muy básica.

mas_kur1
fuente
Sí, tiene razón, estoy tratando de usar virtio-serial para establecer la comunicación del anfitrión al invitado. La máquina virtual se ha iniciado dando una advertencia en la consola del host: Warning: vlan 0 with no nicspero cuando lo hago ifconfigen el invitado solo veo loy sigo apareciendo ssh: connect to host 10.0.2.15 port 22: Connection timed outcuando intento ssh; la IP que solía usar ssh es 10.0.2.15, que de acuerdo con man qemu-system-x86_64la IP asignada a la primera máquina virtual iniciada si no se asigna una IP estática. Y ahora no hay conexión a Internet en el invitado.
jobin
Lo que quizás desee hacer es asignar el puerto 22 utilizado para ssh en otro puerto y luego conectarse a él desde la máquina host para acceder a la VM. Edité mi respuesta con un ejemplo.
mas_kur1
¡La respuesta editada funciona perfectamente!
Dbernard
19

Pruebe esto al iniciar qemu -redir tcp:2222::22

$ ssh -p 2222 localhost

El indicador tcp: 2222 :: 22 en el comando de lanzamiento qemu asigna el puerto 2222 de la máquina host al puerto 22 (el puerto ssh predeterminado) en la máquina virtual.

Luego, simplemente enviando ssh al puerto 2222 en su host local (la máquina host) redirigirá cualquier tráfico al puerto ssh 22 en la máquina virtual, lo que debería permitirle ssh como lo haría normalmente con cualquier otra máquina.

mikeschuld
fuente
3
¡Bienvenido a Unix y Linux! Estamos buscando respuestas largas que brinden alguna explicación y contexto. No solo digas "Prueba esto ..."; explique por qué su respuesta es correcta, idealmente con citas. Las respuestas que no incluyen explicaciones pueden eliminarse.
G-Man dice 'reinstalar a Mónica' el
3
Simplemente siento la necesidad de decir que esta respuesta me ayudó más que todas las otras respuestas anteriores. No hay información superflua y, sobre todo, funciona. Perfecto al aterrizar desde una consulta de Google "cómo diablos hago ssh en qemu".
enero
1
Esta respuesta hace lo que realmente quiere el 99.9% de las personas. Es decir, la máquina host obtiene acceso ssh a la máquina virtual, incluida la capacidad del host para copiar archivos ay desde la máquina virtual mediante scp o similar.
nullUser
1
¡Brillante! Mi comando Frambuesa Pi ahora se ve comoqemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw console=ttyAMA0,115200" -hda 2014-01-07-wheezy-raspbian.img -nographic -redir tcp:2222::22
enthusiasticgeek
2
man qemu-system-x86_642.5.0: Nota: Las opciones independientes heredadas -tftp, -bootp, -smb y -redir aún se procesan y aplican al usuario -net.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
4

Configuración de OpenSSH probada en Buildroot 2016.05, QEMU 2.5.0, Ubuntu 16.04 host

Además del reenvío de red de QEMU, también debe configurar SSH correctamente, lo que cubriré aquí.

Comience qemu_x86_64_defconfigy habilite el paquete openssh:

make qemu_x86_64_defconfig
echo 'BR2_PACKAGE_OPENSSH=y' >> .config
make BR2_JLEVEL=$(nproc)

Luego, inicie QEMU con:

qemu-system-x86_64 \
  -M pc \
  -append root=/dev/vda \
  -drive file=output/images/rootfs.ext2,if=virtio,format=raw \
  -enable-kvm \
  -kernel output/images/bzImage \
  -m 512 \
  -net nic,model=virtio \
  -net user,hostfwd=tcp::2222-:22

Luego en invitado:

vi /etc/ssh/sshd_config

Modifique la siguiente configuración:

PermitRootLogin yes
PermitEmptyPasswords yes

Y reinicie el servidor:

/etc/init.d/S50sshd restart

Debido a que este archivo existe, sshd se inicia por defecto, aquí está la fuente: https://github.com/buildroot/buildroot/blob/2018.02/package/openssh/S50sshd y las operaciones clave de inicio son:

/usr/bin/ssh-keygen -A
/usr/sbin/sshd
touch /var/lock/sshd

Luego del anfitrión:

ssh root@localhost -p 2222

En caso de falla, primero compruebe que el reenvío de redes funciona con una herramienta de nivel inferior que sshd: por ejemplo, nc -l como se describe aquí .

También verifique los registros del servidor en el invitado:

less /var/log/messages

Luego, en el sistema final, debe automatizar la creación de ese archivo de registro con BR2_ROOTFS_OVERLAYo BR2_ROOTFS_POST_BUILD_SCRIPT: Personalizar el sistema de archivos de destino generado | buildroot.org

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente
-1

Creo que necesitas usar hostfwd=tcp::7777-:8001ohostfwd=tcp::7777:8001

phoops
fuente