Skip to content

Laboratório prático com QEMU e jails no FreeBSD para estudos de redes, segurança e isolamento de ambientes Unix-like.

Notifications You must be signed in to change notification settings

darioomatos/freebsd-jails-lab

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 

Repository files navigation

🐚 FreeBSD e Jails

Recentemente, iniciei meus estudos em FreeBSD, com foco em segurança de sistemas e redes, explorando o conceito de jails, um dos recursos nativos mais poderosos e seguros para isolamento de processos no sistema BSD.

Me baseei ne artigo do site oficial: FreeBSD Handbook

🧱 O que é uma Jail?

Jails são ambientes isolados no FreeBSD que permitem executar processos e serviços de forma segura, como se estivessem em sistemas separados. Cada jail possui seu próprio sistema de arquivos, usuários e rede, mas compartilha o mesmo kernel com o host. São amplamente usadas para testes, servidores multi-tenant, isolamento de serviços e simulações de rede.

Como meu ambiente principal é o Manjaro Linux, decidi emular o FreeBSD usando o QEMU, que oferece uma boa flexibilidade para testes e desenvolvimento. Vou mostrar como eu fiz esse laboratório.

🔧 Ambiente de estudos

  • Host: Manjaro Linux (x86_64)
  • Virtualizador: QEMU + virtio
  • ISO: FreeBSD 14.0-RELEASE
  • Disco virtual: .qcow2

🚨 FreeBSD não é Linux!


💻 Emulando o FreeBSD com QEMU

Criei um arquivo de configuração de máquina virtual para subir o FreeBSD em modo bridge, atrelado a uma interface de rede específica para tunelamento. A interface é tuntap, que permite — entre outras coisas — subir a VM em modo bridge e não NAT. Depois, mostrarei como criar isso no host (Manjaro Linux):

#!/bin/bash

# Iniciar FreeBSD com:
# - 2 GB RAM
# - 2 CPUs
# - acesso via terminal direto (sem GUI)
# - disco qcow2 com KVM para desempenho
# - bridge entre a VM e o host

qemu-system-x86_64 \
  -m 2048 \
  -smp 2 \
  -cpu host \
  -enable-kvm \
  -drive file=FreeBSD.qcow2,format=qcow2 \
  -boot c \
  -serial mon:stdio \
  -nographic \
  -device virtio-net-pci,netdev=net0 \
  -netdev tap,id=net0,ifname=tap0,script=no,downscript=no

O scrpt completo em meu terminal ficou assim:

configuração do qemu

Antes disso, criei uma imagem de disco virtual para o QEMU, do tipo qcow2:

qemu-img create -f qcow2 FreeBSD.qcow2 20G

Depois, executei a VM FreeBSD:

Start FreeBSD com QEMU

⚠️ Erro: interface tap0 ainda não foi criada

Mostrarei o erro que apareceu quando tentei subir a VM sem ter criado a interface de tunelamento antes:

Erro no host ao subir a VM FreeBSD com QEMU

Explicação:

  1. Ao tentar executar a VM com QEMU, o terminal mostra "operação não permitida";
  2. O comando ip link show mostra todas as interfaces de rede do host;
  3. A interface 3 é a wifi0 (minha interface de conexão com a internet).

Ou seja, ainda falta criar a interface tap0 no host.

✅ Criando e habilitando a interface de tunelamento e regras de firewall

💡 TUN/TAP são dispositivos de rede virtuais usados em sistemas Unix/Linux para criar interfaces de rede via software. São comuns em VPNs, containers e jails. TUN trabalha em nível IP, enquanto TAP em nível Ethernet.

Criando tap0 e habilitando no host

Explicação:

  1. Criando a tuntap e adicionando como novo dispositivo para o usuário;
  2. Habilitada para uso após a criação;
  3. Adicionando um novo range de IP "/24" para usar na interface criada;
  4. Ainda está "Down", mas vou deixá-la "Up".

🔀 Redirecionamento de IPv4 e regras de firewall

Ainda no host, habilitei o redirecionamento de pacotes IPv4 no kernel Linux e configurei o firewall iptables para redirecionar todo o tráfego recebido da VM em tap0 para a wifi0, de forma mascarada. ⚠️ A interface real wifi0 não pode ser usada diretamente como bridge, por isso criamos um "intermediário". Pesquise sobre ip_forwarding.

Configuração de rotas no host

Depois, executei novamente a VM FreeBSD:

Start FreeBSD com QEMU

🏗️ Dentro do sistema operacional FreeBSD

Uma vez dentro da VM, configurei a jail.

🚨 FreeBSD não é Linux!

Start FreeBSD

PS: Eu já havia feito todo o processo inicial de instalação do sistema. A máquina já estava totalmente configurada e operante.

Verificando as rotas da VM

Sistema operacional FreeBSD mais recente

A VM FreeBSD está usando a subrede 192.168.100.0/24 criada com tap0 no host. O dispositivo vtnet0 faz a "ponte" (bridge) com o sistema host. A imagem mostra que a rota padrão para o gateway é 192.168.100.1.

Podemos confirmar que a comunicaçao com o host e com a internet está ok na imagem abaixo:

comunicaçao com host e internet

📌 Importante: o sistema operacional FreeBSD já estava configurado (rc.conf, resolv.conf, pfctl, serviços, permissões root, etc.). Não abordarei isso aqui para manter o foco.

Nesse momento, se voltar ao host (Manjaro) e verificar, verá que o tap0, que antes estava "Down", agora está "Up":

ip addr show tap0

Instalando os arquivos base

Esses foram os comandos usados para criar o ambiente de testes dentro da VM e a base necessária para criar uma jail. A jail funciona criando uma nova userland — ou seja, um novo espaço separado em nível de ambiente de usuário, sem interação com o sistema host (neste caso, a VM FreeBSD).

mkdir -p /usr/jails/projeto_X
cd /usr/jails/projeto_X
fetch https://download.freebsd.org/ftp/releases/amd64/14.0-RELEASE/base.txz
tar -xvf base.txz -C .

Download do sistema base

Link usado para baixar a base do sistema: amd64/14.0-RELEASE/base.txz

Após o download com fetch, extraí os arquivos com tar. Em seguida, excluí os arquivos desnecessários, mantendo apenas o essencial para subir a jail.

Arquivos da nova userland da jail

Arquivos básicos necessários

Esses são os arquivos extraídos acima.

Criando a jail dentro do FreeBSD

Arquivo de configuração em /etc/jail.conf:

Arquivo de configuração básica

Obs.: É um arquivo de configuração básica; existem muto mais no site oficial.

Obs2.: No meu caso, criei o nome de "project_X" mas pode ser qualquer nome.

Horas de ativar o serviço de jails

Verificando se o serviço está ativo:

Comandos para verificaco antes de ativar

Explicação:

  1. Verificando se o serviço está ativo no sistema com service.
  2. Fazendo a mesma verificacao com a propria ferramenta do jail: jls.

Habilitando o serviço

"Incializando o serviço da jail no FreeBSD"

Eu usei os seguintes comandos abaixo para iniciar o serviço jail e habilitar para iniciar com o boot da VM:

sysrc jail_enable="YES"
service jail start

Verificar e acessar a jail

Os comandos abaixo acessa a jail criada, no caaso, project_X:

jexec project_X /bin/csh # Acessa a jail (usando o ID ou nome)

Dentro da jail, testei comandos básicos e observei o isolamento de rede e sistema de arquivos.

Prezo dentro da jaula #piada

Finalmente podemos acessar a jial criada e confirmar que se trada de outro ambienre, outra userland; totalmente isolada do host.

"Dentro da jaula"

Obs.: Herdou as configuraçoes de IP do sistema host.

Vale notar que como nao configurei nada além do básico, a jail herdou o mesmo IP do host, mas isso pode ser totalmente configurado para ter as proprias configuraçoes de IP, DNS, etc. Da para deixar muito mais independente.

💬 Considerações

Estudar jails no FreeBSD tem sido uma ótima introdução prática aos conceitos de contenção leve, segurança por isolamento e administração de ambientes Unix-like para mim.

A vantagem de usar QEMU é poder experimentar com snapshots e modificar o ambiente sem comprometer o sistema principal.


📌 Próximos passos

  • Criar ambientes com múltiplas jails
  • Simular serviços de rede
  • Aplicar regras com pf (packet filter)
  • Explorar integrações com ferramentas de observabilidade como Prometheus

About

Laboratório prático com QEMU e jails no FreeBSD para estudos de redes, segurança e isolamento de ambientes Unix-like.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published