# VDI

Projetos e ideias relacionadas a Infraestrutura de Desktop Virtual

# VDI Remoto com Raspberry Pi e VPN Forcepoint

<p class="callout info">Versão do Hardware tratado no documento: Raspberry Pi 3B+  
Versão do Software tratado no documento: Raspbian GNU/Linux 10 (buster)</p>

### 1.0) Introdução

Diante da perspectiva crescente de trabalho remoto e de acesso a poder de computação, dados e serviços independente do local, iniciamos experimentos para proporcionar estes recursos através de técnicas de VDI ( Infraestrutura de Desktop Virtual) utilizando o Raspberry Pi e Firewall Forcepoint de forma a proporcionar um acesso barato e livre aos recursos internos da instituição.

Através da solução abaixo, podemos criar um acesso a uma estação Windows remota e segura utilizando apenas um Raspberry Pi e alguns softwares Livres pré configurados.

<p class="callout warning">O acesso remoto a uma estação Windows exigirá a aquisição de licenciamento para tal com a Microsoft.</p>

<p class="callout warning">Os experimentos demonstrados abaixo fazem referencia a conexão de VDI com estação da Reitoria do IFSP e deve ser adaptada para outros ambientes.</p>

#### 2.0) Implantação em RP3B+ (Raspberry Pi 3B+) com interface gráfica pré instalada

Os procedimentos abaixo permitem a implantação do serviço em um RP3B+ com sistema operacional configurado **com** interface gráfica em sua instalação.

<p class="callout info">Esta solução possui como pré-requisito a implantação da VPN C2S com a reitoria, os procedimentos para tal podem ser encontrados [AQUI](https://manuais.ifsp.edu.br/books/forcepoint-firewall/page/cliente-vpn-c2s-com-strongswan-no-linux).</p>

##### 2.1) Instalação dos pacotes necessários

Instale o software necessário para realizar a conexão remota com Windows via protocolo RDP com os comandos abaixo:

```shell
sudo apt-get update && sudo apt-get install rdesktop
```

##### 2.2) Configuração e inicialização do serviço

Agora vamos criar um serviço do SystemD que ficará encarregado de verificar se a conexão VPN já está pronto para utilização e iniciará o serviço de conexão Remote Desktop:

Crie e edite o arquivo "**/lib/systemd/system/remote.service"**:

```shell
sudo nano /lib/systemd/system/remote.service
```

Adicione o conteúdo a seguir no arquivo:

```shell
[Unit]
Description=Remote Desktop
Requires=network-online.target

[Service]
Type=idle
Environment=DISPLAY=:0
Environment=XAUTHORITY=/home/pi/.Xauthority
ExecStart=/usr/bin/rdesktop -k pt-br -n <HOSTNAME-DO-RASPBERRY-PI> -g 100% -z -r sound:local -x 0x80 -u <USUARIO-REMOTO> -P -f <IP-DO-SERVIDOR-DE-DESTINO>
ExecStartPre=/bin/sh -c 'until ping -c1 <IP-DO-SERVIDOR-DE-DESTINO>; do sleep 1; done;'
Restart=always
RestartSec=3

[Install]
WantedBy=graphical.target
```

<p class="callout info">Não se esqueça de alterar os parâmetros para seu ambiente.</p>

O serviço acima fará todas as checagens necessárias e também irá reiniciar o terminal remoto caso ele seja fechado pelo cliente.

Agora temos que instalar o serviço e inicializa-lo:

Reload das configurações do serviço:

```shell
sudo systemctl daemon-reload
```

Instalação do serviço:

```shell
sudo systemctl enable remote.service
```

Iniciar o serviço:

```shell
systemctl start remote.service
```

<p class="callout success">DICA: Você pode verificar o status do serviço trocando o "start" do comando anterior por "status"</p>

Está feito! ao reiniciar o equipamento, se estiver tudo certo, o sistema irá inicializar e logo em seguida realizar a conexão RDP com a estação remota!

#### 3.0) Implantação em RP3B+ (Raspberry Pi 3B+) sem interface gráfica pré instalada

<p class="callout info">Fonte: [SITE](https://hsavior.eu/2020/03/20/windows-10-pro-terminal-server-raspberry-pi-thin-client/)</p>

<p class="callout danger">Até o presente momento esta solução não foi validada completamente pela nossa equipe.</p>

Os procedimentos abaixo permitem a implantação do serviço em um RP3B+ com sistema operacional configurado **sem** interface gráfica em sua instalação.

##### 3.1) Instalação dos pacotes necessários

Instale o software necessário para realizar a conexão remota com Windows via protocolo RDP com os comandos abaixo:

```shell
sudo apt-get update && sudo apt-get install xinit xserver-xorg xserver-xorg-video-fbdev rdesktop
```

##### 3.2) Configuração e inicialização do serviço

Crie o arquivo **".xinitrc"** que irá servir para executarmos o Remote Desktop automaticamente, uma vez que o ambiente gráfico inicie:

```shell
nano /home/pi/.xinitrc
```

Adicione a seguinte linha neste arquivo e salve (Substitua o IP com o o endereço IP do seu Desktop, lembre de configura-lo com um IP Fixo para que você não tenha que ficar mudando isso no futuro):

```shell
exec /usr/bin/rdesktop -k pt-br -n <HOSTNAME-DO-RASPBERRY-PI> -g <RESOLUCAO-DESEJADA> -z -r sound:local -x 1 -u <USUARIO-REMOTO> -f <IP-DO-SERVIDOR-DE-DESTINO>
```

Agora vamos criar um serviço do SystemD que ficará encarregado de verificar se a conexão VPN já está pronto para utilização e iniciará o serviço de conexão Remote Desktop:

Crie e edite o arquivo "**/lib/systemd/system/remote.service"**:

```shell
sudo nano /lib/systemd/system/remote.service
```

Adicione o conteúdo a seguir no arquivo:

```shell
[Unit]
Description=Remote Desktop
Requires=network-online.target

[Service]
Type=idle
Environment=DISPLAY=:0
Environment=XAUTHORITY=/home/pi/.Xauthority
ExecStart=xinit /home/pi/.xinitrc
ExecStartPre=/bin/sh -c 'until ping -c1 <IP-DO-SERVIDOR-DE-DESTINO>; do sleep 1; done;'
Restart=always
RestartSec=3
KillMode=process
TimeoutSec=infinity

[Install]
WantedBy=graphical.target​
```

<p class="callout info">Não se esqueça de alterar os parâmetros para seu ambiente.</p>

O serviço acima fará todas as checagens necessárias e também irá reiniciar o terminal remoto caso ele seja fechado pelo cliente.

Agora temos que instalar o serviço e inicializa-lo:

Reload das configurações do serviço:

```shell
sudo systemctl daemon-reload
```

Instalação do serviço:

```shell
sudo systemctl enable remote.service
```

Iniciar o serviço:

```shell
systemctl start remote.service
```

<p class="callout success">DICA: Você pode verificar o status do serviço trocando o "start" do comando anterior por "status"</p>

Está feito! ao reiniciar o equipamento, se estiver tudo certo, o sistema irá inicializar e logo em seguida realizar a conexão RDP com a estação remota!

#### 4.0) Aumento do tempo de espera por login na estação remota

<p class="callout info">Fonte: [SITE](https://hsavior.eu/2020/03/20/windows-10-pro-terminal-server-raspberry-pi-thin-client/)</p>

Para que a tela de login fique esperando as credenciais por mais tempo (normalmente 1 minuto), você pode criar uma chave no registro do Windows.

Crie uma chave DWORD chamada **LogonTimeout** no container:

**Computer\\HKEY\_LOCAL\_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp**

Coloque o valor da chave em segundos (3600 segundos = 1 hora):

[![image-1601583746008.png](https://manuais.ifsp.edu.br/uploads/images/gallery/2020-10/scaled-1680-/image-1601583746008.png)](https://manuais.ifsp.edu.br/uploads/images/gallery/2020-10/image-1601583746008.png)

Dessa forma quando o Raspberry Pi iniciar e a sessão RDP começar ele aguardará por 1 hora até que você faça o login.

Se você não logar em tempo, o rdesktop vai fechar, reinicie o Raspberry Pi ou o serviço remote.service:

```shell
sudo systemctl restart remote.service
```

#### 5.0) Extras

##### 5.1) Escala de tela

Se o seu Raspberry Pi não estiver preenchendo a tela inteira quando ligado a um monitor, exibindo barras pretas nas laterais, execute a seguinte alteração:

Altere o arquivo de configuração padrão do RP:

```shell
sudo nano /boot/config.txt
```

Em seguida descomente a linha abaixo e salve as alterações:

```shell
...
# uncomment this if your display has a black border of unused pixels visible
# and your display can output without overscan
disable_overscan=1
...
```

Reinicie o equipamento e a tela deve agora estar com a cobertura correta.

##### 5.2) Login sem senha no RDP do Windows Server

Para que o login sem senha funcione no Windows server, de forma a apresentar a tela de login somente após a conexão RDP, execute as seguinte alteração no sistema:

 Você deve **desabilitar** o "Network Level Authentication (NLA)" logo após ativar a permissão para acesso remoto via RDP:

[![image-1602092599567.png](https://manuais.ifsp.edu.br/uploads/images/gallery/2020-10/scaled-1680-/image-1602092599567.png)](https://manuais.ifsp.edu.br/uploads/images/gallery/2020-10/image-1602092599567.png)

##### 5.3) Raspberry Pi reiniciando sem motivo

O superaquecimento pode ser uma das causas de reboot aleatório do equipamento, assim como uma fonte de energia insuficiente e/ou equipamentos que demandam muita energia ligados ao USB ou GPIO do equipamento, tais como HDs externos, etc.

Para verificar que houve throttling (redução de frequência do processador devido a temperatura), execute:

```shell
sudo vcgencmd get_throttled
```

Se o resultado for **0x0** está tudo bem neste quesito, caso não seja é melhor verificar a refrigeração do equipamento.