Assumindo por simplicidade que você tem apenas um cliente (mas que pode ter IPs arbitrários), que o servidor VNC corre atrás de um firewall onde você não pode abrir portas, mas o cliente não tem tais problemas, uma solução seria coloque este comando em um script on-boot no servidor:
while sleep 100; do ssh vnc_user@$client -R 5900:127.0.0.1:5900; done
Isso abre um túnel reverso do servidor para o cliente. Isso é possível por trás de um firewall.
Assegure-se de ter criado uma chave ssh sem senha no servidor ( ssh-keygen
e pressione o botão de retorno algumas vezes) para que você possa colocar isso em um script de inicialização.
Agora, para fazer isso a partir de uma "conexão arbitrária à Internet", simplesmente obtenha uma conta gratuita em dyndns.org e troque $ client no comando acima para o endereço dyndns (por exemplo, myvpnclient.dyndsn.org). No cliente, execute o sshd e crie um usuário com muito pouco acesso:
sudo useradd -m -s /bin/false vnc_user
Copie o servidor de arquivos: ~ / .ssh / id_rsa.pub no cliente: ~ vnc_user / .ssh / authorized_keys para que o servidor vnc tenha acesso ssh ao (s) cliente (s) vnc. (O / bin / false garante que o servidor vnc não possa executar comandos no cliente, apenas abra uma porta; se você não confiar no servidor, poderá fazer mais hardening em sshd_config.)
Agora, desde que você execute um daemon dyndns no cliente (ou atualize seu endereço IP manualmente em dyndns.org), você poderá se conectar ao servidor. Se o seu cliente alterar o endereço IP, a conexão ssh deverá ser interrompida e o servidor tentará restabelecer a conexão.
(Se o cliente também estiver atrás de um firewall, acho que ambos cliente e servidor poderiam abrir túneis para uma terceira máquina que não tem problemas de firewall, mas em qualquer caso você precisa de pelo menos um servidor que possa rodar sshd contra a Internet aberta .)