Alguns usuários alugam VPS com Windows relativamente baratos para executar serviços de desktop remoto. O mesmo pode ser feito em Linux sem precisar hospedar seu próprio hardware em um data center ou alugar um servidor dedicado. Alguns precisam de um ambiente gráfico familiar para testes e desenvolvimento ou de um desktop remoto com uma largura de banda ampla para trabalhar a partir de dispositivos móveis. Existem muitas opções de aplicação baseadas no protocolo Remote FrameBuffer (RFB) do sistema Virtual Network Computing (VNC). Neste pequeno artigo, vamos mostrar como configurá-lo em uma máquina virtual com qualquer hipervisor.
Conteúdo:
Escolhendo o servidor VNC
O serviço VNC pode ser integrado ao sistema de virtualização, e o hipervisor o conectará aos dispositivos emulados sem a necessidade de configurações adicionais. Esta opção implica custos operacionais significativos e não é suportada por todos os provedores — mesmo em uma implementação menos exigente, onde uma abstração simplificada (framebuffer) é passada para a máquina virtual em vez de um dispositivo gráfico real. Às vezes, o servidor VNC é vinculado a um servidor X em operação, mas esse método é mais adequado para acesso a máquinas físicas, criando uma série de complicações técnicas em ambientes virtuais. A maneira mais simples é instalar um servidor VNC com um servidor X integrado. Ele não requer a presença de dispositivos físicos (placa de vídeo, teclado e mouse) ou sua emulação por meio do hipervisor, tornando-o adequado para qualquer tipo de VPS.
Instalação e configuração
Precisaremos de uma máquina virtual com Ubuntu Server 18.04 LTS na configuração padrão. Nos repositórios padrão dessa distribuição, existem vários servidores VNC: , , e outros. Nós optamos pelo TigerVNC — um fork atual do TightVNC que não é mais suportado pelo desenvolvedor. A configuração de outros servidores é realizada de maneira semelhante. Também é preciso escolher um ambiente de desktop: na nossa opinião, a opção ideal é o XFCE devido aos requisitos relativamente baixos de recursos computacionais. Aqueles que desejarem podem instalar outro DE ou WM: tudo depende das preferências pessoais, embora a escolha do software influencie diretamente a necessidade de memória RAM e núcleos de processamento.

A instalação do ambiente de desktop com todas as dependências é realizada com o seguinte comando:
sudo apt-get install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utilsEm seguida, é necessário instalar o servidor VNC:
sudo apt-get install tigervnc-standalone-server tigervnc-commonExecutá-lo com privilégios de superusuário não é uma boa ideia. Vamos criar um usuário e um grupo:
sudo adduser vnc 
Vamos adicionar o usuário ao grupo sudo para que ele possa resolver questões relacionadas à administração. Se essa necessidade não existir, este passo pode ser pulado:
sudo gpasswd -a vnc sudoNa próxima etapa, é necessário iniciar o servidor VNC com privilégios do usuário vnc para criar uma senha segura e arquivos de configuração no diretório ~/.vnc/. A senha pode ter de 6 a 8 caracteres (excessos serão cortados). Se necessário, também é definida uma senha somente para visualização, ou seja, sem acesso ao teclado e mouse. Os seguintes comandos são executados em nome do usuário vnc:
su - vnc
vncserver -localhost no 
Por padrão, o protocolo RFB usa a faixa de portas TCP de 5900 a 5906 — essas são as chamadas portas de exibição, cada uma correspondendo a uma tela do servidor X. As portas estão associadas às telas de :0 a :6. A instância do servidor VNC que iniciamos escuta a porta 5901 (tela :1). Outras instâncias podem operar em outras portas com telas :2, :3, etc. Antes de continuar com a configuração, é necessário parar o servidor:
vncserver -kill :1O comando deve gerar uma mensagem semelhante a: «Killing Xtigervnc process ID 18105… success!».
Ao iniciar o TigerVNC, ele executa o script ~/.vnc/xstartup para configurar as opções de configuração. Vamos criar nosso próprio script, salvando antes uma cópia de segurança do existente, se houver:
mv ~/.vnc/xstartup ~/.vnc/xstartup.b
nano ~/.vnc/xstartupA sessão do ambiente de desktop XFCE é iniciada pelo seguinte script xstartup:
#!/bin/bash
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
xrdb $HOME/.Xresources
exec /usr/bin/startxfce4 &O comando xrdb é necessário para que o sistema VNC leia o arquivo .Xresources no diretório home. Lá, o usuário pode definir várias opções para a área de trabalho gráfica: renderização de fontes, cores do terminal, temas do cursor, etc. O script precisa ser tornado executável:
chmod 755 ~/.vnc/xstartupAssim, a configuração do servidor VNC está concluída. Se você executá-lo com o comando vncserver -localhost no (em nome do usuário vnc), será possível conectar-se com a senha definida anteriormente e ver a seguinte tela:

Iniciando o serviço via systemd
A execução manual do servidor VNC não é adequada para uso em produção, portanto, vamos configurar um serviço de sistema. Os comandos são executados em nome do root (usando sudo). Para começar, criamos um novo arquivo de unidade para o nosso servidor:
sudo nano /etc/systemd/system/vncserver@.serviceO símbolo @ no nome permite passar um argumento para a configuração do serviço. No nosso caso, ele especifica a porta de exibição do VNC. O arquivo de unidade é composto por várias seções:
[Unit]
Description=Servidor TigerVNC
After=syslog.target network.target
[Service]
Type=simple
User=vnc
Group=vnc
WorkingDirectory=/home/vnc
PIDFile=/home/vnc/.vnc/%H:%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x960 :%i
ExecStop=/usr/bin/vncserver -kill :%i
[Install]
WantedBy=multi-user.targetEm seguida, é necessário notificar o systemd sobre o novo arquivo e ativá-lo:
sudo systemctl daemon-reload
sudo systemctl enable vncserver@1.serviceO número 1 no nome define o número da tela.
Vamos parar o servidor VNC, iniciá-lo como um serviço e verificar o status:
# от имени пользователя vnc
vncserver -kill :1# с привилегиями суперпользователя
sudo systemctl start vncserver@1
sudo systemctl status vncserver@1Se o serviço estiver funcionando, devemos obter um resultado semelhante.

Conexão à área de trabalho
Nossa configuração não utiliza criptografia, portanto, os pacotes de rede podem ser interceptados por invasores. Além disso, servidores VNC frequentemente , então não devemos abri-los para acesso pela internet. Para uma conexão segura no computador local, é necessário encapsular o tráfego em um túnel SSH e, em seguida, configurar o cliente VNC. No Windows, é possível usar um cliente SSH gráfico (como o PuTTY). Para segurança, o TigerVNC no servidor escuta apenas localhost e não está acessível diretamente de redes públicas:
sudo netstat -ap |more 
Em Linux, FreeBSD, OS X e outros sistemas operacionais semelhantes ao UNIX, o túnel do computador cliente é feito usando a ferramenta ssh (o sshd deve estar em execução no servidor VNC):
ssh -L 5901:127.0.0.1:5901 -C -N -l vnc vnc_server_ipA opção -L vincula a porta 5901 da conexão remota à porta 5901 no localhost. A opção -C ativa a compressão, e -N indica à ferramenta ssh que não há necessidade de executar um comando remoto. A opção -l especifica o login para o acesso remoto.
Após configurar o túnel no computador local, é necessário iniciar o cliente VNC e se conectar ao host 127.0.0.1:5901 (localhost:5901), usando a senha previamente definida para acessar o servidor VNC. Agora podemos interagir com segurança através do túnel criptografado com o ambiente de desktop XFCE no VPS. Na captura de tela do emulador de terminal, o utilitário top foi iniciado para mostrar o insignificante consumo de recursos computacionais pela máquina virtual. Depois disso, tudo dependerá dos aplicativos do usuário.

Instalar e configurar um servidor VNC no Linux pode ser feito praticamente em qualquer VPS. Para isso, não são necessárias configurações caras e que consomem muitos recursos, com emulação de adaptador de vídeo ou a compra de licenças comerciais para software. Além da opção de serviço de sistema que discutimos, existem outras: iniciar em modo demoníaco (através de /etc/rc.local) na inicialização do sistema ou sob demanda através do inetd. Este último é interessante para criar configurações multiusuário. O super servidor da internet iniciará o servidor VNC e conectará o cliente a ele, enquanto o servidor VNC criará uma nova tela e iniciará a sessão. Para autenticação dentro dela, pode-se usar um gerenciador de exibição gráfica (por exemplo, ), e após a desconexão do cliente, a sessão será encerrada e todos os programas que estavam utilizando a tela serão encerrados.
Fonte: habr.com
