De acordo com ssh.com e Wikipedia, a primeira versão e implementação do protocolo SSH foi lançada em 1995. A tarefa do autor era desenvolver uma alternativa segura ao rlogin, telnet e rsh, que foram então usados para administração remota. É curioso que o surgimento do protocolo SSH tenha sido facilitado por um incidente de segurança da informação, como resultado do invasor coletar um impressionante banco de dados de nomes de usuário / senhas de servidores, simplesmente ouvindo a rede da universidade e extraindo pacotes de autenticação (pares de nome de usuário / senha foram transmitidos de forma não criptografada).
O protocolo rapidamente ganhou popularidade e, após um longo período de aprimoramentos e melhorias, foi padronizado pela IETF em 2006. Desde então, ele conseguiu se tornar o padrão de fato para o gerenciamento remoto de sistemas de console de texto. Além do próprio console de texto, o protocolo fornece uma série de outras funções úteis, como transferência de arquivos e encaminhamento de porta. Trata-se de encaminhamento de porta e seu aplicativo não muito óbvio que será discutido neste artigo.
O protocolo SSH fornece dois modos de encaminhamento de porta - frente e verso. O modo direto permite abrir uma porta TCP de escuta no lado do cliente SSH e encaminhar todas as conexões a essa porta para o lado do servidor.

Por exemplo, se um Servidor de Área de Trabalho Remota (RDS) estiver em execução em nosso servidor SSH, podemos usar o protocolo SSH para conectar-se a esse servidor, mesmo que a conexão direta à rede não seja possível (por exemplo, ela é bloqueada por um firewall). Assim:

O segundo modo de encaminhamento de porta - reverso - permite trocar as funções do servidor e do cliente SSH (conforme aplicado à porta que está sendo encaminhada). No modo reverso, a porta TCP de escuta é aberta no servidor SSH e o aplicativo que atende a essa porta está no cliente SSH. Isso é útil raramente, mas, como regra, muito apropriadamente.

Combinando esses dois modos e nosso exemplo com um servidor de desktop remoto, você pode obter esta configuração:

À primeira vista, parece redundante. Mas, juntamente com a aparente redundância, temos duas propriedades importantes:
- A única coisa necessária da rede para que esse esquema funcione corretamente é garantir o endereço de rede do host em que o servidor SSH está localizado. Os nós nos quais o servidor e o cliente RDS estão executando podem alterar seus endereços de rede pelo menos a cada minuto (ou podem até ter endereços na rede privada, precisamos apenas do NAT de saída, que é geralmente chamado de "conexão com a Internet").
- Apesar de, para nós, o servidor RDS ser acessível de qualquer lugar da Internet, outros usuários não podem se conectar a ele (desde que não haja vulnerabilidades no servidor SSH). E como o protocolo RDS tem seu próprio controle de acesso, mesmo no caso de um ataque bem-sucedido no servidor SSH, o invasor também precisará executar um ataque ao RDS. A probabilidade de ter uma vulnerabilidade de servidor SSH e uma vulnerabilidade de servidor RDS é muito menor que a probabilidade de cada componente individualmente.
Se você olhar atentamente, neste diagrama poderá ver duas redes independentes de computadores. Transporte único - permite estabelecer conexões SSH. Outro - interno - é usado para fins aplicados. Tentaremos tirar algumas conclusões interessantes dessa observação em artigos subsequentes, mas, por enquanto, voltemos aos nossos experimentos.
Conecte-se ao seu computador doméstico
No pátio do século XXI, a entrega de um pacote de rede da Sibéria para a Califórnia leva 0,1 segundos, o mundo inteiro está enredado em redes de computadores e o TCP / IP é mesmo em escovas de dente. Parece que com essa conexão de tudo com tudo, há muito tempo deveríamos poder controlar um computador não apenas através da presença física perto de dispositivos de entrada, mas também remotamente, através da rede. Além disso, existem muitas tecnologias e protocolos para isso. Área de trabalho remota da Microsoft, variações de VNC em sistemas * nix, soluções Citrix, milhares delas ... No entanto, poucos de nós podem se orgulhar da capacidade de se conectar ao computador doméstico de qualquer lugar do mundo usando qualquer uma dessas tecnologias.
Há duas razões pelas quais poucos podem se orgulhar de se conectar ao seu próprio computador doméstico, e eles estão conectados um ao outro. O primeiro é a ausência de um endereço típico de computador doméstico na rede global. As raízes desse estado de coisas remontam a 1981, em que o padrão IPv4 foi descrito pela primeira vez, que até hoje é usado (por si só, com alterações e acréscimos) para abordar a maioria dos sites na Internet. Os autores do padrão decidiram que o espaço de endereços com capacidade de 3,7 bilhões de endereços é suficiente para todos os dispositivos do mundo, mas a realidade acabou sendo dura. A Internet IPv4 não deve estar disponível até setembro de 2019.
Além disso, um usuário típico da Internet que não hospeda sites pode aproveitar todos os benefícios da civilização sem ter um endereço na rede global, limitando-se apenas a um endereço em uma rede privada e provedor NAT. Em outras palavras, para a maioria dos usuários da Internet, não há diferença entre a presença e a ausência de um endereço IP global para seus equipamentos. Em tais circunstâncias, o número daqueles a quem o provedor emite um endereço IP global na rede global está diminuindo rapidamente. Como resultado, um computador doméstico típico está localizado em uma rede privada e não possui um endereço global. Mesmo que o provedor ainda atribua um endereço ao equipamento do usuário na rede global, esse equipamento é um roteador doméstico que executa o NAT a partir de uma rede privada doméstica. O usuário, é claro, pode "encaminhar a porta" no roteador, mas mesmo nesse melhor caso, o endereço global do roteador pode mudar de um dia para o outro. Sim, existem provedores que fornecem o serviço "Static IP" por uma taxa modesta, mas, na prática, a essa altura, o usuário percebe que o jogo não vale a pena e, se você precisar fazer algo com o seu computador doméstico, também poderá ligar ligar.
Os mais persistentes podem passar por essa busca até o fim e encontrar a segunda razão pela qual a abertura de acesso ao computador via Internet é entretenimento apenas para aqueles que têm espírito forte. Esse motivo é comum - segurança da informação. A rede global é global, mais cedo ou mais tarde, alguém do outro lado do mundo e com más intenções baterá à sua porta. A varredura da porta aberta na qual o servidor da área de trabalho remota responde não é uma tarefa muito difícil e, mais cedo ou mais tarde, o TCP SYN chegará à sua porta super secreta 32167 de uma vila chinesa.
Voltando ao nosso encaminhamento de porta exótico usando SSH, você notará que seus recursos eliminam esses dois motivos.
Crie um TeamViewer
Você precisa fazer uma reserva imediatamente de que o TeamViewer é um ótimo produto com um grande número de recursos muito diferentes. Como parte deste artigo, coletaremos apenas para nós mesmos uma maneira de conectar-se com segurança via Internet, através do protocolo Remote Desktop, a um computador localizado atrás do NAT. No entanto, atrevo-me a sugerir que é a conexão a qualquer computador com acesso à Internet que é o principal recurso distintivo do TeamViewer, pelo qual este produto é tão popular. E é precisamente essa conexão que podemos implementar com nossas próprias mãos, usando nossa configuração SSH da primeira parte do artigo.
Portanto, as condições da tarefa: existe um computador doméstico e um laptop, ambos estão executando o Windows 10. É necessário possibilitar que o laptop possa acessar o computador doméstico usando o protocolo Remote Desktop de qualquer lugar do mundo. Nosso sistema incluirá o servidor de Área de Trabalho Remota do computador doméstico, um laptop com um cliente de Área de Trabalho Remota e um servidor SSH. O servidor SSH é o único componente que requer um endereço IP global e disponibilidade permanente. A opção mais fácil de atender a esses requisitos é hospedar um servidor SSH na nuvem. O Yandex.Cloud é ótimo (principalmente devido à sua política de preços), então vamos usá-lo. O resultado é assim:

Vamos começar preparando nosso computador doméstico. Primeiro, verifique se o acesso remoto a ele geralmente é permitido. Isso pode ser feito através da guia Acesso remoto nas configurações adicionais do sistema:

A partir de abril de 2018, o Windows 10 já possui um cliente ssh entre os utilitários de linha de comando. Isso nos ajudará a ficar menos distraídos com a instalação de softwares diferentes e começar a trabalhar imediatamente. Primeiro, geramos uma chave para SSH. Abra o shell do PowerShell e execute 'ssh-keygen'. Quando for perguntado sobre a senha da chave, deixe em branco. Após gerar a chave, exiba sua parte aberta no console com o comando 'cat $ HOME / .ssh / id_rsa.pub'. O resultado do comando é útil para iniciarmos o servidor SSH na nuvem. Você deve obter algo como isto:

Precisamos copiar a parte privada da chave SSH para o laptop. Esta parte da chave está no arquivo '$ HOME / .ssh / id_rsa' (sem o sufixo ".pub"), e podemos copiá-lo como um arquivo regular. Por exemplo, usando uma unidade flash USB (assumimos que ela esteja montada como unidade F :)
copy $HOME/.ssh/id_rsa f:\
Agora execute nosso servidor SSH. Crie uma máquina virtual (VM) no Yandex.Cloud. Para nossos propósitos, você pode escolher uma VM "leve" com 1 vCPU e 0,5 gigabytes de RAM. Na seção configurações de rede, selecione a rede padrão com um endereço IP automático. Na seção "acesso", insira "home" como o login, no campo de entrada da chave SSH, copie o que foi exibido em nosso console na etapa anterior:

Clique em "Criar VM" e aguarde a conclusão. Após a criação da máquina virtual, precisamos descobrir seu endereço IP:

Precisamos do endereço IP da nossa máquina virtual para executar o cliente SSH no computador doméstico e laptop. Execute-o no computador desta maneira (neste e nos seguintes comandos, você precisa substituir 84.201.141.36 pelo endereço IP da sua VM):
ssh -NR 3389:localhost:3389 home@84.201.141.36
Quando perguntados sobre a conexão com um servidor desconhecido, respondemos "sim". Se não vemos nenhum texto no console, tudo correu bem. Agora configure o laptop. Copie a chave privada da nossa unidade flash:
mkdir -Force $HOME/.ssh copy f:\id_rsa $HOME/.ssh/id_rsa
E execute o cliente SSH:
ssh -NL 1025:localhost:3389 home@84.201.141.36
Agora você pode executar o cliente de acesso à área de trabalho remota (mstsc.exe) no laptop, especificando localhost: 1025 como o endereço de conexão. Viva, funciona!
Ou quase funciona. Se você parar o processo SSH no seu computador doméstico, será impossível conectar-se. Precisamos fazer esse processo iniciar automaticamente quando o sistema for iniciado e também reiniciar quando a conexão for desconectada. Isso pode ser alcançado, por exemplo, criando um script do PowerShell e registrando-o como obrigatório para execução na Diretiva de Grupo na inicialização do computador. Você só precisa considerar que será lançado em nome da conta do sistema, o que significa que você precisa garantir que nossa chave SSH esteja disponível para a conta do sistema.
Vamos descer primeiro à chave. Execute o PowerShell como administrador e execute os seguintes comandos:
copy $HOME/.ssh/id_rsa "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" icacls "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" /reset
Ao mesmo tempo, na mesma janela do PowerShell, habilite a execução de script:
Set-ExecutionPolicy RemoteSigned
Agora crie o script real. Vamos abrir o nosso editor de texto favorito (o Bloco de notas também é adequado) e escrever este script (lembre-se de substituir o endereço IP do servidor SSH pelo endereço fornecido pelo Yandex):
while (1) { & $(get-command ssh |select -expandproperty Path) ` -i "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" ` -o StrictHostKeyChecking=accept-new -o ExitOnForwardFailure=yes ` -NR 3389:localhost:3389 home@84.201.141.36 Start-Sleep -Seconds 15 }
Salve o script no diretório que você gosta. Por fim, registre-o para execução automática. Para fazer isso, execute o Editor de Diretiva de Grupo (Win + R → gpedit.msc) e abra os itens "Configuração do Computador" → "Configuração do Windows" → "Scripts (início / fim)" → "Inicialização". Na guia "Scripts do PowerShell", use o botão "Adicionar" e indique o caminho para o script salvo.

Faremos o mesmo em um laptop. Primeiro PowerShell como administrador:
copy $HOME/.ssh/id_rsa "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" icacls "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" /reset Set-ExecutionPolicy RemoteSigned
Em seguida, prepararemos um script em um editor de texto (é um pouco diferente do anterior, mas, como antes, substituímos o endereço IP pelo endereço que foi emitido pelo Yandex):
while (1) { & $(get-command ssh |select -expandproperty Path) ` -i "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" ` -o StrictHostKeyChecking=accept-new -o ExitOnForwardFailure=yes ` -NL 1025:localhost:3389 home@84.201.141.36 Start-Sleep -Seconds 15 }
O non-end registrará para iniciar na inicialização usando "gpedit.msc". Reinicie o computador e o laptop (para garantir que tudo comece corretamente) e pronto! Agora, nosso computador doméstico e nosso laptop estão sempre conectados entre si (desde que nossa máquina virtual no Yandex.Cloud esteja ligada e acessível).
E daí?
Bem, isso não é ótimo? Em qualquer café, em qualquer aeroporto, você pode se conectar à sua casa e ver suas fotos favoritas com gatos. Ou por favor, volte para casa com a inclusão da 5ª sinfonia de Beethoven no volume máximo. Ou se interesse pelo sucesso de sua fazenda de mineração. Ou veja o que está acontecendo em casa com uma webcam. Mas quantas aplicações têm essa oportunidade de "se teletransportar"? Mas nossa solução também tem desvantagens.
Em primeiro lugar, configurar uma conexão não é o processo mais fácil e agradável. E caso algo dê errado, a depuração é um pouco mais complicada do que a configuração inicial. Obviamente, esse problema é resolvido pela perseverança e paciência, mas mesmo a pequena quantidade de trabalho que precisa ser gasta pode levantar dúvidas sobre a viabilidade dos esforços.
Em segundo lugar, uma máquina virtual na nuvem custa dinheiro. No caso do Yandex, o mínimo com o qual você pode contar é 480 rublos por mês. Evidentemente, isso não é dinheiro exorbitante, mas ainda assim próprio, ganho no suor de uma pessoa. Se vale a pena ver fotos com gatos desse dinheiro, cabe a todos decidir por si mesmo, mas pode muito bem ser que todas as vantagens de nossa solução sejam riscadas pelo seu preço.
A questão dos preços pode ser substancialmente suavizada através do compartilhamento de despesas com amigos e pessoas afins. Como a máquina virtual é usada para tarefas que não exigem nenhum poder de computação perceptível, a degradação do desempenho é extremamente improvável. E o efeito econômico é notável: se você alugar uma máquina virtual com dez pessoas, todos terão que pagar apenas 48 rublos por mês. É verdade que, nesse caso, a harmonia pode ser violada pela questão da confiança: qualquer pessoa com a mesma opinião tem a oportunidade de se conectar a um outro computador por meio de um servidor SSH. No caso em que todos tenham senhas fortes em suas contas, isso não é um problema. Mas, francamente, uma senha forte para entrar no seu computador doméstico é mais uma exceção do que uma regra.
Para ser continuado
Então, suponha que reunamos 10 pessoas com idéias semelhantes, configuremos tudo como descrito acima e tudo funciona para todos. Nosso clube de amantes de fotos com gatos aproveita a oportunidade para ir à sua casa pela Internet por apenas 48 rublos por mês sem registrar e enviar SMS, todos estão felizes e felizes. A questão é: as possibilidades de nossa “tecnologia” são limitadas apenas aos gatos e é possível usá-lo para algo mais sério?
Claro que você pode. Se, em nosso raciocínio, substituirmos “computador doméstico” por “construir servidor na nuvem” e “laptop” por “computador comercial no escritório”, obteremos algo digno do título “sistema de acesso à infraestrutura de desenvolvimento”. E se tivermos uma câmera IP em vez de um servidor de compilação e um posto de segurança em vez de um computador em funcionamento, obteremos um "sistema de vigilância por vídeo".
Nos dois casos, no entanto, será necessário prestar mais atenção aos problemas de controle de acesso. Em particular, ao compartilhar um servidor SSH por vários usuários, eu gostaria de isolar esses usuários. E mesmo com esse compartilhamento, somos obrigados a atribuir cada recurso separado de cada usuário a uma porta TCP separada e lembrar o seu número. O endereçamento por números pode se tornar entediante em breve, então eu gostaria de poder atribuir nomes significativos aos recursos. Mas falaremos sobre como melhorar a situação no próximo artigo.
Enquanto isso, obrigado por sua atenção e compartilhe seus pensamentos nos comentários.