Criando um servidor de virtualização super leve com Debian 10 e Virtualbox WEB

Com VirtualBox é possivel executar diversos sistemas operacionais (Windows, Linux, UNIX, BSD) simultaneamente no mesmo hardware, que são chamados de máquinas virtuais. Uma das características é o mascaramento dos recursos físicos (incluindo processadores, quantidade de memória, interfaces de rede), o que permite diminuir a administração de drivers nas máquinas virtuais, e transferir uma máquina virtual entre servidores físicos diferentes.

Existem várias ferramentas de virtualização disponíveis.

Microsoft Virtual Server 2005 R2 – disponível para plataforma x86 e x86_64 bits. Suporte: Somente Windows.
Qemu – ferramenta de virtualização de código aberto disponível para windows, mac e Linux.
Vmware – Disponível para Windows e Linux.
VirtualBox – Aplicativo de código aberto disponível para Windows, Mac, Linux e Solaris.
Xen – Suporta Windows, bem como distribuições Linux.

O VirtualBox inicialmente foi lançado sob licença proprietária, mas mais tarde (2007) a Oracle Corporation começou a lançá-lo sob GNU General Public License. Escrito completamente em C, C ++ e Assembly Language está disponível para Windows, OS X, Linux e Solaris.

Recomendo já baixar a ISO nonfree: https://cdimage.debian.org/cdimage/unofficial/non-free/cd-including-firmware/

Adicione o repositório do virtualbox

Debian 10 Buster

# apt install wget vim apt-transport-https gnupg
# echo 'deb [arch=amd64] http://download.virtualbox.org/virtualbox/debian buster contrib' > /etc/apt/sources.list.d/virtualbox.list
# wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | apt-key add -
# wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | apt-key add -

Vamos a instalação, a versão 5.2 (nesta data 08/10/19) ainda não tem uma versão (Oficial) 6 compatível com o phpVirtualbox. Mas se você é expert existe alguns forks compatível com 6.0.

Certifique-se que seu repositório esteja usando os repositórios nonfree e contrib.

# vim /etc/apt/sources.list

Ao final de cada linha verifique se consta: nonfree e contrib, se não tiver adicione, ficando assim:

deb http://deb.debian.org/debian/ buster main contrib non-free
deb-src http://deb.debian.org/debian/ buster main contrib non-free

deb http://security.debian.org/debian-security buster/updates main contrib non-free
deb-src http://security.debian.org/debian-security buster/updates main contrib non-free

# buster-updates, previously known as 'volatile'
deb http://deb.debian.org/debian/ buster-updates main contrib non-free
deb-src http://deb.debian.org/debian/ buster-updates main contrib non-free

Atualize o repositório

# apt update
# apt install firmware-linux firmware-linux-free firmware-linux-nonfree

Já vamos aproveitar para otimizar a parametrização do uso da memoria SWAP do nosso debian. Ajustaremos o swappiness para 10, assim o SWAP só começará a ser usado quando a memória RAM estiver 90% cheia.

# echo "# Reduz o uso de SWAP" >> /etc/sysctl.conf
# echo "vm.swappiness=10" >> /etc/sysctl.conf
# echo "# Melhora a gestão de cache" >> /etc/sysctl.conf
# echo "vm.vfs_cache_pressure=50" >> /etc/sysctl.conf
# echo "vm.dirty_background_ratio = 5" >> /etc/sysctl.conf

Reinicia a máquina para carregar os novos módulos do kernel.

# apt install virtualbox-5.2
# reboot

Verifique se swappiness retorna o valor 10

# cat /proc/sys/vm/swappiness

Faça download dos pacotes extras: https://www.virtualbox.org/wiki/Download_Old_Builds_5_2 como instalei a versão 5.2 irei baixar a versão correspondente: (If you’re looking for the latest VirtualBox 5.2 packages, see VirtualBox 5.2 builds.)

# su -
# cd /tmp/ 
# wget https://download.virtualbox.org/virtualbox/5.2.44/Oracle_VM_VirtualBox_Extension_Pack-5.2.44.vbox-extpack

Instale os pacotes extras

# VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-5.2.44.vbox-extpack


Responta Yes (y)

Vamos executá-lo como o nosso usuário vbox, porque ele não precisa acessar o resto do seu sistema.

# useradd -d /home/vbox -m -g vboxusers -s /bin/bash vbox

Defina uma senha para seu usuario vbox

# passwd vbox

Diga ao seu sistema qual usuário vai executar o VirtualBox.

# echo 'VBOXWEB_USER=vbox' > /etc/default/virtualbox 
# echo 'VBOXWEB_HOST=127.0.0.1' >> /etc/default/virtualbox

Faça com que o vboxweb-service inicie no boot. Como dito acima nosso usuário não precisa ter acesso total ao sistema, entao vamos instalar o sudo e roda-lo via sudo.

# apt install sudo

Adicione no /etc/rc.local o comando para iniciar junto com o boot.

# vim /etc/rc.local

Adicione

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Solução para inicialização automatica:
# use o comando la listar as VMs criadas
# sudo -u vbox VBoxManage list vms
# Colete as ID
# "Debian" {d288884d-a3d4-4903-b84e-5c6039af13b5}
# Pegue o "ID" da VM e use o Comando a baixo descomentando a linha:
# Adicione um sleep para aguardar 30seg para dar tempo do modulo do kernel ter tempo de iniciar
# sleep 30
# sudo -u vbox VBoxHeadless -s d288884d-a3d4-4903-b84e-5c6039af13b5 &


exit 0

Alterare as permissões:

# chmod +x /etc/rc.local
# ln -s /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service

Vamos instalar o serviço web + php

# apt install apache2 libapache2-mod-php\
 php-cli php-bcmath php-gmp php-mbstring php-zip php-curl\
 php php-common php-soap php-gd unzip php-pear php-mysql php-xml php-soap

Por segurança recomendo remover a assinatura do servidor, para isso:

# sed -i 's/ServerTokens OS/ServerTokens Prod/' /etc/apache2/conf-available/security.conf
# sed -i 's/ServerSignature On/ServerSignature Off/' /etc/apache2/conf-available/security.conf

Vamos também configurar nosso domínio virtual para acessar o servidor via domínio (ex vbox.remontti.com.br) e restringir ele apenas para nossos IP de gerencia.

# vim /etc/apache2/sites-available/000-default.conf

Faça as devidas alterações, não esqueça de alterar em Require ip para os IPs que você vai autorizar as conexões.

<virtualhost *:80>
        Protocols h2 http/1.1
        ServerName vm.remontti.com.br
        ServerAdmin noc@remontti.com.br
        ErrorDocument 403 http://www.remontti.com.br/
 
        DocumentRoot /var/www/html
 
        <Directory /var/www/html/>
                Options FollowSymLinks
                AllowOverride All
                Require ip 127.0.0.1 ::1 192.168.0.0/16 172.16.0.0/12 100.64.0.0/10 10.0.0.0/8 250.0.0.0/22 2000:000::/32
        </Directory>
 
        LogLevel warn 
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</virtualhost>

Habilite os módulos

# a2enmod http2
# systemctl restart apache2

Que tal configurar um certificado grátis com let’s encrypt?

# apt install apache2 apache2-utils letsencrypt python-certbot-apache
# systemctl stop apache2
# letsencrypt --authenticator standalone --installer apache -d vm.remontti.com.br

Agora já é possível acessar “vm.remontti.com.br” com HTTPS, faça um teste se seu domínio esta respondendo corretamente.

Para evitar que o certificado expire faça um script e colocando ele no cron para que o mesmo renove automaticamente.

# vim  /etc/renovassl.sh

Adicione

#!/bin/bash
/usr/bin/systemctl stop apache2
/usr/bin/certbot -q renew
/usr/bin/systemctl start apache2

De permissão de execução:

# chmod +x /etc//renovassl.sh

Adicione ao cron e restarte o cron

# echo '00 00   * * *   root    /etc/renovassl.sh' >> /etc/crontab
# systemctl restart cron

Vamos configurar o projeto phpvirtualbox, dentro do diretório padrão do apache.

# cd /var/www/
# rm -rf /var/www/html/
# wget https://github.com/phpvirtualbox/phpvirtualbox/archive/5.2-1.tar.gz  -O phpvirtualbox-5.2-1.tar.gz
# tar -vxzf phpvirtualbox-5.2-1.tar.gz
# mv phpvirtualbox-5.2-1 html
# rm phpvirtualbox-5.2-1.tar.gz
# chown vbox:vboxusers html  -R
# cd /var/www/html/
# cp config.php-example config.php
# vim config.php
 // ... //
var $username = 'vbox';
var $password = 'pass';
// ... //
var $language = 'pt_br';
var $vrdeports = '9000-9100';
var $vrdeaddress = '0.0.0.0';
// ... //
var $enableAdvancedConfig = true; 

É altamente recomendado que você tenha um firewall em cima da range de portas 9000 a 9100, pois é onde será possível fazer acesso remoto, e recomendo que depois da instalação sempre desative o acesso remoto a VM, segue um exemplo de firewall, no exemplo já irei proteger tb a porta do SSH, lembre-se de deixar seu ip na ACL de permissões.

# apt install nftables
# systemctl enable nftables

Modelo fechando as portas do SSH [22] e a range de acesso remoto [9000-9100], você pode personalizar de acordo com sua instalação.

#!/usr/sbin/nft -f
  
flush ruleset

table inet filter {
    # IPv4 que terao acesso 
    set acesso-total4 {
        type ipv4_addr
        flags interval
        elements = { 200.200.200.16/28, 200.200.200.0/28}
    }
    # IPv6 que terao acesso 
    set acesso-total6 {
        type ipv6_addr
        flags interval
        elements = { 2804:1234:bebe::48, 2804:4321:bebe::/48  }
    }
    chain input {
        type filter hook input priority 0;

        #ip saddr  @acesso-total4 accept
        #ip6 saddr @acesso-total6 accept

        # Permite acesso SSH na porta 22
        ip saddr  @acesso-total4 tcp dport 22 counter accept
        ip6 saddr @acesso-total6 tcp dport 22 counter accept

        # Permite acesso tela remota portas padões Vbox
        ip saddr  @acesso-total4 tcp dport { 9000-9100 } counter accept
        ip6 saddr @acesso-total6 tcp dport { 9000-9100 } counter accept

        # Drop nas portas para demais IPs
        
        # SSH
        tcp dport 22 counter drop
        # Vbox Remote
        tcp dport { 9000-9100 } counter drop
        
        type filter hook input priority 0;
    }
    chain forward {
        type filter hook forward priority 0;
    }
    chain output {
        type filter hook output priority 0;
    }
}

Reinicie o nftables e verifique se o mesmo foi carregado:

# systemctl enable nftables
# nft list ruleset
# sudo -u vbox vboxwebsrv &
# usermod -a -G vboxusers vbox
# reboot

Agora acesse:
https://DOMINIO/
Usuário: admin
Senha: admin

Não esqueça de alterar a senha do usuário admin!

O mais legal que você está usando quase nada do hardware da máquina para “subir” seu sistema de virtualização.

Virtulabox peca em não dar uma solução para inicialização automática, mas é muito fácil fazer isso incluindo no rc.local. Use o comando:

# sudo -u vbox VBoxManage list vms

Vai ser listado os ID das suas VMs. Ex:
“ns1” {d288884d-a3d4-4903-b84e-5c6039af13b5}
“ns2” {a2893475-atd4-4973-b81e-6039af13bss5}

Agora que você ja tem as IDs adicione em /etc/rc.local: da seguinte forma, alterando pelas suas ID.

sleep 30 #  sleep para aguardar 30seg para dar tempo do modulo do kernel ter tempo de iniciar
sudo -u vbox VBoxHeadless -s d288884d-a3d4-4903-b84e-5c6039af13b5 &
sudo -u vbox VBoxHeadless -s a2893475-atd4-4973-b81e-6039af13bss5 &

Agora quando o servidor reiniciar suas VMs vão iniciar automaticamente, (Não esqueça de quando for desligar o servidor fazer o processo de desligamento de cada VM)

Uma das vantagens deste servidor é que é o virtualbox é muito simples!!! Dentro de /home/vbox/ vão estar suas imagens sendo muito facil de fazer uma copia e migrada para algum outro servidor em caso de “pau”. É claro tenha sempre redundância de hardware em seu servidor, faça sempre pelo menos um RAID1 (espelhamento de disco) eu gosto de fazer RAID10 com pelo menos 5 SSDs, onde 1 dos SSDs eu instalo o sistema e os outros 4 (ou 6 ou 8 …) somo ex 2 (RAID0) e espelho nos outros 2 (RAID1) logo temos o RAID10.

Acesso remoto
No windows você pode usar o famoso mstsc e informar seu IP:PORTA, no linux tem um pacote chamado vinagre basta instala-lo.

Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento!

Se não puder doar pode deixar seu agradecimento nos comentário também ficarei feliz em saber que ajudei. Se tiver qualquer pergunta deixe-a também. Se preferir entrar em Contato clique aqui.

Abraço!

Rudimar Remontti

Trabalho atualmente como Gerente de Redes em um Provedor de Internet no Rio Grande do Sul.

Você pode gostar...

18 Resultados

  1. Leandro disse:

    Sabe de algum phpvirtualbox que funcione no debian 11?

  2. Reiferson disse:

    Lindo Tutorial amigo

  3. Diego disse:

    cara primeiramente quero te agradeçe por compratilhar esse conhecimento muito massa com todos nós.
    fui instalar novamente e me deparei com um problema ocorre o seguinte erro ao coloca o user e e passowrd

    (Error logging in to vboxwebsrv.) já pesquisei pra caramba a até o momento não consgio encontrar

  4. Bill Doug disse:

    Deus te proteja! Vc é 10!

  5. Diego disse:

    Eu poderia usar essa ferramenta em produção para rodar Windows Servers ou recomendaria algo mais robusto como um proxmox, xenserver, etc…

  6. Murilo disse:

    Olá! Primeiramente agradeço pelos conteúdos de alto nível.
    Bom, fiz a instalação porem quando vou executar a maquina o console não conectar, apresenta o erro “TCP: SECURITY_ERROR Error #2048”. Tem alguma dica? obrigado!

  7. Hermeson disse:

    Bom dia, esse exemplo, é como um terminal server é? busco muito, como criar um servidor de VM remoto. Tanto para os usuario acessarem uam VM remota ou até mesmo, criar sua propria maquina, tipo cloud?

  8. Diego disse:

    Belo Trabalho!!
    teria algum problema se caso eu quiser instalar ele sem o certificado ??

  9. Luis Teixeira disse:

    boa noite,
    parabéns pelo excelente tutorial, a instalação do debian que você indica é a netinstall, instalar sem interface gráfica?
    obrigado, até mais

  10. BrLink disse:

    faz proxmox com detalhes, afinal é baseado no debian e muito mais robusto e completo

  1. 26 de março de 2020

    […] do Zabbix 4.4 no Debian 10 Buster Zabbix 4.2/4.4 enviando alertas no Telegram via Bot (Debian 10) Criando um servidor de virtualização super leve com Debian 10 e Virtualbox WEB Instalação do SpeedTest/OoklaServer + Speedtest Custom no Debian 10 Buster Instalando o Home […]

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *