FreeBSD Jail · 4 min read · Jan 24, 2026

Criando Uma Jail Com Servidor VNC No FreeBSD

Criando Uma Jail Com Servidor VNC No FreeBSD

Este artigo explica como você pode executar um servidor VNC de dentro de uma jail no FreeBSD.

Criando jail a partir do código-fonte:

Crie um diretório onde nossas jails serão armazenadas:

# mkdir -p /home/jails

Ou no diretório /usr:

# mkdir -p /usr/jails
# mkdir /home/jails/testjail

Vá para o diretório /usr/src e verifique se você tem o código-fonte do FreeBSD.

# cd /usr/src
# ls

Você deve ver algo assim:

COPYRIGHT               contrib                 release
LOCKS                   crypto                  rescue
MAINTAINERS             etc                     sbin
Makefile                games                   secure
Makefile.inc1           gnu                     share
ObsoleteFiles.inc       include                 sys
README                  kerberos5               tools
UPDATING                lib                     usr.bin
bin                     libexec                 usr.sbin

Se você tiver um diretório vazio ou apenas um diretório sys, você deve instalar o código-fonte do FreeBSD:
Você pode fazer isso executando sysinstall ou baixar o código-fonte do cvs.

# sysinstall

Vá para configuração, depois para distribuições e selecione “src” e pressione ok. Depois disso, você deve ter todo o código-fonte no diretório /usr/src/. Então você deve atualizar seu código-fonte com a versão mais recente do cvs. Você deve criar um arquivo “stable-supfile” no seu diretório home ou em outro lugar.

# vi ~/stable-supfile

E coloque algumas linhas assim:

# Seu espelho mais próximo do código-fonte do freebsd, para mim é da Polônia
*default host=cvsup.pl.FreeBSD.org
*default base=/usr
*default prefix=/usr
# para a versão 7.2 do FreeBSD você coloca RELENG_7_2 7.1 - RELENG_7_1 7.0 - RELENG_7_0 6.4 RELENG_6_4
*default release=cvs tag=RELENG_7_2
*default delete use-rel-suffix
*default compress
src-all

Em seguida, após salvar o arquivo, você pode atualizar seu código-fonte do FreeBSD com csup:

# csup /root/stable-supfile

Depois disso, você pode compilar sua jail a partir do código-fonte:

# cd /usr/src
# make world DESTDIR=/home/jails/testjail
# make distribution DESTDIR=/home/jails/testjail

Quando você compilar o World uma vez, pode criar novas jails com dois comandos sem compilar o world novamente:

# make installworld DESTDIR=/home/jails/otherjail
# make distribution DESTDIR=/home/jails/otherjail

Quando sua jail estiver preparada, você deve fazer algumas alterações em alguns arquivos de configuração.

# vi /home/jails/testjail/etc/rc.conf

E você coloca lá:

sendmail_enable="NONE"
sshd_enable="YES"
# cp /etc/resolv.conf /home/jails/testjail/etc/
# touch /home/jails/testjail/etc/fstab

Executando a jail pela primeira vez:

Para executar a jail, você deve montar devfs na jail:

# mount -t devfs devfs /home/jails/testjail/dev

Então você deve configurar um alias para sua interface de rede. No meu FreeBSD, eu tenho a interface bge0 e o alias que criei assim:

# ifconfig bge0 alias 192.168.2.2

Executando a jail:

# jail /home/jails/testjail shell 192.168.2.2 /bin/tcsh

Quando você estiver na jail, pode definir uma senha de root:

# passwd

Então você deve adicionar uma conta não-root que lhe dará acesso à jail via ssh.

# adduser

Para sair da jail, você deve usar o comando exit.

# exit

Sua jail está quase pronta. Você deve adicionar algumas linhas ao arquivo /etc/rc.conf e, após isso, sua jail será iniciada quando seu servidor for iniciado.

# alias para sua interface de rede
ifconfig_bge0_alias0="192.168.2.2"
# linha que habilita jails no freebsd
jail_enable="yes"
# lista de suas jails ex. “testjail otherjail httpjail sshjail”
jail_list="testjail"
jail_testjail_rootdir="/home/jails/testjail"
jail_testjail_hostname="testjail"
jail_testjail_ip="192.168.2.2"
jail_testjail_exec_start="/bin/sh /etc/rc"
jail_testjail_exec_stop="/bin/sh /etc/rc.shutdown"
jail_testjail_devfs_enable="YES"

Se você quiser ter a árvore de ports na jail e não quiser replicá-la, podemos montar o diretório /usr/ports/ na jail com uma linha no arquivo /etc/fstab. Linha assim:

/usr/ports              /home/jails/testjail/usr/ports/         nullfs  rw,auto 0 0

Iniciando e parando jails sem reiniciar o sistema:

# /etc/rc.d/jail start testjail
# /etc/rc.d/jail stop testjail

Se você quiser obter uma lista de suas jails, pode obtê-la com este comando:

# jls

Instalando xorg e vnc na jail a partir de pacotes:

# pkg_add –r xorg
# pkg_add –r vnc

Para executar vnc na conta de usuário, você escreve:

$ vncserver

Quando você executar o vncserver pela primeira vez, deve configurar uma senha para a conexão vnc.

Por padrão, quando você se conecta ao vnc, será executado o twm. Você pode mudar isso editando o arquivo ~/.vnc/xstartup. Você deve mudar a última linha de „twm &” para ex. „wmaker &” para o ambiente WindowMaker.

Para se conectar à jail vnc, você deve escrever no vncviewer jail_ip_address e a porta vnc. Ex. 192.168.2.2:1

Alguns erros com vnc na jail: Quando você tiver uma mensagem de cores não reconhecidas, deve editar o arquivo /usr/local/bin/vncserwer e mudar a linha:

$cmd .= " -co /usr/X11R6/lib/X11/rgb";  

Quando tivermos a mensagem
!!!!!!!!!!!!!!!!!!!!!!!!!!
sem exibição livre na jailname

Você deve editar /usr/local/bin/vncserver e mudar a função pack para sockaddr_in em duas linhas na função CheckDisplayNumber:

[…]
pack ---> sockaddr_in(6000 +$n, &INADDR_ANY))) {
[…]
pack ---> sockaddr_in(5900 +$n, &INADDR_ANY))) {
[…]

O código deve ser assim:

sub CheckDisplayNumber
{
    local ($n) = @_;
    socket(S, $AF_INET, $SOCK_STREAM, 0) || die "$prog: socket failed: $!\n";
    eval 'setsockopt(S, &SOL_SOCKET, &SO_REUSEADDR, pack("l", 1))';
    if (!bind(S, sockaddr_in(6000 + $n, &INADDR_ANY))) {
        close(S);
        return 0;
    }
    close(S);
    socket(S, $AF_INET, $SOCK_STREAM, 0) || die "$prog: socket failed: $!\n";
    eval 'setsockopt(S, &SOL_SOCKET, &SO_REUSEADDR, pack("l", 1))';
    if (!bind(S, sockaddr_in(5900 + $n, &INADDR_ANY))) {
        close(S);
        return 0;
    }
    close(S);

Encaminhamento de portas no IPWF para jails

Se você quiser encaminhar algumas portas para a jail, deve ter compilado um kernel do FreeBSD com algumas opções habilitadas:

options  IPFIREWALL
options  IPFIREWALL_DEFAULT_TO_ACCEPT
options  IPFIREWALL_VERBOSE
options  IPFIREWALL_FORWARD
options  IPDIVERT

Regra de encaminhamento de porta:

ipfw add fwd ip_adres_jail,port_jail tcp from any to adresip_local port_local
ex.
ipfw add fwd 192.168.2.2,21 tcp from any to me 21
ipfw add fwd 192.168.2.2,21 tcp from any to 72.46.154.23 21

``
Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.