Anteriormente, eu tinha meu PC de estação de trabalho doméstico exposto diretamente à Internet simplesmente definindo-o como o PC DMZ nas configurações do meu roteador e podia acessar todos os serviços que estava executando nele: SSH, Servidor Web, Área de Trabalho Remota, etc. Eu tinha DynDNS configurado e também possuo um domínio, com uma entrada DNS de subdomínio apontando para o IP externo do meu roteador, para que eu pudesse acessá-lo remotamente, qualquer porta, de qualquer lugar do mundo usando um nome fixo, seja home.mydomain.com
ou myuser.dyndns.com
. A vida era boa.
Agora mudei e meu novo ISP me colocou atrás de um CGNAT, ou seja, o endereço "externo" do meu roteador está na faixa 100.64.0.0/10, então não pode mais ser acessado de fora (e o DynDNS também está morto, mas isso é irrelevante ). ISP não fornece IPv6, infelizmente, e trocar de ISP não é uma opção na minha área.
Dito isso, minha empresa assinou recentemente um plano VPS para minha equipe, executando o Ubuntu 18.04, e tenho controle total sobre ele. Posso SSH para ele, instalar qualquer software, configurá-lo ao meu gosto. Atualmente, ele executa apenas SSH em uma porta não padrão e um pequeno serviço de API em uma porta personalizada, todas as outras portas (incluindo 80) estão disponíveis. Já configurei home.mydomain.com
como CNAME
entrada de DNS apontando para ele.
Então, qual é a melhor estratégia para usar esse novo recurso para finalmente ter meu PC de estação de trabalho doméstico exposto à Internet como era antes?
Ao pesquisar no Google sobre a evasão do CGNAT, li muito sobre túneis reversos SSH / proxy, SOCKS, servidores VPN, mas ainda não tenho certeza de qual é a melhor ferramenta e configuração para atingir o objetivo neste cenário.
Meus requisitos:
Código aberto, apenas software livre : claro, tenho controle total sobre o VPS, mas gostaria de manter a impressão digital extra do software no mínimo. Estou bem
apt install
com qualquer coisa de repositórios oficiais e talvez um repositório do github. Na minha estação de trabalho, também rodando o Ubuntu, posso instalar coisas mais obscuras.Soluções auto-hospedadas : Qualquer coisa que geralmente requer um serviço externo (pago ou não), como Serveo, LocalTunnel, OpenVPN, etc, gostaria de instalar sua versão de servidor no VPS. Não quero que meu tráfego seja encaminhado para outra empresa em que devo confiar.
Sem instalação de cliente (de preferência) : gostaria de acessar minha estação de trabalho de qualquer lugar, seja meu laptop, PC de um amigo, faculdade, trabalho, usando navegadores comuns, clientes SSH, clientes de Área de Trabalho Remota (RDP ou VNC), etc, software que geralmente já estão instalados ou geralmente disponíveis.
Sem furos de portas individuais (de preferência) : Deve ser como se minha estação de trabalho estivesse
home.mydomain.com
diretamente exposta à Internet. Tudo bem se eu tiver que "remapear" as portas, usando uma regra como porta remota = porta local + 10000 (para que o servidor da Web seja acessível na porta 10080), mas, caso contrário, gostaria que fosse o mais próximo possível de uma DMZ. possível.
O mais próximo que cheguei foi ssh [-R xx:localhost:yy]... home.mydomain.com
na estação de trabalho, usando uma série de portas predefinidas e configurando GatewayPorts yes
no VPS /etc/ssh/sshd_config
. É bom, mas acho que pode haver uma solução melhor. Seria incrível se a solução fosse baseada no domínio usado para acessar o VPS. Por exemplo, apenas encaminhar (todas) as solicitações se forem acessadas via home.mydomain.com
, e agir normalmente se forem acessadas viavps.mycompany.com
Na minha opinião, os túneis SSH não são adequados para essa finalidade. É claro que funciona, mas você precisa executar tantos túneis quantas portas quiser encaminhar.
VPN é provavelmente a melhor opção para conseguir isso. Você configura o servidor VPN no VPS, conecta seu(s) servidor(es) doméstico(s) como cliente(s) VPN e, quando não estiver em casa, conecta seu laptop ou computador remoto a esta VPN, como cliente, e você será capaz de acessar seu(s) servidor(es) doméstico(s) como se estivesse na mesma rede local, você nem precisa atribuir a eles um "IP público".
Se você deseja atribuir um IP público a um de seus servidores domésticos, você terá que configurar um segundo IP público no VPS (para que fique disponível a partir de seu IP primário) e, em seguida, configurar 1:1 NAT com o firewall do VPS (iptables). E este servidor doméstico será configurado para usar a VPN como um gateway, de modo que os pacotes de saída passem pelo IP secundário do VPS em vez do IP do seu ISP doméstico.
Se você tiver muitos servidores domésticos, poderá fazer NAT 1:1 se conseguir mais de 2 IPs atribuídos ao VPS. Caso contrário, você terá que usar o encaminhamento de porta se quiser que um único IP seja usado com diferentes servidores domésticos.
Solicite um prefixo IPv6 estático ao seu ISP. Obtenha IPv6 para todo o seu acesso à Internet.
Configure o tunnelbroker IPv6, VPN ou outros métodos de transição para quando você tiver apenas acesso IPv4 herdado.
Isso provavelmente não ajudará você, mas acho bom destacar o PCP (Protocolo de controle de porta) como adequado a esse caso de uso. Seu ISP teria que oferecer suporte a isso (não sei o quão predominante é o suporte do ISP ao PCP, sendo pessimista, acho que não muito ...)
O PCP é basicamente um dos mais recentes da família de protocolos do tipo UPnP, NAT-PMP. O PCP possui funções MAP e PEER que permitem que seu cliente solicite um encaminhamento de porta no nível do ISP (no CGNAT). Se alguém souber de um ISP fazendo isso (ou melhor ainda, realmente o usou no mundo real), adoraria ouvir sobre isso.
https://www.rfc-editor.org/rfc/rfc6887
https://en.wikipedia.org/wiki/Port_Control_Protocol
Usando PCP (Protocolo de Controle de Porta) na prática?