Servidor de virtualização super leve com Debian 11 bullseye + Virtualbox WEB
Com VirtualBox é possível 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/
Requerimentos
Debian 11 (Bullseye) 64 bits instalação mínima pronta
Adicione o repositório do virtualbox
Acesse seu servidor e vire root.
# su -
# apt install wget vim apt-transport-https gnupg # echo 'deb [arch=amd64] http://download.virtualbox.org/virtualbox/debian bullseye 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 -
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/ bullseye main contrib non-free deb-src http://deb.debian.org/debian/ bullseye main contrib non-free deb http://security.debian.org/debian-security bullseye/updates main contrib non-free deb-src http://security.debian.org/debian-security bullseye/updates main contrib non-free # bullseye-updates, previously known as 'volatile' deb http://deb.debian.org/debian/ bullseye-updates main contrib non-free deb-src http://deb.debian.org/debian/ bullseye-updates main contrib non-free
Atualize o repositório
# apt update # apt install firmware-linux firmware-linux-free firmware-linux-nonfree
Vamos fazer uns ajustes nas parametrizações do kernel para otimizar algumas coisas.
# echo "vm.swappiness=10" >> /etc/sysctl.conf # echo "vm.vfs_cache_pressure=50" >> /etc/sysctl.conf # echo "vm.dirty_background_ratio = 5" >> /etc/sysctl.conf # echo "vm.max_map_count=262144" > /etc/sysctl.d/70-vbox.conf # echo "fs.file-max=3263776" > /etc/sysctl.d/70-vbox.conf # echo "fs.aio-max-nr=3263776" > /etc/sysctl.d/70-vbox.conf # cat <<EOF >/etc/sysctl.d/60-net.conf net.core.netdev_max_backlog=4096 net.core.rmem_default=262144 net.core.rmem_max=67108864 net.ipv4.udp_rmem_min=131072 net.ipv4.udp_mem=2097152 4194304 8388608 net.core.default_qdisc = fq net.core.somaxconn = 16384 EOF
Reinicia a máquina para carregar os novos módulos do kernel.
# apt install virtualbox-6.1 # reboot
Acesse seu servidor novamente e vire root.
# su -
Faça download dos pacotes extras:
# cd /tmp/ # wget https://download.virtualbox.org/virtualbox/6.1.32/Oracle_VM_VirtualBox_Extension_Pack-6.1.32.vbox-extpack
Instale os pacotes extras
# VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-6.1.32.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. 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 # su - vbox --shell=/bin/bash -c '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 # su - vbox --shell=/bin/bash -c '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
phpVirtualbox
O phpVirtualbox oficial até a data desta publicação (abril/2022) a versão 5.2, porém ela já não é mais instalável no Debian 11, então iremos utilizar um fork compatível com o phpVirtualbox 6.1.
Vamos configurar o projeto phpvirtualbox, dentro do diretório padrão do apache.
# cd /var/www/ # mv /var/www/html/ /var/www/html_old # wget https://github.com/remontti/phpvirtualbox-6.1/archive/refs/heads/develop.zip -O phpvirtualbox.zip # apt install zip unzip # unzip phpvirtualbox.zip # mv phpvirtualbox-6.1-develop html # rm phpvirtualbox.zip # 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 com nftables que já é o padrão no Debian 11 substituindo o antigo iptables, no exemplo já irei proteger também a porta do SSH, lembre-se de deixar seus IPs na ACL de permissões.
# 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.
# vim /etc/nftables.conf
#!/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; # Permite acesso SSH na porta 22 ip saddr @acesso-total4 tcp dport 22 counter accept ip6 saddr @acesso-total6 tcp dport 22 counter accept tcp dport 22 counter drop # 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 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 restart nftables # nft list ruleset
Adicione o usuario vbox ao grupo, inicialize o servi web service e reinicie a máquina.
# usermod -a -G vboxusers vbox # su - vbox --shell=/bin/bash -c 'vboxwebsrv &' # 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:
# su - vbox --shell=/bin/bash -c 'VBoxManage list vms'
Vai ser listado os ID das suas VMs. Ex:
“DNS-SERVER” {d288884d-a3d4-4903-b84e-5c6039af13b5}
“ZABBIX-SERVER” {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 su - vbox --shell=/bin/bash -c 'VBoxHeadless -s d288884d-a3d4-4903-b84e-5c6039af13b5 &' su - vbox --shell=/bin/bash -c '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!
Funcionou quase tudo perfeito
Somente o acesso remoto que não consegui fazer funcionar
no config.php fiz teste com varios ips
var $vrdeaddress = ‘0.0.0.0’; , deixei o ip do micro (192.168.15.1), 127.0.0.1 e nenhum funcionou
Consegui resolver com o seguinte comando:
su – vbox –shell=/bin/bash -c ‘VBoxManage modifyvm “[VM_NAME]” –vrdeaddress 0.0.0.0’
mudando o [VM_NAME] para o nome da vm
VRDE (VirtualBox Remote Desktop Extension) 0.0.0.0 vai permitir o acesso em todas a interfaces do servidor
Resolvi instalando esse dependencia
sudo apt install binutils build-essential dkms linux-headers-$(uname -r) make
Bom dia !
Parabéns pelo artigo, belo trabalho.
O console está desativado. Sabe como posso ativá-lo?
He instalado 2 veces desde 0 y cuando voy a iniciar session el admin/admin no es correcto, hay un mensaje de error
Tento de todas as maneiras usar o mstsc mas por algum motivo nao consigo usar a area de trabalho remota! ja tentei habilitar e desativar todo tipo de firewall. Debian 11 sem interface grafica
Belo tutorial, parabéns pelo conteúdo.
Só uma dúvida, por que não usar a versão 6.1 do phpVirtualbox? Ela não é estável?
Eu acho que ele só fez um fork do phpVirtualBox develop – que é a versão que está funcionando com o virtualbox 6.1, porque a master só suporta a versão 5.2 mesmo, provavelmente ele fez isso pra não pegar alterações no branch develop dos cara.. eu acho..