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
``Get new posts in your inbox
No spam. Unsubscribe anytime.