Criando uma imagem Alpine Linux no EVE-NG
Vou demonstrar como criar imagens Linux customizadas no EVE-NG. Além da criação da imagem, vou preparar ela para iniciar com Telnet ao invés de VNC Para esse exemplo, vou usar o Alpine.
Criar o diretório da imagem
No servidor EVE-NG, crie o diretório da imagem do Alpine:
mkdir -p /opt/unetlab/addons/qemu/linux-alpine-3.22.0-virtual
cd /opt/unetlab/addons/qemu/linux-alpine-3.22.0-virtual
Baixar a ISO do Alpine
Baixe a ISO virt do Alpine Linux:
wget https://dl-cdn.alpinelinux.org/alpine/v3.22/releases/x86_64/alpine-virt-3.22.0-x86_64.iso
Renomeie a ISO para cdrom.iso, que é o nome esperado pelo EVE-NG:
mv alpine-virt-3.22.0-x86_64.iso cdrom.iso
Criar o disco qcow2
Crie o HD da VM, onde os dados serão salvos:
/opt/qemu/bin/qemu-img create -f qcow2 virtioa.qcow2 50G
Depois disso, a imagem já pode ser adicionada no EVE-NG. Se quiser que o Alpine tenha internet durante a instalação, é necessário conectar uma Cloud no lab.
Instalar o Alpine pelo EVE-NG
Inicie o Linux pelo EVE-NG usando a imagem criada. Depois, faça a instalação do sistema normalmente pelo console do Alpine. Algumas configurações podem ser realizadas agora ou podemos fazer logo abaixo, facilitando nossa vida com o uso do terminal.
Após a instalação, prossiga com os próximos passos para salvar a imagem instalada.
Também é possível iniciar a instalação diretamente pelo terminal usando a ISO:
qemu-system-x86_64 \
-m 512M \
-cdrom ../linux-alpine-3.22.0-virtual-livecd/cdrom.iso \
-drive file=virtioa.qcow2,format=qcow2 \
-boot d \
-nographic \
-net nic -net user
Esse modo inicia a VM pelo CD-ROM e usa o disco virtioa.qcow2 como destino da instalação.
Aplicando as alterações
Agora que a instalação foi realizada, precisamos fazer o commit da imagem, porque as alterações feitas durante a execução do node ficam no disco temporário criado pelo EVE-NG.
Esse disco temporário fica dentro do diretório do lab, em um caminho parecido com este:
/opt/unetlab/tmp/<pod-id>/<lab-id>/<node-id>/virtioa.qcow2
Já a imagem base fica no diretório da imagem QEMU:
/opt/unetlab/addons/qemu/linux-alpine-3.22.0-virtual/virtioa.qcow2
O commit grava as alterações do disco temporário na imagem base. Sem isso, a instalação pode funcionar enquanto o node existe no lab, mas a imagem original continua vazia ou sem as alterações feitas.
Com o servidor ainda criado no lab, primeiro identifique o diretório temporário usado pelo EVE-NG. No EVE-NG, o caminho temporário segue este padrão:
/opt/unetlab/tmp/<pod-id>/<lab-id>/<node-id>/
Onde:
= ID do usuário no EVE-NG = hash/UUID do lab = ID do node dentro do lab
O pod-id normalmente é 0 quando o usuário usado no EVE-NG é o admin, já o lab-id, que é o hash/UUID do laboratório, pode ser visto em Lab details dentro do próprio EVE-NG. Ele aparece em um formato parecido com e3e5c52b-21da-4008-9f51-4d837676dd21.
Também é possível localizar pelo terminal do EVE-NG listando os labs temporários:
ls -lh /opt/unetlab/tmp/0/
Depois, entre no diretório do lab e veja os nodes existentes:
ls -lh /opt/unetlab/tmp/0/e3e5c52b-21da-4008-9f51-4d837676dd21/
Cada diretório numérico representa um node. Por exemplo:
- 1/
- 2/
- 3/
Ao editar o node podemos ver o ID dele, esse é o número representado acima. Se o Alpine for o node 1, o caminho completo será:
/opt/unetlab/tmp/0/e3e5c52b-21da-4008-9f51-4d837676dd21/1/
Com o servidor desligado, acesse o diretório temporário do node:
cd /opt/unetlab/tmp/0/e3e5c52b-21da-4008-9f51-4d837676dd21/1/
Confira se o disco está no diretório:
ls -lh
Depois, aplique o commit:
/opt/qemu/bin/qemu-img commit virtioa.qcow2
A saída precisa ser:
Image committed.
Depois do commit, corrija as permissões do EVE-NG:
/opt/unetlab/wrappers/unl_wrapper -a fixpermissions
Após esse processo, as alterações feitas no Alpine instalado passam a fazer parte da imagem base usada pelo EVE-NG.
Mover a ISO para o diretório de ISOs do EVE-NG
Eu tenho um diretório onde ficam todas as ISOs que baixo, então vou mover essa ISO para lá:
mv cdrom.iso /eve/images_eve/ISOs/alpine-3.22.0-virtual/
Iniciar o qcow2 manualmente
Agora que temos o disco da VM com sistema instalado, vamos iniciar o disco manualmente pelo terminal, isso facilita algumas configurações que vamos fazer, já que é só copiar e colar.
Para montar um disco qcow2 manualmente, carregue o módulo nbd:
modprobe nbd
Depois, conecte o disco:
qemu-nbd --connect=/dev/nbd0 virtioa.qcow2
Monte a partição do sistema:
mount /dev/nbd0p2 /mnt
Monte os diretórios necessários para usar chroot:
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
Entre no sistema:
chroot /mnt
Instalar pacotes básicos no Alpine
Dentro do Alpine instalado, instale os pacotes básicos:
# Ajuste o servidor DNS primeiro:
echo "nameserver 8.8.8.8" > /etc/resolv.conf
# Agora instale os pacotes:
apk update && apk add curl wget vim nano bind-tools iproute2 nmap tcpdump iputils mtr traceroute htop bash iftop dhcpcd ndisc6 ncurses ncurses-terminfo ncurses-terminfo-base xterm iptables iptables-openrc
O console do EVE-NG pode usar telnet para acessar a console do node, o que facilita muito o uso. Para que isso funcione, o Alpine precisa iniciar corretamente pelo console serial, normalmente em ttyS0. Edite o arquivo /etc/inittab:
vim /etc/inittab
Procure uma linha relacionada a ttyS0. Se ela não existir, adicione no final do arquivo:
ttyS0::respawn:/sbin/getty -L 115200 ttyS0 vt100
Essa linha faz o Alpine iniciar um terminal de login na serial ttyS0, que é a console usada pelo EVE-NG para acesso via telnet.
Agora ajuste o bootloader para enviar a saída do boot também para a serial. Edite o arquivo /etc/update-extlinux.conf:
vim /etc/update-extlinux.conf
Procure a linha default_kernel_opts e deixe com console=ttyS0:
default_kernel_opts="console=ttyS0,115200 net.ifnames=0 biosdevname=0"
Depois aplique a configuração do bootloader:
update-extlinux
Agora vamos corrigir o comportamento do terminal. Isso evita alguns problemas comuns no console do EVE-NG, como terminal quebrado, backspace ruim e comportamento estranho ao entrar/sair do vim.
cat > /etc/profile.d/eve-terminal.sh <<'EOF'
# Ajustes para console telnet/web do EVE-NG
export TERM=linux
export DEBIAN_FRONTEND=noninteractive
stty sane 2>/dev/null
stty erase '^?' 2>/dev/null
stty rows 40 cols 160 2>/dev/null
EOF
# Para o apt install ficar menos quebrado, eu também manteria este ajuste:
cat > /etc/apt/apt.conf.d/99eve-plain-terminal <<'EOF'
Dpkg::Use-Pty "0";
Dpkg::Progress-Fancy "0";
APT::Color "0";
APT::Get::Show-Progress "false";
Acquire::Progress::Fancy "false";
EOF
Dê permissão de execução:
chmod +x /etc/profile.d/eve-terminal.sh
Agora ajuste o vim do usuário root:
cat > /root/.vimrc <<'EOF'
set nocompatible
set ttyfast
set notermguicolors
silent! set t_ti=
silent! set t_te=
EOF
A opção silent! evita erro caso alguma dessas opções não exista na versão do vim instalada. Essas opções são usadas para evitar que o vim use a tela alternativa do terminal, que pode deixar o console do EVE-NG estranho depois que o editor é fechado.
Se quiser deixar o mesmo ajuste como padrão para novos usuários, copie o arquivo para /etc/skel:
cp /root/.vimrc /etc/skel/.vimrc
Crie o diretório abaixo usado para salvar regras do Iptables:
mkdir -p /etc/iptables
Crie o arquivo das regras:
cat << 'EOF' > /etc/iptables/rules-save
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A OUTPUT -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1452
COMMIT
EOF
Depois habilite o serviço:
rc-update add iptables default
rc-service iptables start
Por fim, saia do Alpine:
exit
Depois, no servidor EVE-NG, corrija as permissões:
/opt/unetlab/wrappers/unl_wrapper -a fixpermissions
Instalar pacotes básicos no Ubuntu
Depois que o Ubuntu estiver instalado, vamos instalar alguns pacotes básicos e ajustar o sistema para funcionar melhor no console do EVE-NG.
Dentro do Ubuntu, atualize os repositórios:
# Ajuste o servidor DNS primeiro:
echo "nameserver 8.8.8.8" > /etc/resolv.conf
# Instale os pacotes básicos:
apt update && apt install -y curl wget vim nano dnsutils iproute2 nmap tcpdump iputils-ping mtr htop bash iftop xterm ncurses-term net-tools isc-dhcp-client iptables-persistent
O console do EVE-NG usa telnet para acessar a console do node. Por isso, o Ubuntu precisa iniciar corretamente pelo console serial, normalmente em ttyS0. Habilite o serviço de login na serial:
systemctl enable serial-getty@ttyS0.service
systemctl start serial-getty@ttyS0.service
Agora ajuste o GRUB para enviar a saída do boot também para a serial. Edite o arquivo /etc/default/grub:
vim /etc/default/grub
Ajuste ou adicione as linhas abaixo:
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0"
Depois aplique a configuração:
update-grub
Agora vamos corrigir o comportamento do terminal. Isso evita problemas comuns no console do EVE-NG, como terminal quebrado, backspace ruim e comportamento estranho ao sair do vim.
Crie o arquivo /etc/profile.d/eve-terminal.sh:
cat > /etc/profile.d/eve-terminal.sh <<'EOF'
# Ajustes para console telnet/web do EVE-NG
export TERM=linux
export DEBIAN_FRONTEND=noninteractive
stty sane 2>/dev/null
stty erase '^?' 2>/dev/null
stty rows 40 cols 160 2>/dev/null
EOF
# Para o apt install ficar menos quebrado, eu também manteria este ajuste:
cat > /etc/apt/apt.conf.d/99eve-plain-terminal <<'EOF'
Dpkg::Use-Pty "0";
Dpkg::Progress-Fancy "0";
APT::Color "0";
APT::Get::Show-Progress "false";
Acquire::Progress::Fancy "false";
EOF
Dê permissão de execução:
chmod +x /etc/profile.d/eve-terminal.sh
Agora ajuste o vim do usuário root:
cat > /root/.vimrc <<'EOF'
set nocompatible
set ttyfast
set notermguicolors
silent! set t_ti=
silent! set t_te=
EOF
A opção silent! evita erro caso alguma dessas opções não exista na versão do vim instalada. Essas opções são usadas para evitar que o vim use a tela alternativa do terminal, que pode deixar o console do EVE-NG estranho depois que o editor é fechado.
Se quiser deixar o mesmo ajuste como padrão para novos usuários, copie o arquivo para /etc/skel:
cp /root/.vimrc /etc/skel/.vimrc
Em algumas imagens Ubuntu no EVE-NG, o módulo floppy pode gerar mensagens desnecessárias ou atrasos durante o boot. Para desativar, crie o arquivo de blacklist:
echo "blacklist floppy" | tee /etc/modprobe.d/blacklist-floppy.conf
Atualize o initramfs:
update-initramfs -u
Em alguns cenários no EVE-NG, principalmente quando existe encapsulamento, VPN, PPPoE ou alguma limitação de MTU no caminho, pode ser necessário reduzir a MTU da interface e ajustar o MSS das conexões TCP. Crie o arquivo /etc/iptables/rules.v4 com algumas configurações:
cat << 'EOF' > /etc/iptables/rules.v4
# Generated by iptables-save v1.8.7 on Sat Jul 26 13:31:51 2025
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A OUTPUT -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1452
COMMIT
# Completed on Sat Jul 26 13:31:51 2025
EOF
Carregue a regra sem precisar reiniciar:
iptables-restore < /etc/iptables/rules.v4
Confira se a regra foi aplicada:
iptables -t mangle -S
Agora habilite o MTU probing:
echo 'net.ipv4.tcp_mtu_probing=1' | tee /etc/sysctl.d/99-mtu-probing.conf
No Ubuntu, configure a MTU pelo Netplan, crie o arquivo /etc/netplan/01-cfg.yaml:
cat << 'EOF' > /etc/netplan/01-cfg.yaml
network:
ethernets:
eth0:
dhcp4: true
mtu: 1492
version: 2
EOF
Depois disso, a interface eth0 deve continuar usando DHCP, mas com MTU 1492.
Por fim, saia do Ubuntu:
exit
Sair e desmontar
Agora que você fez o exit dentro do chroot, vamos desmontar os diretórios e desconectar o disco:
# Desmontar os diretórios:
umount /mnt/dev /mnt/proc /mnt/sys
umount /mnt
# Desconectar o disco:
qemu-nbd --disconnect /dev/nbd0
Agora já pode usar o sistema customizado!