FreeBSD · 4 min read · Jan 24, 2026

Создание тюрьмы с VNC сервером на FreeBSD

Создание тюрьмы с VNC сервером на FreeBSD

Эта статья объясняет, как вы можете запустить VNC сервер изнутри тюрьмы на FreeBSD.

Создание тюрьмы из исходников:

Создайте директорию, где будут храниться наши тюрьмы:

# mkdir -p /home/jails

Или в директории /usr:

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

Перейдите в директорию /usr/src и проверьте, есть ли у вас исходный код FreeBSD.

# cd /usr/src
# ls

Вы должны увидеть что-то подобное:

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

Если у вас пустая директория или только директория sys, вам необходимо установить исходный код FreeBSD:
Вы можете сделать это, запустив sysinstall или загрузив исходный код из cvs.

# sysinstall

Перейдите в конфигурацию, затем в дистрибуции и выберите “src”, затем нажмите ok. После этого у вас должен быть весь исходный код в директории /usr/src/. Затем вы должны обновить свой исходный код до последней версии из cvs. Вам нужно создать файл “stable-supfile” в вашей домашней директории или где-то еще.

# vi ~/stable-supfile

И вставьте туда несколько строк, как показано ниже:

# Ваш ближайший зеркальный сервер исходного кода freebsd, для меня это из Польши
*default host=cvsup.pl.FreeBSD.org
*default base=/usr
*default prefix=/usr
# для версии 7.2 FreeBSD вы указываете 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

Далее, после того как вы сохраните файл, вы можете обновить свой исходный код FreeBSD с помощью csup:

# csup /root/stable-supfile

После этого вы можете скомпилировать свою тюрьму из исходного кода:

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

Когда вы один раз скомпилируете World, вы можете создавать новые тюрьмы с помощью двух команд, не компилируя world снова:

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

Когда ваша тюрьма готова, вам нужно внести некоторые изменения в конфигурационные файлы.

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

И вы вставляете туда:

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

Запуск тюрьмы в первый раз:

Чтобы запустить тюрьму, вам нужно смонтировать devfs в тюрьму:

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

Затем вам нужно настроить алиас для вашего сетевого интерфейса. В моем FreeBSD у меня есть интерфейс bge0, и алиас я создаю так:

# ifconfig bge0 alias 192.168.2.2

Запуск тюрьмы:

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

Когда вы находитесь в тюрьме, вы можете установить пароль для root:

# passwd

Затем вам нужно добавить одну учетную запись не-root, которая даст вам доступ к тюрьме через ssh.

# adduser

Чтобы покинуть тюрьму, вам нужно использовать команду exit.

# exit

Ваша тюрьма почти готова. Вам нужно добавить несколько строк в файл /etc/rc.conf, и после этого ваша тюрьма будет запускаться, когда ваш сервер будет запускаться.

# алиас для вашего сетевого интерфейса
ifconfig_bge0_alias0="192.168.2.2"
# строка, которая включает тюрьмы в freebsd
jail_enable="yes"
# список ваших тюрем, например: "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"

Если вы хотите иметь дерево портов в тюрьме и не хотите его дублировать, мы можем смонтировать директорию /usr/ports/ в тюрьму одной строкой в файле /etc/fstab. Строка будет выглядеть так:

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

Запуск и остановка тюрем без перезагрузки системы:

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

Если вы хотите получить список ваших тюрем, вы можете получить его с помощью этой команды:

# jls

Установка xorg и vnc в тюрьму из пакетов:

# pkg_add –r xorg
# pkg_add –r vnc

Чтобы запустить vnc от имени учетной записи пользователя, вы пишете:

$ vncserver

Когда вы в первый раз запускаете vncserver, вам нужно установить пароль для подключения к vnc.

По умолчанию, когда вы подключаетесь к vnc, будет запущен twm. Вы можете изменить это, отредактировав файл ~/.vnc/xstartup. Вам нужно изменить последнюю строку с „twm &” на, например, „wmaker &” для окружения WindowMaker.

Чтобы подключиться к vnc тюрьме, вы должны ввести в vncviewer jail_ip_address и порт vnc. Например, 192.168.2.2:1

Некоторые ошибки с vnc в тюрьме: Когда у вас появляется сообщение о нераспознанных цветах, вам нужно отредактировать файл /usr/local/bin/vncserwer и изменить строку:

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

Когда у нас появляется сообщение
!!!!!!!!!!!!!!!!!!!!!!!!!!
no free display on jailname

Вам нужно отредактировать /usr/local/bin/vncserver и изменить функцию pack на sockaddr_in в двух строках в функции CheckDisplayNumber:

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

Код должен выглядеть так:

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

Перенаправление портов в IPWF для тюрем

Если вы хотите перенаправить некоторые порты в тюрьму, вам нужно скомпилировать ядро FreeBSD с включенными некоторыми опциями:

options  IPFIREWALL
options  IPFIREWALL_DEFAULT_TO_ACCEPT
options  IPFIREWALL_VERBOSE
options  IPFIREWALL_FORWARD
options  IPDIVERT

Правило перенаправления порта:

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

Get new posts in your inbox

No spam. Unsubscribe anytime.