AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 437032
Accepted
irishwill200
irishwill200
Asked: 2018-04-12 06:21:58 +0800 CST2018-04-12 06:21:58 +0800 CST 2018-04-12 06:21:58 +0800 CST

Informações/assistência necessárias no túnel SSH reverso (convenções de nomenclatura, etc.)

  • 772

Eu tenho vários raspberry pi executando o Arch Linux (sem GUI) nos quais preciso acessar. Esses pis estão atrás de firewalls em cada local exclusivo. Atualmente eu uso o openvpn para me conectar a eles, mas os custos desse sistema são caros por licença. Eu uso o servidor de acesso deles.

Como resultado, estou tentando projetar e configurar um sistema que me permita fazer login no meu servidor VPN (vps) e executar um comando para procurar um nome específico (OfficeDevice1991), como: customcommandsearch "OfficeDevice1991"e, em seguida, retorna o IP endereço da máquina ou algo que eu possa usar para fazer SSH. Também estou procurando a capacidade de executar um comando para listar todos os dispositivos conectados ativos. Ele lista o IP, o nome e talvez há quanto tempo está ativo.

Para esse objetivo, é claro que preciso criar algo que inclua o nome do dispositivo (neste caso, OfficeDevice1991) e, em seguida, esse pi poderá se conectar ao meu servidor público vps. No servidor público, posso fazer login e pesquisar todos os dispositivos conectados a ele e retornar as informações necessárias para o ssh.

Tenho procurado o SSH reverso e, até agora, consegui conectar um dos meus pi de teste e acessá-lo a partir do meu vps usando os seguintes comandos:

IP:

ssh -fN -R 12345:localhost:22 -i /publickeyfile useraccount@ip //Pi's command to connect to vpn

VPS:

ssh -p 12345 useraccount@localhost //command for vpn to connect to pi

Isso funciona muito bem, mas usando esse método, se eu fosse implementá-lo, teria alguns problemas:

  1. Eu precisaria configurar portas únicas não utilizadas
  2. Alguma maneira de manter essas portas / túneis abertos
  3. Preciso criar um sistema para identificar cada dispositivo. Posso registrar cada porta em um nome como um arquivo de texto localmente? Seria benéfico poder incluir isso na configuração do ssh para cada dispositivo, se possível. Eu ainda precisaria ter certeza de que as portas que uso não estão sendo usadas por nenhum outro programa ou dispositivo já existente.

O que eu não quero ter que fazer

  1. Verifique quais portas estão livres para usar para cada RPI

  2. Tem que editar manualmente .ssh/configpara adicionar um nome para representar cada porta atribuída ao RPI da parte 1 acima.

Estou escrevendo isso para obter informações / assistência sobre o que fazer para atingir meu objetivo.

Alguém poderia me fornecer uma solução adequada?

ssh vpn
  • 2 2 respostas
  • 694 Views

2 respostas

  • Voted
  1. Best Answer
    A.B
    2018-04-12T13:49:46+08:002018-04-12T13:49:46+08:00

    Aqui está uma solução usando OpenSSH >= 6.7 + socat :

    1. OpenSSH >= 6.7 pode usar encaminhamento de soquete de domínio Unix

      Isso significa que o ponto final do túnel reverso será um soquete de escuta UNIX em vez de um soquete de escuta TCP tradicional. Você pode então gerenciar mais facilmente a flotilha de RPIs com um esquema de nomenclatura fácil: o nome do soquete será o nome escolhido (e fixo) do RPI, como OfficeDevice1991. Pode até ser uma propriedade exclusiva do RPI, desde que seja um nome de arquivo válido (já que os nomes de soquete unix aderem às convenções de nome de arquivo). Por exemplo, seu nome de host, o endereço MAC de sua placa ethernet ou wi-fi ...

      O SSH pode lidar com soquetes unix para túneis, não para se conectar. Necessitará da ajuda de um ProxyCommandpara poder funcionar como cliente unix-socket. socat pode lidar com muitos tipos de conexões, incluindo soquetes unix.

      ATUALIZAÇÃO:
      Há também um problema específico a ser resolvido: o arquivo de soquete unix não é excluído na saída limpa, nem teria sido excluído de qualquer maneira, por exemplo, após uma falha. Isso requer a opção StreamLocalBindUnlink=yes. Não achei inicialmente que, como o nome talvez implique, essa opção deve ser definida no nó que cria o soquete unix. Então, no final, é definido no cliente com um encaminhamento local ( -L) ou então no servidor (em sshd_config) com um encaminhamento remoto ( -R). OP encontrou lá . Esta solução usa um encaminhamento remoto.

      Configuração no VPS:

      mkdir /rpi-access
      

      (como root) edite o sshd_configarquivo ( /etc/ssh/sshd_config). Requer esta opção adicional:

      StreamLocalBindUnlink yes
      

      Dependendo das opções padrão, também pode exigirAllowStreamLocalForwarding yes

      UPDATE2:
      Também definido nos sshd_configparâmetros ClientAliveIntervale ClientAliveCountMax, permitindo detectar uma desconexão em um tempo razoável, por exemplo:

      ClientAliveInterval 300
      ClientAliveCountMax 2
      

      As conexões ssh obsoletas devem ser detectadas anteriormente no VPS (~ 10mn com o exemplo) e o processo sshd correspondente será encerrado.

      Uso no RPI:

      ssh -fN -R /rpi-access/OfficeDevice1991:localhost:22 -i /privatekeyfile useraccount@ip
      

      Em um arquivo de configuração, isso seria semelhante a isto:

      Host ip
      User useraccount
      RemoteForward /rpi-access/OfficeDevice1991:localhost:22
      IdentityFile /privatekeyfile
      

      Repetindo novamente: a opção StreamLocalBindUnlink yes ligada sshdno lado VPS é importante: o soquete recém-criado não é removido, mesmo na saída normal. Esta opção garante que o soquete seja removido se existir antes do uso, permitindo assim que seja reutilizado para novas religações. Isso também significa que não se pode considerar a mera presença do soquete como significando que o RPI está conectado (mas veja mais adiante).

      Agora isso permite fazer no VPS:

      ssh -o 'ProxyCommand=socat UNIX:/rpi-access/%h -' rpiuseraccount@OfficeDevice1991
      

      Como um arquivo de configuração, considerando, por exemplo, que os RPIs tenham um nome começando com OfficeDevice :

      Host OfficeDevice*
          User rpiuseraccount
          ProxyCommand socat UNIX:/rpi-access/%h -
      
    2. Para manter o link, basta usar um loop

      O RPI pode executar um loop reconectando o ssh ao VPS sempre que as conexões terminarem. Para isso não deve utilizar o modo background (não -f). Um mecanismo de manutenção de atividade também deve ser usado. TCPKeepAlive (nível do sistema) ou ServerAliveInterval (nível do aplicativo) estão disponíveis. Eu acho que o TCPKeepAlive é útil apenas no servidor (o lado que recebe a conexão), então vamos usar o ServerAliveInterval.

      Seu valor (assim como ServerAliveCountMax) provavelmente deve ser adaptado dependendo de vários critérios: um firewall derrubando conexões inativas após um certo tempo, o atraso de recuperação desejado, não gerando tráfego inútil, ... digamos 300s aqui.

      OfficeDevice1991 RPI:

      #!/bin/sh
      while : ; do
          ssh  -N -o ConnectTimeout=30 -o ServerAliveInterval=300 -R /rpi-access/OfficeDevice1991:localhost:22 -i /privatekeyfile useraccount@ip
          sleep 5 # avoid flood/DDoS in case of really unexpected issues
      done
      

      Mesmo que o lado remoto ainda não tenha detectado a falha de conectividade anterior e, por mais algum tempo, a conexão ssh antiga ainda esteja em execução, StreamLocalBindUnlink yesatualizará de qualquer maneira o soquete unix para a nova conexão.

    3. já é tratado por 1.

      Não há customcommandsearchnecessidade. Com as configurações corretas definidas em 1. apenas usando ssh OfficeDevice1991irá se conectar ao OfficeDevice1991.

      Se necessário no VPS, rootapenas como usuário, este comando:

      fuser /rpi-access/*
      

      pode mostrar quais RPIs estão conectados no momento (claro, exceto aqueles que recentemente perderam a conexão antes da detecção). Ele não mostrará os arquivos de soquete unix obsoletos porque não há nenhum processo vinculado a eles.

    • 3
  2. roaima
    2018-04-13T01:02:54+08:002018-04-13T01:02:54+08:00

    Este é um par de abordagens diferentes sobre a situação. Omiti alguns detalhes aqui porque não há nada que o impeça de fazer uma pergunta adicional para obter detalhes se você tentar qualquer uma dessas rotas.

    1. Substitua o servidor de acesso OpenVPN

    Se o custo do OpenVPN Access Server for um problema proibitivo, considere implantar seu próprio servidor OpenVPN. O software é de uso gratuito; você só precisaria de um endpoint de servidor (um VPS ou equivalente, se não tiver nada localmente) e o conjunto de habilidades para configurá-lo. Muitos tutoriais estão disponíveis para isso, então você não precisa começar do zero.

    Depois de configurar isso, você pode usar o DNS ou /etc/hostsdefinir nomes de host, como o seu, OfficeDevice1991para apontar para o endereço de terminal VPN apropriado em seu servidor.

    2. Use autosshem vez de OpenVPN

    Depois de ter seu próprio endpoint, você pode usar algo como autosshem cada um dos sistemas Pi sshpara um endpoint "conhecido" na inicialização (um VPS ou equivalente, se você não tiver nada localmente).

    Carregue um túnel reverso ( ssh -R) em cada um, de modo que cada Pi apresente um número de porta diferente do seu servidor que mapeia de volta para sua própria sshporta 22.

    O uso criterioso de entradas em ~/.ssh/configpode permitir que você execute ssh OfficeDevice1991e mapeie automaticamente para algo como ssh -p 12345 localhost, que por sua vez corresponderia a uma sshconexão normal com o Pi representando OfficeDevice1991.


    Respondendo ao seu conjunto de perguntas que você adicionou em sua edição,

    whoou fingerdaria a você o tempo conectado de cada RPi.

    1. As portas 49152 a 65535 são suas
    2. isso é o que autosshfaz
    3. Nomes de host

    e

    1. Como #1 acima
    2. Um for x ... do ... doneloop curto pode gerar automaticamente o arquivo para você. Eu também não gostaria de criar 1.000 entradas manualmente.
    • 1

relate perguntas

  • Por que o utilitário ssh é considerado um pty?

  • Auto-SSH funciona manualmente, mas não em segundo plano

  • Execute o aplicativo X remotamente, execute a GUI no host remoto [fechado]

  • rsync porta 22 e 873 uso

  • Aborto repentino do SCP: tubo quebrado, código de autenticação de mensagem incorreto

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve