como usar o ssh sobre serial sem usar o pppd? (Ou como transferir o TCP por serial sem usar o pppd)

1

Existem muitas máquinas virtuais baseadas no QEMU no meu servidor. Alguns deles são proibidos de usar redes, e a única maneira de anexá-los é via porta serial virtual.

Devido às características ruins do console serial (como trabalhar mal com o tmux e o vim), eu quero usar o ssh via linha serial.

Aqui está minha tentativa: (o QEMU mapeia serial para um soquete unix na máquina host)

#In Guest: (serial is /dev/ttyS1)
socat -d -d tcp:127.0.0.1:22 file:/dev/ttyS1,b115200

#In Host: (mapped to /var/run/qemu-server/vm.serial1)
socat -d -d tcp-l:10022 UNIX-CONNECT:/var/run/qemu-server/vm.serial1

Então tentei executar ssh -vv [email protected] -p 10022 , mas ele solicita:

Bad packet length 1349676916.
ssh_dispatch_run_fatal: Connection to UNKNOWN port 65535: message authentication code incorrect

Mas quando eu uso

# Ctrl+C to terminate
socat STDIO,raw,echo=0,escape=0x3 UNIX-CONNECT:/var/run/qemu-server/vm.serial1

Eu posso ver

SSH-2.0-OpenSSH_7.6p1

Assim, o túnel está conectado, mas parece que não é possível transferir o TCP pela porta serial (talvez a falta de enquadramento e controle de pacote).

Então eu tentei usar o pppd na linha serial e criar uma interface, em seguida, ssh via TCP sobre IP sobre PPP ...

Mas existem muitas VMs, é difícil gerenciar com muita interface criada pelo ppp devido à falta de atribuição automática de IP. Além disso, um endereço IP apenas para o ssh é muito perdido.

Então, se é possível executar um soquete TCP nu em série? Ou pular a camada IP criada por pppd e abrir um soquete TCP por PPP da seguinte forma:

+----------------------+
|                      |
|      TCP Socket      |
|                      |
+----------------------+
|                      |
| Data Link Layer(PPP) |
|                      |
+----------------------+

Eu só quero expor uma porta TCP (ou um soquete UNIX) para usuários que desejam se conectar via ssh a uma VM.

Eu tentei procurar por soluções, mas todas as respostas são sobre como transferir serial sobre TCP, mas o que eu quero é reverso: como transferir o TCP sobre serial?

    
por Komeiji Kuroko 18.01.2018 / 18:07

2 respostas

3

Você está tentando empurrar um monte de protocolos que não tem nada a ver com consoles seriais em um console serial. Isso não produzirá resultados razoáveis e os dados que você deseja já estão sendo oferecidos em texto simples.

Se você usar o libvirt para definir e gerenciar suas VMs, este trabalho já foi feito para você. virsh console <VM Name> irá conectá-lo a um console serial de uma VM, e funciona muito bem - você também pode canalizar isso via SSH a partir do host ou se conectar a virsh sobre ssh + qemu se quiser fazer isso. Da mesma forma, a maioria dos outros sistemas de gerenciamento e orquestração, como o OpenStack ou o Xenserver, tem métodos semelhantes de conexão a dispositivos seriais pty-like VM sem a necessidade de soquetes unix.

tmux não funciona tão bem com interfaces seriais como minicom ou screen . Se você estiver usando uma abordagem manual, conectá-los a dispositivos PTY ou de soquete produziria resultados satisfatórios.

Se você tem muitos consoles seriais em um plano de orquestração manual como o QEMU tende a ser, usar um servidor de console seria prudente em vez de se conectar a cada VM em seu próprio soquete especial ou PTY. conserver é uma boa com a qual eu trabalhei regularmente. Você pode configurar aliases para conectar programas seriais a cada VM e conectar-se a esses programas por meio do conserver via SSH; isso gera um console <servername> simples do host do conserver conectado via SSH para chegar onde você precisa estar.

    
por 14.04.2018 / 23:25
0

Isso pode funcionar, eu fiz isso usando o VMWare e um convidado do Windows, que estava executando um cliente IPSec VPN, que desativava outras redes, incluindo a VM do host.

O truque que eu encontrei foi que o cliente SSH e o servidor SSH enviaram seu banner imediatamente na conexão. Se você conectar / dev / ttyS1 ao tcp: 22 (e não houver nada escutando no outro lado do ttyS1), o banner vai para o bitbucket.

Da mesma forma, se o seu alvo ssh -O "ProxyCommand = 'socat - / dev / ttyS0'" e você ainda não estabeleceu a socat do lado do servidor para tcp: 22, o banner do cliente será perdido. Em última análise, tornou-se uma questão de tempo.

Você DEVE ser capaz de fazer o que precisa fazer na seguinte sequência:

#In Host: (mapped to /var/run/qemu-server/vm.serial1)
socat -d -d UNIX-CONNECT:/var/run/qemu-server/vm.serial1 tcp-l:10022

#In Guest: (serial is /dev/ttyS1)
socat -d -d tcp:127.0.0.1:22 file:/dev/ttyS1,b115200

#In host:
ssh -vv [email protected] -p 10022

As diferenças essenciais entre o que você fez e o acima:

  1. No host, estabeleço a conexão social ao soquete Unix primeiro, em vez de aguardar a conexão TCP de entrada e só depois abrir o soquete Unix. Desta forma, quando executamos o socat no guest e o servidor envia seu banner, o socat lerá e armazenará o banner no buffer até a chegada da conexão TCP de entrada.
  2. Eu gerencio o socat no guest next, para que ele possa enviar o banner para o socat, para ser armazenado em buffer.
  3. Só então podemos executar o cliente ssh.
por 07.05.2018 / 15:40