Por vezes temos de ligar de forma gráfica a máquinas em redes remotas. Uma das formas mais eficientes de fazer isso é utilizando o protocolo VNC (Virtual Network Computing).
Neste artigo vamos ver como se pode fazer isto de forma segura.
Convém deixar bem claro que o protocolo VNC funciona em texto claro, não é por isso um protocolo muito seguro, e além disto, algumas implementações de servidores de VNC sofrem de problemas de segurança. Por outro lado, o SSH pode ser utilizado para estabelecer tuneis seguros entre duas redes, como já mostrámos aqui. Assim, se usarmos os dois protocolos em conjunção conseguimos ter ligações seguras e bastante rápidas.
Vamos supor que queremos ligar de uma máquina local, a um host remoto. A rede onde este host remoto se insere tem exposto à Internet um servidor SSH, com endereço 'ssh.example.com'. Finalmente o host remoto tem como endereço na rede remota '192.168.35.10' e tem a funcionar, na porta 5900, um servidor de VNC com autenticação VNC por password:
Rede Local | Internet | Rede remota | | +-----+ | | |Maq. | | | |Local+----|----------|--------+ ssh.example.com +-----+ | | | | | +----+-----+ | | | FIREWALL | | | +----+-----+ | | | 192.168.35.0/24 | | \---------+-------+-----+-----+ .... | | | | | | | | 192.168.35.10 (Host remoto)
Para estabelecer o túnel deveremos fazer:
$ ssh -l user -C -N -L 5905:192.168.35.10:5900 ssh.example.com
Onde:
Uma vez estabelecida a ligação basta iniciar o cliente VNC noutra shell. Neste caso usei o cliente do RealVNC, versão opensource:
$ vncviewer localhost::5905
Ou:
$ vncviewer localhost:5
Notar que como redirecionamos a porta remota para a porta 5905 local, podemos facilmente estar ligados em simultâneo a vários hosts remotos, sem haver colisão de portas.
É claro que o padrão de utilização descrito atrás é muito comum. Por isso este padrão está também embutido dentro do próprio cliente de VNC. Para estabelecermos o túnel e assim que este esteja em cima abrir a ligação VNC usando esse mesmo túnel basta fazer:
$ vncviewer -via user@ssh.example.com 192.168.35.10
Se quisermos usar outras opções do ssh, entãotemos de definir à priori a variável de ambiente VNC_VIA_CMD, neste caso é mais prático fazer um script:
#!/bin/sh export VNC_VIA_CMD='/usr/bin/ssh -l user -C -f -L "$L":"$H":"$R" "$G" sleep 20' vncviewer -via ssh.example.com 192.168.35.10
A grande vantagem desta solução consiste no facto de pudermos automatizar grande parte do processo. Por exemplo:
[Desktop Entry] Exec[$e]=~/bin/example_com_10.sh Icon=exec Name=Ligar example.com StartupNotify=true Terminal=false Type=Application
E grava-lo no desktop.
Para ligar ao host remoto basta agora dar um duplo clic no icon 'Ligar example.com'.