Servidor de virtualização Web com Debian 11 bullseye + Virtualbox 7.0

CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 82


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

Acesse seu servidor e vire root.

# su - 

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

Se desejar que seu servidor tenha os nomes de interfaces como: eth0 eth1… wlan0 wlan1… faça um ajuste no grub:
OBS: Será necessário que você reconfigure a placa de rede (/etc/network/interfaces)

# vim /etc/default/grub

Ajuste GRUB_CMDLINE_LINUX_DEFAULT

GRUB_CMDLINE_LINUX_DEFAULT="quiet net.ifnames=0 biosdevname=0"
# update-grub

Adicione o repositório do virtualbox

# apt install wget vim apt-transport-https gnupg
# echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/oracle-virtualbox-2016.gpg] https://download.virtualbox.org/virtualbox/debian bullseye contrib' > /etc/apt/sources.list.d/virtualbox.list
# wget -O- https://www.virtualbox.org/download/oracle_vbox_2016.asc | gpg --dearmor --yes --output /usr/share/keyrings/oracle-virtualbox-2016.gpg

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

# apt update
# apt install virtualbox-7.0
# reboot

Acesse seu servidor novamente e vire root.

# su - 

Faça download dos pacotes extras:

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

Caso esteja atualizando remova as versões mais antigas:

# VBoxManage extpack uninstall "Oracle VM VirtualBox Extension Pack"

Instale os pacotes extras

# VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-7.0.8.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

Será necessário PHP8, Para isso adicione ao repositório:

# wget -qO - https://packages.sury.org/php/apt.gpg | apt-key add -
# echo "deb https://packages.sury.org/php/ bullseye main" | tee /etc/apt/sources.list.d/sury-php.list
# apt update

Instale o Apache+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-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 7.0

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

# cd /var/www/
# mv /var/www/html/ /var/www/html_old
# wget https://github.com/BartekSz95/phpvirtualbox/archive/main.zip -O phpvirtualbox.zip
# apt install zip unzip
# unzip phpvirtualbox.zip
# mv phpvirtualbox-main 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!

BÔNUS COMANDOS TERMINAL

# Listar todos os tipos de sistemas operacionais 
VBoxManage list ostypes

# Criar uma VM
VBoxManage createvm --name "Debian" --ostype Debian_64 --register

# Definir memória (RAM) e CPUs**:
VBoxManage modifyvm "Debian" --memory 2048
VBoxManage modifyvm "Debian" --cpus 4
VBoxManage modifyvm "Debian" --memory 2048 --cpus 4

# Criar um disco rígido virtual (VDI) de 80GB com controladora NVMe
# Primeiro, crie o disco:
VBoxManage createmedium disk --filename ~/VirtualBox\ VMs/Debian/DebianDisk.vdi --size 81920 --format VDI
# Em seguida, crie o controlador NVMe e anexe o disco a ele:
VBoxManage storagectl "Debian" --name "SATAController" --add sata --controller IntelAhci --portcount 1 --bootable on
VBoxManage storageattach "Debian" --storagectl "SATAController" --port 0 --device 0 --type hdd --medium ~/VirtualBox\ VMs/Debian/DebianDisk.vdi

# Configurar a placa de rede em modo bridge, utilizando eth0
VBoxManage modifyvm "Debian" --nic1 bridged --bridgeadapter1 eth0

# Adicionando mais interfaces
VBoxManage modifyvm "Debian" --nic2 bridged
VBoxManage modifyvm "Debian" --bridgeadapter2 eth0

# Desligar o áudio:
VBoxManage modifyvm "Debian" --audio none

# Define momoria de video:
VBoxManage modifyvm "Debian" --vram 16

# Alterar a controladora gráfica
VBoxManage modifyvm "Debian" --graphicscontroller vmsvga

# Listar VMS
VBoxManage list vms
"Debian" {941d837d-b357-4d19-bd06-b4a7750e321b}

# Iniciar VM
VBoxHeadless --startvm "Debian"
VBoxHeadless --startvm 9bee8518-37ab-492f-b8c5-4989e87bed9b

# Desligar VM
VBoxManage controlvm "Debian" acpipowerbutton
VBoxManage controlvm "Debian" poweroff

# Lista VMs ligadas
VBoxManage list runningvms

# Tirar um snapshot: 
VBoxManage snapshot "Debian" take "nome_snap"
VBoxManage snapshot "Debian" take `date +'%Y-%m-%d_%H-%M-%S'`

# Listar snapshots: 
VBoxManage snapshot "Debian" list
VBoxManage snapshot "941d837d-b357-4d19-bd06-b4a7750e321b" list 
   Name: 2024-02-14_09-54-25 (UUID: 23c1301a-7017-4763-aded-44516d9668b0)
      Name: 2024-02-14_09-54-59 (UUID: 70fc34e7-54dc-493f-af15-6b0858c1dadb)
         Name: 2024-02-14_09-55-09 (UUID: 19cf9f02-dc46-45fb-b22a-c133cfea9f78) *

# Restaurar um snapshot: 
VBoxManage snapshot "Debian" restore "nome_snap"
VBoxManage snapshot "Debian" restore "2024-02-14_09-54-25"

# Deletar um snapshot: 
VBoxManage snapshot "Debian" delete "nome_snap"
VBoxManage snapshot "Debian" delete "2024-02-14_09-54-59"

# Recuperando uma VM pelos arquivos (incluído os SNAPS, estrutura completa)
VBoxManage registervm ~/VirtualBox\ VMs/Debian.vbox

# Exportando (OVA)
VBoxManage export "Debian_12" -o /caminho/Debian_12.ova

# Mais comandos

# Exemplo bridged
VBoxManage modifyvm "RouterOS" --nic5 bridged
VBoxManage modifyvm "RouterOS" --bridgeadapter5 eth0

# Exemplo intnet
VBoxManage modifyvm "RouterOS" --nic5 intnet
VBoxManage modifyvm "RouterOS" --intnet5 "switch_lab"
VBoxManage modifyvm "RouterOS" --cableconnected5 on

# Modo Promíscuo
# deny: Não permite que a interface de rede opere em modo promíscuo.
# allow-vms: Permite que a interface de rede comunique com outras máquinas virtuais.
# allow-all: Permite que a interface de rede comunique com todas as máquinas virtuais e com 
VBoxManage modifyvm "RouterOS" --nicpromisc5 allow-all

# Definir o tipo de placa de rede para o quinto adaptador 
# Am79C970A: AMD PCNet PCI II (Am79C970A);
#  Am79C973: AMD PCNet FAST III (Am79C973, a opção padrão);
#   82540EM: Intel PRO/1000 MT Desktop (82540EM);
#   82543GC: Intel PRO/1000 T Server (82543GC);
#   82545EM: Intel PRO/1000 MT Server (82545EM);
#    virtio: Paravirtualized network adapter (virtio-net).

VBoxManage modifyvm "RouterOS" --nictype5 82543GC

# Definir um endereço MAC específico para o quinto adaptador
VBoxManage modifyvm "RouterOS" --macaddress5 0800000000A4

# Ver informações da VM por comando
VBoxManage showvminfo "RouterOS"
VBoxManage showvminfo "RouterOS" | grep "NIC" 

# Para adaptadores adicionais, substitua --nic5 por --nic6, --nic7, ou --nic8, conforme necessário. 

# Precisa mais que 8? Ativa 36 slot para interfaces.
VBoxManage modifyvm "RouterOS" --chipset ich9 --ioapic on

VBoxManage modifyvm "RouterOS" --nic9 intnet
VBoxManage modifyvm "RouterOS" --intnet9 "switch_amarelo"
VBoxManage modifyvm "RouterOS" --cableconnected9 on
VBoxManage modifyvm "RouterOS" --nictype9 82543GC
VBoxManage modifyvm "RouterOS" --macaddress9 0800000000B1

# Definir uma mac aleatório
VBoxManage modifyvm "RouterOS" --macaddress1 auto
VBoxManage modifyvm "RouterOS" --macaddress2 auto
VBoxManage modifyvm "RouterOS" --macaddress3 auto

Rudimar Remontti

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

Você pode gostar...

10 Resultados

  1. adson disse:

    quando tento acessar esta dando esse erro.

    Exception Object
    (
    [message:protected] => Error logging in to vboxwebsrv.
    [string:Exception:private] =>
    [code:protected] => 64
    [file:protected] => /var/www/html/endpoints/api.php
    [line:protected] => 134
    [trace:Exception:private] => Array
    (
    )

    [previous:Exception:private] =>
    )

  2. Cleyço Rocha disse:

    Muito grato por esse é outros tutoriais.

  3. Lui Tinoco disse:

    Sempre acontece este erro:

    Exception Object
    (
    [message:protected] => Could not connect to host (http://192.168.0.130:18083/)
    [string:Exception:private] =>
    [code:protected] => 64
    [file:protected] => /var/www/html/endpoints/api.php
    [line:protected] => 134
    [trace:Exception:private] => Array
    (
    )

    [previous:Exception:private] =>
    )

    Ao colocar login e senha no virtualbox

  4. Vinicius disse:

    Em um ambiente corporativo pequeno isso poderia substituir um esxi versão gratuita? Ou é apenas recomendado para LABS e simulações?

Deixe um comentário

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