Tutorial

Como-instalar-e-configurar-o VNC no Ubuntu 20.04

UbuntuMiscellaneousApplicationsUbuntu 20.04

Introdução

O Virtual Network Computing, ou VNC, é um sistema de conexão que permite que você use seu teclado e mouse para interagir com um ambiente gráfico da área de trabalho em um servidor remoto. Isso facilita o gerenciamento de arquivos, software e configurações em um servidor remoto para os usuários que ainda não se sentem confortáveis com a linha de comando.

Neste guia, você irá configurar um servidor VNC com o TightVNC em um servidor Ubuntu 20.04 e conectar-se a ele de forma segura através de um túnel SSH. Em seguida, você usará um programa cliente VNC em sua máquina local para interagir com seu servidor através de um ambiente gráfico de desktop.

Pré-requisitos

Para completar este tutorial, será necessário:

Passo 1 — Instalando o Ambiente da Área de Trabalho e o Servidor VNC

Por padrão, um servidor Ubuntu 20.04 não vem com um ambiente gráfico de desktop ou um servidor VNC instalado, então começaremos instalando-os.

Você tem muitas opções quando se trata de qual servidor VNC e qual ambiente de desktop escolher. Neste tutorial você ira instalar os pacotes mais recentes do ambiente de desktop Xfce e do TightVNC disponíveis no repositório oficial do Ubuntu. Tanto o Xfce quanto o TightVNC são conhecidos por serem leves e rápidos, o que ajudará a garantir que a conexão VNC será leve e estável, mesmo em conexões de Internet mais lentas.

Após se conectar ao seu servidor com o SSH, atualize sua lista de pacotes:

  • sudo apt update

Agora, instale o Xfce juntamente com o pacote xfce4-goodies, que contém algumas melhorias para o ambiente desktop:

  • sudo apt install xfce4 xfce4-goodies

Durante a instalação, você pode ser solicitado a escolher um gerenciador de tela padrão para o Xfce. Um gerenciador de tela é um programa que permite que você selecione e faça login em um ambiente de desktop através de uma interface gráfica. Você usará o Xfce apenas quando se conectar com um cliente VNC, e nessas sessões do Xfce você já estará logado como o seu usuário não-root do Ubuntu. Portanto, para os fins deste tutorial, sua escolha do gerenciador de tela não é pertinente. Selecione qualquer um e pressione ENTER.

Uma vez que a instalação tiver terminada, instale o servidor do TightVNC:

  • sudo apt install tightvncserver

A seguir, execute o comando vncserver para definir uma senha de acesso VNC, criar os arquivos de configuração iniciais e iniciar uma instância de servidor VNC.

  • vncserver

Será solicitado que você digite e verifique uma senha para acessar sua máquina remotamente:

Output
You will require a password to access your desktops. Password: Verify:

A senha deve ter entre seis e oito caracteres. Senhas com mais de 8 caracteres serão truncadas automaticamente.

Depois de verificar a senha, você terá a opção de criar uma senha somente leitura. Usuários que fizerem login com a senha somente para exibição não poderão controlar a instância VNC com seus respectivos mouses ou teclados. Esta é uma opção útil se quiser demonstrar algo para outras pessoas utilizando seu servidor VNC, mas isso não é necessário.

Então, o processo cria os arquivos de configuração padrão necessários e as informações de conexão para o servidor. Além disso, ele lança uma instância de servidor padrão na porta 5901. Essa porta é chamada de porta de exibição e é referida pelo VNC como :1. O VNC pode iniciar várias instâncias em outras porta de exibição, com :2 referindo-se à porta 5902, :3 referindo-se à 5903 e assim por diante:

Output
Would you like to enter a view-only password (y/n)? n xauth: file /home/sammy/.Xauthority does not exist New 'X' desktop is your_hostname:1 Creating default startup script /home/sammy/.vnc/xstartup Starting applications specified in /home/sammy/.vnc/xstartup Log file is /home/sammy/.vnc/your_hostname:1.log

Observe que se quiser alterar sua senha ou adicionar uma senha apenas para visualização, você pode fazer isso com o comando vncpasswd:

  • vncpasswd

Neste ponto, o servidor VNC está instalado e em execução. Agora, vamos configurá-lo para iniciar o Xfce e nos dar acesso ao servidor através de uma interface gráfica.

Passo 2 — Configurando o Servidor VNC

O servidor VNC precisa saber quais comandos executar quando ele iniciar. Especificamente, o VNC precisa saber a qual ambiente gráfico de desktop ele deve se conectar.

Os comandos que o servidor VNC executa na inicialização estão localizados em um arquivo de configuração chamado xstartup na pasta .vnc sob o seu diretório home. O script de inicialização foi criado quando você executou o comando vncserver no passo anterior, mas vamos criar o nosso próprio script para iniciar o desktop Xfce.

Como você vai mudar a forma como o servidor VNC está configurado, primeiramente, interrompa a instância do servidor VNC que estiver em execução na porta 5901 com o seguinte comando:

  • vncserver -kill :1

A saída será semelhante a esta, embora você vá ver um PID diferente:

Output
Killing Xtightvnc process ID 17648

Antes de modificar o arquivo xstartup, faça um back-up do original:

  • mv ~/.vnc/xstartup ~/.vnc/xstartup.bak

Agora, crie um novo arquivo xstartup e abra-o em um editor de texto, como o nano:

  • nano ~/.vnc/xstartup

A seguir, adicione as seguintes linhas ao arquivo:

~/.vnc/xstartup
#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &

A primeira linha é um shebang. Em arquivos executáveis de texto simples em plataformas *nix, um shebang diz ao sistema para qual interpretador passar esse arquivo para ser executado. Neste caso, você está passando o arquivo para o interpretador Bash. Isso permitirá que cada linha sucessiva seja executada como comandos, em ordem.

O primeiro comando no arquivo, xrdb $HOME/.Xresources, diz ao framework GUI do VNC para ler o usuário do servidor .Xresources arquivo O .Xresources é onde um usuário pode fazer alterações em certas configurações do ambiente de trabalho gráfico, como as cores de terminal, temas de cursor e rendering de fontes. O segundo comando diz ao servidor para iniciar o Xfce. Sempre que você iniciar ou reiniciar o servidor VNC, esses comandos serão executados automaticamente.

Salve e feche o arquivo após adicionar essas linhas. Se usou o nano, faça isso pressionando as teclas CTRL+X, Y e depois ENTER.

Para garantir que o servidor VNC será capaz de usar esse novo arquivo de inicialização corretamente, precisaremos torná-lo executável.

  • chmod +x ~/.vnc/xstartup

Em seguida, reinicie o servidor VNC:

  • vncserver -localhost

Observe que desta vez, o comando inclui a opção -localhost, que vincula o servidor VNC à interface loopback do seu servidor. Isso fará com que o VNC permita apenas conexões que se originam do servidor onde ele está instalado.

No próximo passo, você irá estabelecer um túnel SSH entre sua máquina local e seu servidor, essencialmente enganando o VNC a pensar que a conexão da sua máquina local se originou no seu servidor. Essa estratégia adicionará uma camada de segurança extra em torno do VNC, pois os únicos usuários que poderão acessá-lo são os que já têm acesso SSH ao seu servidor.

Você verá um resultado parecido com este:

Output
New 'X' desktop is your_hostname:1 Starting applications specified in /home/sammy/.vnc/xstartup Log file is /home/sammy/.vnc/your_hostname:1.log

Com a configuração pronta, tudo está pronto para que você se conecte ao servidor VNC a partir da sua máquina local.

Passo 3 — Conectando-se ao Desktop do VNC com Segurança

O VNC propriamente dito não utiliza protocolos de segurança ao se conectar. Para se conectar com segurança ao seu servidor, você estabelecerá um túnel SSH e, em seguida, dirá ao seu cliente para se conectar usando esse túnel, em vez de fazer uma conexão direta.

Crie uma conexão SSH no seu computador local; ela encaminhará a conexão localhost para o VNC. É possível fazer isto através do terminal no Linux ou no macOS com o seguinte comando ssh:

  • ssh -L 59000:localhost:5901 -C -N -l sammy your_server_ip

Aqui está o que as opções deste comando ssh significam:

  • -L 59000:localhost:5901: a flag -L especifica que a porta dada no computador local (59000) será encaminhada para o host e porta no servidor de destino (localhost:5901, significando a porta 5901 no servidor de destino, definido como your_server_ip). Observe que a porta local que você especificar é algo arbitrário; desde que a porta ainda não esteja ligada a outro serviço, você pode usá-la como a porta de encaminhamento para o seu túnel.
  • -C: esta flag habilita a compressão que pode ajudar a minimizar o consumo de recursos e a acelerar as coisas.
  • -N: esta opção informa ao ssh que você não deseja executar nenhum comando remoto. Esta configuração é útil quando você só deseja encaminhar portas.
  • -l sammy your_server_ip: a flag -l lhe permite especificar o usuário com o qual você deseja fazer login assim que se conectar ao servidor. Certifique-se de substituir sammy e your_server_ip pelo nome do seu usuário não-root e o endereço IP do seu servidor.

Nota: este comando estabelece um túnel SSH que encaminha as informações da porta 5901 no seu servidor VNC para a porta 59000 na sua máquina local através da porta 22 em cada máquina, a porta padrão para o SSH. Supondo que você tenha seguido o pré-requisito de Initial Server Setup guide for Ubuntu 20.04, você terá adicionado uma regra UFW para permitir conexões ao seu servidor através do OpenSSH.

Isso é mais seguro do que simplesmente abrir o firewall do seu servidor para permitir conexões na porta 5901, pois isso permitiria que qualquer um acessasse seu servidor através do VNC. Ao se conectar através de um túnel SSH, você está limitando o acesso VNC às máquinas que já têm acesso SSH ao servidor.

Se estiver usando o PuTTY para se conectar ao seu servidor, você pode criar um túnel SSH, clicando com o botão direito do mouse na barra superior da janela do terminal, e, em seguida, clicando na opção Change Settings…:

Right-click on top bar to reveal Change Settings option

Encontre a ramificação Connection no menu em árvore, no lado esquerdo da janela Configuration do PuTTY. Expanda a ramificação SSH e clique em Tunnels. Na tela Options controlling SSH port forwarding, digite 59000 como Source Port e localhost:5901 como Destination desta forma:

Example PuTTY SSH tunnel configuration

Em seguida, clique no botão Add e, em seguida, no botão Apply para implementar o túnel.

Assim que o túnel estiver em execução, utilize um cliente VNC para se conectar a localhost:59000. Será solicitado que autentique usando a senha definida no Passo 1.

Uma vez que estiver conectado, verá o área de trabalho padrão Xfce. Ela deve se parecer com isto:

VNC connection to Ubuntu 20.04 server with the Xfce desktop environment

É possível acessar arquivos em seu diretório inicial com o gerenciador de arquivos ou da linha de comando, como visto aqui:

File Manager via VNC connection to Ubuntu 20.04

Pressione CTRL+C no seu terminal local para parar o túnel SSH e voltar ao seu prompt. Isto também irá desconectar sua sessão VNC.

Agora, você pode configurar seu servidor VNC para ser executado como um serviço systemd.

Passo 4 — Executando o VNC como um Serviço de Sistema

Ao configurar o servidor VNC para ser executado como um serviço systemd que você pode iniciá-lo, pará-lo e reiniciá-lo conforme necessário, como qualquer outro serviço. Você também pode usar os comandos de gerenciamento do systemd para garantir que o VNC inicie quando seu servidor for inicializado.

Primeiro, crie um novo arquivo de unidade systemd chamado /etc/systemd/vncserver@.service:

  • sudo nano /etc/systemd/system/vncserver@.service

O símbolo @ no final do nome nos permitirá passar em um argumento que poderemos usar na configuração do serviço. Vamos usar isto para especificar a porta de exibição do VNC que queremos usar quando gerenciarmos o serviço.

Adicione as linhas a seguir ao arquivo. Certifique-se de alterar o valor do Usuário, Grupo, WorkingDirectory e o nome de usuário no valor do PIDFILE para corresponder ao seu nome de usuário:

/etc/systemd/system/vncserver@.service
[Unit]
Description=Start TightVNC server at startup
After=syslog.target network.target

[Service]
Type=forking
User=sammy
Group=sammy
WorkingDirectory=/home/sammy

PIDFile=/home/sammy/.vnc/%H:%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 -localhost :%i
ExecStop=/usr/bin/vncserver -kill :%i

[Install]
WantedBy=multi-user.target

O comando ExecStartPre interrompe o VNC , se ele já estiver em execução. O comando ExecStart inicia o VNC e define a profundidade de cor para 24 bits com uma resolução de 1280x800. Também é possível modificar essas opções de inicialização para atender suas necessidades. Também, note que o comando ExecStart novamente inclui a opção -localhost.

Salve e feche o arquivo.

A seguir, faça com que o sistema saiba do novo arquivo de unidade.

  • sudo systemctl daemon-reload

Habilite o arquivo de unidade.

  • sudo systemctl enable vncserver@1.service

O 1 seguindo o símbolo @ significa em qual número de tela o serviço deve aparecer, neste caso, o padrão :1, como foi discutido no Passo 2.

Interrompa a instância atual do servidor VNC se ela ainda estiver em execução.

  • vncserver -kill :1

Então, inicie-a como você iniciaria qualquer outro serviço systemd.

  • sudo systemctl start vncserver@1

É possível verificar se ele iniciou com este comando:

  • sudo systemctl status vncserver@1

Se ele iniciou corretamente, a saída deverá se parecer com isto:

Output
● vncserver@1.service - Start TightVNC server at startup Loaded: loaded (/etc/systemd/system/vncserver@.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2020-05-07 17:23:50 UTC; 6s ago Process: 39768 ExecStartPre=/usr/bin/vncserver -kill :1 > /dev/null 2>&1 (code=exited, status=2) Process: 39772 ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 :1 (code=exited, status=0/SUCCESS) Main PID: 39795 (Xtightvnc) ...

Seu servidor VNC agora está pronto para usar sempre que seu servidor inicializar, e você pode gerenciá-lo com comandos systemctl como qualquer outro serviço systemd.

No entanto, não haverá qualquer diferença no lado do cliente. Para reconectar, inicie seu túnel SSH novamente.

  • ssh -L 59000:localhost:5901 -C -N -l sammy your_server_ip

A seguir, faça uma nova conexão usando seu software de cliente VNC com localhost:5901 para conectar-se ao seu servidor.

Conclusão

Você tem agora um servidor VNC seguro funcionando em seu servidor Ubuntu 20.04. Agora, você será capaz de gerenciar seus arquivos, softwares e configurações com uma interface gráfica conhecida e fácil de usar, e será capaz de executar remotamente softwares gráficos como navegadores Web.

Creative Commons License