Criando Imagens Linux Customizadas

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!