FreeBSD VNC · 4 min read · Jan 24, 2026

Creando una Cárcel Con Servidor VNC En FreeBSD

Creando una Cárcel Con Servidor VNC En FreeBSD

Este artículo explica cómo puedes ejecutar un servidor VNC desde dentro de una cárcel en FreeBSD.

Creando cárcel desde el código fuente:

Crea un directorio donde se almacenarán nuestras cárceles:

# mkdir -p /home/jails

O en el directorio /usr:

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

Ve al directorio /usr/src y verifica si tienes el código fuente de FreeBSD.

# cd /usr/src
# ls

Deberías ver algo como esto:

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

Si tienes un directorio vacío o solo un directorio sys, debes instalar el código fuente de FreeBSD:
Puedes hacer esto ejecutando sysinstall o descargar el código fuente desde cvs.

# sysinstall

Ve a configuración, luego a distribuciones y selecciona “src” y presiona ok. Después de eso deberías tener todo el código fuente en el directorio /usr/src/. Luego debes actualizar tu código fuente con la última versión de cvs. Debes crear un archivo “stable-supfile” en tu directorio home o en otro lugar.

# vi ~/stable-supfile

Y poner algunas líneas como estas:

# Tu espejo más cercano del código fuente de freebsd, para mí es de Polonia
*default host=cvsup.pl.FreeBSD.org
*default base=/usr
*default prefix=/usr
# para la versión 7.2 de FreeBSD pones 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

A continuación, después de guardar el archivo, puedes actualizar tu código fuente de FreeBSD con csup:

# csup /root/stable-supfile

Después de eso, puedes compilar tu cárcel desde el código fuente:

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

Cuando compiles World una vez, puedes crear nuevas cárceles con dos comandos sin compilar world una vez más:

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

Cuando tu cárcel esté preparada, debes hacer algunos cambios en algunos archivos de configuración.

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

Y pones allí:

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

Ejecutando la cárcel por primera vez:

Para ejecutar la cárcel, debes montar devfs en la cárcel:

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

Luego debes configurar un alias para tu interfaz de red. En mi FreeBSD tengo la interfaz bge0 y el alias lo creo así:

# ifconfig bge0 alias 192.168.2.2

Ejecutando la cárcel:

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

Cuando estés en la cárcel, puedes establecer una contraseña de root:

# passwd

Luego debes agregar una cuenta no-root que te dará acceso a la cárcel a través de ssh.

# adduser

Para salir de la cárcel, debes usar el comando exit.

# exit

Tu cárcel está casi lista. Debes agregar algunas líneas al archivo /etc/rc.conf y después de eso tu cárcel se iniciará cuando tu servidor se inicie.

# alias para tu interfaz de red
ifconfig_bge0_alias0="192.168.2.2"
# línea que habilita cárceles en freebsd
jail_enable="yes"
# lista de tus cárceles ej. "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"

Si deseas tener el árbol de puertos en la cárcel y no quieres replicarlo, podemos montar el directorio /usr/ports/ en la cárcel con una línea en el archivo /etc/fstab. Línea como esta:

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

Iniciando y deteniendo cárceles sin reiniciar el sistema:

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

Si deseas obtener una lista de tus cárceles, puedes obtenerla con este comando:

# jls

Instalando xorg y vnc en la cárcel desde paquetes:

# pkg_add –r xorg
# pkg_add –r vnc

Para ejecutar vnc en la cuenta de usuario, escribes:

$ vncserver

Cuando ejecutas vncserver por primera vez, debes configurar una contraseña para la conexión vnc.

Por defecto, cuando te conectas a vnc, se ejecutará twm. Puedes cambiarlo editando el archivo ~/.vnc/xstartup. Debes cambiar la última línea de “twm &” a por ejemplo “wmaker &” para el entorno de WindowMaker.

Para conectarte a la cárcel vnc, debes escribir en vncviewer jail_ip_address y el puerto vnc. Ej. 192.168.2.2:1

Algunos errores con vnc en la cárcel: Cuando tienes un mensaje de colores no reconocidos, debes editar el archivo /usr/local/bin/vncserwer y cambiar la línea:

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

Cuando tenemos el mensaje
!!!!!!!!!!!!!!!!!!!!!!!!!!
no hay pantalla libre en jailname

Debes editar /usr/local/bin/vncserver y cambiar la función pack a sockaddr_in en dos líneas en la función CheckDisplayNumber:

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

El código debería ser así:

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);

Reenvío de puertos en IPWF para cárceles

Si deseas reenviar algunos puertos a la cárcel, debes haber compilado un kernel de FreeBSD con algunas opciones habilitadas:

options  IPFIREWALL
options  IPFIREWALL_DEFAULT_TO_ACCEPT
options  IPFIREWALL_VERBOSE
options  IPFIREWALL_FORWARD
options  IPDIVERT

Regla de reenvío de puertos:

ipfw add fwd ip_adres_jail,port_jail tcp from any to adresip_local port_local
ej.
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

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.