VPN Remoto Raspberry Pi?

Estou procurando criar uma caixa pequena, provavelmente um Raspberry Pi, que eu entregaria aos meus clientes e que me permitiria conectar à rede local deles e acessar os dispositivos na rede. Tudo que eles precisam fazer é conectar energia e Ethernet. Não deve exigir abrir portas ou fazer mudanças na rede local deles. Deve funcionar atrás de CGNAT.

Alguém já fez esse tipo de configuração?

Estou pensando em criar um túnel entre minha máquina e o Raspberry Pi usando um VPS como ponte.

Editar: Gostaria de acrescentar que preciso de acesso direto à rede deles, não apenas SSH no RPI e depois dos RPI para outros dispositivos. Meu PC — (túnel VPN) — PC/PLC do cliente. Não posso conectar ao RPI primeiro porque tenho ferramentas que só funcionam no Windows.

Edit 2: Após ler seus comentários e pesquisar um pouco, consegui alcançar o que precisava seguindo este tutorial

Esta é minha configuração final: https://pastebin.com/raw/TfYeWFpP

NOTA: isso permite comunicação unidirecional do meu PC para os dispositivos da rede do cliente. Dispositivos do cliente não podem iniciar comunicação sem alterar sua tabela de roteamento.

Procure por “túnel SSH reverso”

Faz isso há pelo menos 15 anos.

Às vezes preciso ajudar parentes com problemas no computador. Tenho um Raspberry Pi em cada uma das casas deles que faz login na minha e configura um túnel SSH reverso.

O comando no Raspberry Pi é:

ssh -N -f -R 2112:localhost:22 [email protected]

Ou instale autossh, que reiniciará automaticamente se a conexão cair por um minuto.

sudo -u nome autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -N -f -R 2112:localhost:22 [email protected]

Este comando configura um túnel onde ele escuta na minha máquina na porta 2112 e encaminha todo o tráfego para a porta 22 do Raspberry Pi remoto (onde o SSH escuta)

Da minha casa eu digito:

ssh -p 2112 nome@localhost

E agora estou conectado ao Raspberry Pi na casa do parente.

Isso NÃO requer mudanças no firewall/roteador na casa do parente. Meu firewall em casa precisa permitir tráfego SSH de entrada (porta 22) do IP deles, mas o IP deles não mudou em 2 anos.

Por meio desse túnel SSH posso usar X2Go para obter uma sessão de desktop gráfica X11 e rodar VNC nessa sessão para me conectar ao laptop com Windows deles, se necessário.

Recomendo verificar ZeroTier - tenho usado por 3-4 anos sem problemas

Talvez eu esteja perdendo alguma coisa, mas imagino que Tailscale seria perfeito para isso.

Túnel VPN baseado em WireGuard entre os nós. Você só precisa instalar o Tailscale e adicioná-lo à sua conta. Nenhuma outra configuração deve ser necessária.

Então, aqui está como faço isso - primeiramente, rodo Linux, tenho DNS apontando para um servidor que executa SSH, e já tive azar tentando rodar meu próprio servidor OpenVPN.

No lado do servidor (exemplo.com), encaminho TCP/23456 pelo roteador para o servidor, tenho um usuário ‘secretuser’ com shell /bin/false (não pode fazer login), e com chaves ed25519 configuradas para login sem senha. A chave pública do secretuser também está em authorized_keys.

No ‘Pi’, tenho as mesmas chaves em /home/pi/.ssh/ e executo isto;

cat << 'EndOfText' > adminaccess.service
[Unit]
Description=Permitir acesso de administrador de [email protected]
After=network-online.target
Before=multi-user.target
DefaultDependencies=no
Wants=network-online.target
[Service]
# Conexão SSH roda como, e usa a chave privada armazenada na pasta home desse usuário (~/.ssh/)
User=pi
# Conexão SSH com encaminhamento de porta, encaminha a porta 22 do cliente através da porta 23456 no servidor
# e cria a porta reversa (-R2288), que deve ser única no servidor.
ExecStart=/usr/bin/ssh -o StrictHostKeyChecking=no -o ServerAliveInterval=60 -o ServerAliveCountMax=3 \
-o ExitOnForwardFailure=yes -N -T -R2288:localhost:22 -i ~/.ssh/ed25519 -p 23456 \
[email protected]
# Aguarda um minuto antes de tentar reconectar se se desconectar, e continua tentando.
RestartSec=60
Restart=always
[Install]
WantedBy=multi-user.target
EndOfText
chmod a+x adminaccess.service
sudo cp adminaccess.service /etc/systemd/system/adminaccess.service
sudo systemctl enable adminaccess.service
sudo systemctl start adminaccess.service

Depois de rodar, reconexões acontecem automaticamente se algo cair. De volta no servidor, na pasta home de um usuário normal, tenho o mesmo conjunto de chaves ed25519 (como remote-ed25519) e isso no arquivo .ssh/config

Host Remote-Pi
Hostname localhost
Port 2288
User pi
ForwardX11 yes
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
IdentityFile ~/.ssh/remote-ed25519

Assim, no servidor, como usuário comum,
ssh Remote-Pi
faz login, posso usar utilitários X, obter uma área de trabalho (usando VNC), e transferir arquivos com scp/rsync.

Pode rodar um Tailscale em Docker que usa Wireguard. É bem fácil de configurar.

Acompanhando este tópico. Isso resolveria muitos dos meus problemas.

Wtf acabei de entrar aqui?

Um Raspberry com OpenMediaVault (OMV) e plugin OpenVPN faz o trabalho

Deveria ser possível com qualquer VPN, mas recomendo Wireguard. Instale no Servidor e no cliente e depois acesse via SSH no cliente quando estiver no local.
Agora você deve conseguir acessar a rede local no cliente.

Ter um Pi conectado na inicialização a um servidor VPN instalado em seu escritório (ou em casa, não sei) deve ser a forma mais direta

Você precisa de um servidor acessível globalmente. Instale um servidor VPN nele. Eu uso Wireguard, é bem simples. WG no Raspberry Pi precisaria de keepalive persistente ativado para manter essa abertura NAT.

Funciona assim: o Raspberry Pi se conecta ao seu servidor e estabelece um túnel. Faça atenção com a subrede - há apenas 3 privadas, se o IP/máscara DHCP do Raspberry Pi sobrepuser à sua VPN predefinida, o roteamento não funcionará. Depois que a VPN estiver ativa, você pode conectar ao seu servidor, depois ao Raspberry Pi, e então aos recursos internos.

Embora eu também vá provavelmente usar WireGuard (ou similar), você poderia ter roteamento complicado se as subredes remotas forem duplicadas em alguns sites etc. Não é insuperável, mas é bom estar ciente. Se souber o que está fazendo, ficará bem.

Uma opção mais alternativa seria algo como MeshCentral. Um agente instalado em um único dispositivo (ou mais) em cada subrede do cliente (pode ser um Pi, pode ser um desktop sempre ligado, se existir) se conectando de volta ao seu servidor permitiria que você se conectasse a qualquer dispositivo na subrede usando o MeshCentralRouter. É basicamente uma ferramenta de encaminhamento de portas como um túnel SSH, mas mais robusta.

Não vi isso mencionado, mas por que não configurar um PC com Windows 10 com algum software de acesso remoto instalado? Você conecta de forma não monitorada pelo software, e então executa quaisquer ferramentas específicas do Windows diretamente nesse computador, em vez de pelo VPN do seu PC.

Já listei minha solução SSH, mas você colocou necessidades mais específicas na sua edição.

Ajudei um amigo que é dono de uma pequena empresa com 2 lojas a configurar o OpenVPN há cerca de 8 anos.

A loja principal rodava o servidor OpenVPN e a outra se conectava a ele.

Após a configuração inicial do OpenVPN, esta é a seção do manual sobre “Expandindo o escopo do VPN para incluir máquinas adicionais na subrede do cliente ou do servidor”

Basicamente, isso transforma a máquina que roda o software VPN em um roteador, permitindo que qualquer máquina na LAN do cliente ou servidor acesse qualquer máquina do outro lado e não apenas os principais dispositivos do cliente/servidor.

Nos últimos anos, o WireGuard tornou-se popular e parece que você também pode fazer o mesmo, mas não fiz muito com ele.

Recentemente, instalei PiVPN em um Pi na minha casa, que também roda PiHole. Agora, quando estou móvel, todas as minhas solicitações DNS passam pelo PiHole. E… meu telefone agora está ‘sempre na’ rede de casa quando não estou.

Resumindo… WireGuard é o vencedor! :+1:t4: