Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> настройка —> jail

Установка и настройка клеток (jail) на FreeBSD6.1

Автор: lissyara.


    И снова по просьбам трудящихся :))) На самом деле, статья эта не столько по просьбам народа, а больше по собственной необходимости - мне понадобилось поднять три самбы на одном хосте, в качестве контроллеров домена для трёх разных доменов. Подумавши, рассудил, что колупаться с тремя стартовыми конфигами, тремя конфигами, и т.д. не хочу. К тому же, не было уверенности, что всё удастся сделать через конфиги и параметры запуска, может придётся ковырять исходники, или Makefile, накрайняк. Кроче - ломало. Поэтому и затеял это - поднять их в отдельных клетках, и пусть себе пашут.
   Итак - теория :). Клетки (jail) появились с FreeBSD4.0 - причём в плане кодинга обошлись они поразительно дёшево - всего чё-то около 400 строк в коде ядра, для добавления туда поддержки клеток. Ну и всё. В клетке всё как вреальной машине, за тем исключением, что не работают сетевые приложения которым нужен прямой доступ к сетевым сокетам (например ping). Ну а в остальном - полноценная машина, кроме мелочей - shutdown не работает и т.п.
   Исходные данные: двухголовая машина 2xPIII 450MHz, чё-то около 512RAM, пара SCSI-дисков - под сиcтему и под раздел /usr, FreeBSD6.1. После вдумчивого прочтения "man jail", где кстати, всё расписано, для своего удобства, стругаем такой скриптик:
/usr/home/lissyara/jail/>cat jail_create.sh
#!/bin/sh

# скрипт создания клеток

case "$2" in
        create)
                # стругаем клетку
                jail_dir="$1"
                mkdir -p ${jail_dir}
                cd /usr/src
                mkdir -p ${jail_dir}
                make world DESTDIR=${jail_dir}
                cd /usr/src/etc
                make distribution DESTDIR=${jail_dir}
                mount_devfs devfs ${jail_dir}/dev

                ;;
        *)
                echo ""
                echo "Usage: `basename $0` { /path/to/jail/directory create }"
                echo ""
                exit 64
                ;;
esac

Ну и запускаем его:
/usr/home/lissyara/jail/>
/usr/home/lissyara/jail/>./jail_create.sh /usr/local/jails/jail_test create


/usr/home/lissyara/jail/>./jail_create.sh /usr/local/jails/jail_test create
--------------------------------------------------------------
>>> make world started on Wed Aug  9 12:58:26 MSD 2006
--------------------------------------------------------------

--------------------------------------------------------------
>>> Rebuilding the temporary build tree
--------------------------------------------------------------

Понеслась. Пока он собирает мир, готовимся - надо на родительской машине (реальной) завести альясы для клеток - у каждой клетки должен быть свой IP адрес. Добавляем в /etc/rc.conf такие строки:
# IP реальной машины
ifconfig_ed0="inet 192.168.0.200 netmask 255.255.255.0"
# альяс для первого jail`a
ifconfig_ed0_alias0="inet 192.168.0.201 netmask 255.255.255.0"
# альяс для второго jail`a
ifconfig_ed0_alias1="inet 192.168.0.202 netmask 255.255.255.0"

Заставляем работать sshd на одном адресе:
/usr/home/lissyara/>cat /etc/ssh/sshd_config | grep ListenAddress
ListenAddress 192.168.0.200
#ListenAddress ::
/usr/home/lissyara/>

Вешаем syslogd на тот же адрес:
/usr/home/lissyara/>cat /etc/rc.conf | grep syslo
syslogd_flags="-b 192.168.0.200"
/usr/home/lissyara/>

После чего, если мир дособирался и проинсталлился (у меня ушло часа три-четыре), перезагружаем машину - можно и без перезагрузки, но с ней надёжней - вылезут все возможные ошибки. До перезагрузки у меня было так:
/usr/home/lissyara/>sockstat | grep "*."
root     inetd      494   5  tcp4   *:21                  *:*
root     sendmail   451   3  tcp4   127.0.0.1:25          *:*
root     sshd       445   3  tcp4   *:22                  *:*
root     syslogd    325   6  udp4   *:514                 *:*
/usr/home/lissyara/>

Ну а после стало так:
/usr/home/lissyara/>sockstat | grep "*."
root     inetd      462   5  tcp4   192.168.0.200:21      *:*
root     sendmail   417   3  tcp4   127.0.0.1:25          *:*
root     sshd       411   3  tcp4   192.168.0.200:22      *:*
root     syslogd    291   6  udp4   192.168.0.200:514     *:*
/usr/home/lissyara/>

Проверяем, все ли альясы подцепились:
/usr/home/lissyara/>ifconfig
plip0: flags=108810<POINTOPOINT,SIMPLEX,MULTICAST,NEEDSGIANT> mtu 1500
ed0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet 192.168.0.200 netmask 0xffffff00 broadcast 192.168.0.255
        inet 192.168.0.201 netmask 0xffffff00 broadcast 192.168.0.255
        inet 192.168.0.202 netmask 0xffffff00 broadcast 192.168.0.255
        ether 00:80:c8:24:a5:d2
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        inet 127.0.0.1 netmask 0xff000000

Создаём в клетке пусой файл /etc/fstab
/usr/home/lissyara/>touch /usr/local/jails/jail_test/etc/fstab

Создаём в ней файл /usr/local/jails/jail_test/etc/resolv.conf такого содержания:
nameserver 192.168.0.3

Добавляем в файл /usr/local/jails/jail_test/etc/rc.conf такие строки (если там нужны эти демоны)
sshd_enable="YES"
inetd_enable="YES"

Затем на родительской машине добавляем такие строки в /etc/rc.conf
# запускать ли клетки
jail_enable="YES"
# список имён jail`ов разделённый пробелами, типа
# jail_list="test tets1 test2 test3"
jail_list="test"
# Разрешить руту в клетке изменять её имя хоста
jail_set_hostname_allow="YES"
# дальше настроки специфичные для кажой клетки
# корневая директория клетки `test`
jail_test_rootdir="/usr/local/jails/jail_test"
# имя хоста для клетки `test`
jail_test_hostname="test-jail.local"
# IP-адрес клетки `test`
jail_test_ip="192.168.0.201"
# Монтировать devfs в клетке `test`
jail_test_devfs_enable="YES"
# монтировать procfs в клетке `test`
jail_test_procfs_enable="YES"
# Флаги для клетки `test`
jail_test_flags="-l -U root" 

Затем заводим пользователя и даём руту в клетке пароль, для этого входим в клетку:
/usr/home/lissyara/>jail /usr/local/jails/jail_test/ test 192.168.0.201 /bin/csh

И заводим пользователя командой useradd. Не забываем задать пароль для рута. Выходим из клетки командой exit, и можно запускать:
/usr/home/lissyara/>/etc/rc.d/jail start
Configuring jails:.
Starting jails: test-jail.local.
/usr/home/lissyara/>

Запуск может занять много времени (минут 5), т.к. sshd генерит ключи. Последующие запуски будут гораздо быстрей. Для ускорения, можно положить свои ключи, с реального хоста.
   C клеткой можно работать точно также как и с реальной машиной - ставить приложения, запускать. Едиственое что - на -реальной машине, при установке любых приложений нужно не забывать вешать их на тот IP адрес который ей принадлеит - большинство приложений по дефолту слушают все адреса. Работает всё точно также шустро как и на реальной машине.



размещено: 2006-08-10,
последнее обновление: 2007-01-17,
автор: lissyara


Abigor, 2006-08-10 в 14:08:26

хорошоя статья, можно сказать man jail только RU вариант. у меня в jail вертится web хотинг, так как большая часть сайтов дырявая. боротся с этим смысла нет так как это можно сказать сервер для homepages единственное что я бы добавил, а квотирования места на диске. я это сделал вот так
dd if=/dev/zero of=jail_fs bs=1024 8388608 (это в килобайтах)
а потом
mdconfig -a -t vnode -f jail_fs -u 0
tunefs -n enable /dev/md0
mount /dev/md0 /var/www_web/jail
ну и ставим в /var/www_web/jail если кому надо поделючь стартовым скриптом чтоб монтировать так fs

Abigor, 2006-08-16 в 14:31:01

Расскажи как пользоваться вот этим
#jail_example_fstab=""                          # fstab(5) for mount/umount
было бы интересно

Key, 2006-09-19 в 17:31:02

У меня на сервере три сетевых интерфейса: fxp0, bge0, bge1 - настроен fxp0, на нем же алиасы для jails, имеем:
# /etc/rc.d/jail start test
Configuring jails:.
Starting jails:ifconfig:interface aliasdoes not exist
test.local
#
Почитал man jail и нашел советы добавить в /etc/rc.conf jail'ла следующие строки:
rpcbind_enable="NO"     # отключить портмаппер
network_interfaces=""   # отключать конфигурацию интерфейсов для подавления стартовых ошибок об ifconfig(8)
Сделал - не помогло, по-прежнему созерцал ругательства ifconfig. Полез в /etc/rc.d/jail и нашел там опцию "jail_${_j}_interface". Чтож, пишем в /etc/rc.conf ко всему прочему:
jail_test_interface="fxp0" # интерфейс, на котором алиасы для jail
Заработало. Не ругается )
И не забудьте установить временную зону в jail перед установкой портов ;)

Lupus, 2006-11-09 в 13:53:35

make world DESTDIR=${jail_dir}
Здесь надо добавить > cd etc
make distribution DESTDIR=${jail_dir}

pym, 2006-12-19 в 0:57:02

думал, алиасы должны иметь разные маски..

lissyara, 2006-12-19 в 8:31:24

Смотря на какой версии FreeBSD.
Например, на 4.11 с такими масками бы не прокатило. Пришлось бы забивать 255.255.255.255. Шестёрка и так и так понимает.

AirKing, 2007-01-17 в 18:47:36

Товарищщи!
Клетку создал без проблем, а как ее удалить, у меня много файлов не удаляются. хотя удаляю рутом с основной машины.

lissyara, 2007-01-17 в 22:11:24

man chflags

maslivets, 2007-04-09 в 18:47:57

Было бы не плохо добавить сюда практическое использования jail.
Хотя бы на примере ВЕБ-сервера (Apache+PHP+MySQL).
Ну и бекап/рековер jail.

Vitaly, 2007-04-12 в 13:42:19

у меня в jail крутится exim+dovecot+dspam+mysql+Apache+PHP - почта на пару десятков пользователей. и неплохо так крутится ;) только вот чтоб рестартонуть jail приходится ребутить машину полностью - если делать через /etc/rc.d/jail restart - то в jls показывает что у тебя 2 клетки вместо одной запущено - хотя реально запущена одна. это немного нервирует - хотя даже и так глюков замечено небыло

Vitaly, 2007-04-12 в 13:45:28

бэкап делается элементарно
/etc/rc.d/jail stop и потом tar'ум со сжатием и не забываем об опции -p в tar ;) при распаковке -р тоже пригодится ;)

maslivets, 2007-04-14 в 3:52:46

Очень много времени потратил на поиск того как свзяать две клетки... т.е. допустим на одном (jail#1) крутится MySQL с опцией (skip-networking), а на втором (jail#2) Apache+PHP и сюда нажо как то пеместить /tmp/mysql.sock
Вроде как задача решается "ln /jail#1/tmp/mysql.sock /jail#2/tmp/mysql.sock" но вот стартовать этот скрипт необходимо только после старта первого jail#1.
Пришлось лезть в /etc/rc.d/jail и редактировать его. А имено процедурки Jail_start() и Jail_stop(). Причем таким образом, что в начале процедуры Jail_start() прописать "rm /jail#2/tmp/mysql.sock" [на случай если кто, то задел кнопку рестарта (:] а в конце "ln /jail#1/tmp/mysql.sock /jail#2/tmp/mysql.sock", а в процедуре Jail_stop() точней в конеце ее "rm /jail#2/tmp/mysql.sock".
Могу еще заметить, что для компиляции PHP в jail#2 пришлось с портов качать клинет для MySQL он весит порядка 800К хотя вероятно есть более простые варианты.

Askel, 2007-06-18 в 15:53:17

А mkdir -p ${jail_dir} после jail_dir="$1" можно и убрать

ipfw, 2007-09-07 в 10:22:15

Чтобы не править sshd_config можно ограничиться правкой rc.conf
sshd_flags="-o ListenAddress=192.168.0.1"

cj_nik, 2007-10-08 в 22:06:47

Жаль только им роуты разные нельзя задавать... defaultroute :(
Или я что-то недопонял?

cj_nik, 2007-10-09 в 14:33:32

> В клетке всё как вреальной машине, за тем исключением, что не работают сетевые приложения которым нужен прямой доступ к сетевым сокетам (например ping)
ну можно включить чтобы работали ыерез sysctrl.
а вот роуты, чёрт я так надеялся... :(

Александр, 2007-11-13 в 16:28:33

Насколько понял для каждого Jail окружения нужен свой IP адрес, а как быть если у меня несколько окружений (BIND, Web, MailRelay) а нужно что бы все это сверьё на одном IP слушало.

Александр, 2007-11-13 в 16:33:10

> В клетке всё как вреальной машине, за тем исключением, что не работают сетевые приложения которым нужен прямой доступ к сетевым сокетам (например ping)
ну можно включить чтобы работали ыерез sysctrl.
а вот роуты, чёрт я так надеялся... :(

Подробностей пожалуйста или ссылку плз.

cj_nik, 2007-12-18 в 15:37:48

>> Подробностей пожалуйста или ссылку плз.
Подробности чего?
Роуты мне нужн ыбыли разные для jail и для реальной машины, типа как в виртуальной машине.

хотел несоклько squid рассадить по jail-сам и у каждого свой defaultrouter но надо было почитать сначала :)

Spank, 2008-01-15 в 19:47:13

имхо лучше ezjail использоветь, много головной боли пропадает. У мну на нем поднято www 3 клетки, в одной из которых висят cacti и мониторят все что попало. На другой машине в разных клетках verlihub,icecast,dns,asterisk,games(cs-1.6,quake,batlenet) Фсе работает просто супер.
Что бы включть ping и прочее в /etc/sysctl.conf пишем строку security.jail.allow_raw_sockets=1 . Если кому нужно напишу как использовать ezjail...

vadiko, 2008-01-16 в 22:16:48

2 Spank. Ну так ждемс от Вас статеечку с коментариями: мол тут bla-bla-bla и тут bla-bla-bla головняка много меньше, и т.д. ЗЫ: слышал лестное о ezjail, интересненько...

paix, 2008-01-18 в 22:13:27

Да нечего там использовать...просто все как 5 копеек, все по ману практически.

ezjail-admin install
ezjail-admin create -r /jails/web12 web12.test.org 10.0.1.12
/usr/local/etc/rc.d/ezjail.sh start web12.test.org

все джаил поднят и работает.

paix, 2008-01-18 в 22:16:01

Первый раз, правда, рекомендую установить руками дабы пронаблюдать и понять процесс. Дальше ezjail. Сэкономите много времени и нервов.

L00p, 2008-04-22 в 14:31:11

хорошая статья, всё поднялось очень быстро. поднимал на 7.0 amd64 ветке,  ( (тут надо учесть что в ней убрали все mount_* и команда "mount_devfs devfs ${jail_dir}/dev" будет выглядеть как "mount -t devfs devfs ${jail_dir}/dev") ещё пришлось отказаться от ntpd в общей системе, который как оказалось слушает все интерфейсы. хотя можно было порыться в исходниках, да лень:)

paix, 2008-04-22 в 18:26:19

openntpd умеет не слушать все интерфейсы.

PS. сегодня апдейтил 6х->7х, соотвественно в джайлах тоже пришлось мир апдейтить. Еще раз порадовался ezjail :) такая вот реклама ))

tr, 2008-05-18 в 11:53:54

Создаём в клетке пусой файл /etc/fstab

Лис, не "пусой", а "пустой"! Букву упустил.

mrali, 2008-07-14 в 21:10:14

/usr/home/lissyara/>jail /usr/local/jails/jail_test/ test 192.168.0.201 /bin/csh

можно заменить на jexec JID
JID легко узнать командой jls

Тест, 2008-12-06 в 18:54:37

Товарищщи!  Это поля для ввода комментариев к статье, а не для вопросов. Сюда пишите найденные баги, или какие-то фичи :)
Для вопросов есть форум!

Askel, 2008-12-11 в 19:05:13

А разве когда прописываются алиасы из той же подсети, не /32 используется. Что-то память моя говорит, где-то в хенбуке читал

Sukinsky, 2009-01-21 в 9:36:24

В продолжение комментария maslivets, 2007-04-14 в 3:52:46
Можно проще связать две клетки без симлинков и правки скриптов.

Подмонтировать можно как папки из основной системы, так и папки разных клеток. Само собой монтировать надо от рута в основной системе.

В этом примере юникс-сокет mysql из клетки с БД будет доступен в клетке с веб-сервером:
mount_nullfs /var/jails/mysql/var/run/mysqld/ /var/nginx/var/www/mysql/

Sukinsky, 2009-01-23 в 11:01:40

И еще. если конструкция сверху не заработала, например, mysql не соединяется через юникс-сокет (ошибка 61), следует внести пару строк в исходник и пересобрать ядро :)
-— null_subr_old.c  
+++ null_subr.c
@@ -247,6 +247,8 @@
       xp->null_vnode = vp;
       xp->null_lowervp = lowervp;
       vp->v_type = lowervp->v_type;
+       if (vp->v_type == VSOCK || vp->v_type == VFIFO)
+       vp->v_un = lowervp->v_un;
       vp->v_data = xp;
       vp->v_vnlock = lowervp->v_vnlock;
       if (vp->v_vnlock == NULL)

Askel, 2009-02-13 в 9:56:15

Для 7 ветки, правильнее будет (man jail)

make world DESTDIR=${jail_dir}
make distribution DESTDIR=${jail_dir}
mount -t devfs devfs ${jail_dir}/dev

Yukh, 2009-02-25 в 19:37:48

Небольшое уточнение.

Alias-ы немного не так должны выглядеть. Нельзя на один интерфейс повесить несколько адресов из одной сети. Поэтому:

НЕ:

# IP реальной машины
ifconfig_ed0="inet 192.168.0.200 netmask 255.255.255.0"
# альяс для первого jail`a
ifconfig_ed0_alias0="inet 192.168.0.201 netmask 255.255.255.0"

А:

# IP реальной машины
ifconfig_ed0="inet 192.168.0.200 netmask 255.255.255.0"
# альяс для первого jail`a
ifconfig_ed0_alias0="inet 192.168.0.201 netmask 255.255.255.255"

Проверил на себе - работает, в отличие от варианта указанного в статье.

lissyara, 2009-02-25 в 19:57:11

Для версии ОС указанной в статье - всё работало именно так.

Yukh, 2009-02-25 в 20:08:20

Странно, как то давно пытался поднять несколько адресов из одной сети на одном интерфейсе - система упорно ругалась и отказывалась работать с этими адресами.

igor, 2009-03-17 в 2:17:05

когда-то давно я глядя на mod_chroot сделал mod_jail (он есть в портах), но он имел недостатки, например, не мог перечитать конфиги (apachectl graceful). Недавно, начиная с версии 2.2.10, в apache появилась встроенная поддержка chroot, его логика работы отличается от mod_chroot - чрутится каждый child отдельно. Я чуток переписал под jail, патч и порт   здесь.

FOX, 2009-04-27 в 0:57:07

Добрый вечер ребята обяснити что такое jail для чего он надо? ПРосто что то я не вкурю!) Спасибо за внимание!)

amd_miek, 2009-05-22 в 13:37:23

А мне вот что интересно, а нельзя ли как-нибудь справиться с проблемами слушания различными демонами на всех портах средствами файрволов, например просто перенаправлять запросы или какой нибудь SNAT применять?

neotkm, 2009-10-14 в 2:52:52

to amd_miek
Проблема в том что демон биндит порт монопольно, соответственно другие попытки его занять будут без успешны. Так что фаерволы-наты тут не помогут.

FreeBSP, 2009-12-22 в 14:07:45

маленькое замечание по скрипту

               mkdir -p ${jail_dir}
               cd /usr/src
               mkdir -p ${jail_dir}

зачем дважды создавать одну и ту же папку? ))

nemilen, 2010-01-08 в 21:54:54

Abigor - мудак.
Диск для джейла создается следующим образом:
#Создаем файл с ноликами объемом в 2Гб
dd if=/dev/zero of=fs_jail1 bs=1M count=2048
#Аттачим файл к /dev/md0 (для md1 нужно указывать -u 1)
mdconfig -a -t vnode -f fs_jail1 -u 0
#Создаем файловую систему на диске (UFS)
newfs md0
#Создаем папку и маунтим диск
mkdir /jails/host.ru
mount /dev/md0 /jails/host.ru

Затем создаем джейл в этой папке и запускаем
ezjail-admin create host.ru 10.0.0.100

В итоге получится такая картина
# df -h
Filesystem    Size    Used   Avail Capacity  Mounted on
/dev/md0      1.9G    1.9M    1.8G     0%    /

Увеличивать квоту, видимо, придется через dd.

evafobia, 2010-01-31 в 13:24:02

>>Затем заводим пользователя и даём руту в клетке >>пароль, для этого входим в клетку:
Зачем входить в клетку?
Проще использовать jexec [jail_pid] adduser
Для этого jexec и создан.

gonzo111, 2010-06-17 в 12:41:51

Чтоб не сильно грузить сервак при сборки портов
лучше писать nice -10 make portupgrade
а в клетке nice -10 jexec -u root 1 portupgrade

Blitzkrieg, 2010-10-07 в 23:39:30

А что мешает не делать алиас на интерфейс, а при запуске джейла задать ip адрес основной системы?
Я так сделал, все пашет. При этом поднявшийся sshd в джейле отвечал при подключении, а не sshd родительской системы.
И вопрос: как из основной системы сунуть сокет от mysql, нульфс не проканало, при тыкании в сокет телнетом пишет коннекшн рефьюз.

iZEN, 2011-08-11 в 11:57:33

Вот тут http://myfreebsd.ru/other/sozdanie-jail-v-freebsd-8-0
разобраны примеры для 8.x версии FreeBSD.

ttys, 2011-10-19 в 21:04:58

всё равно как то криво работает, апач становится отказался пхп тоже, может из за того что всё на zfs крутится, хз. но вот с ezjail всё заработало
http://dreamcatcher.ru

fox, 2011-10-19 в 21:46:51

Да с jail не когда проблем не было! Это может угол кривизны рук играет роль?

ttys, 2011-10-20 в 7:15:43

хз глюк именно в сборке из портов - их через нуллфс подмапил сам хост zfs + gpt
2 fox а по поводу кривизны и тд:
если есть чё по делу то говори, а тролить можешь на ЛОРе

fox, 2011-10-20 в 11:07:47

Да я не тролю. Просто я не вижу проблемы если приблизительно действовать по статье то всё ок! насчёт портов, у БСД такое бывает иногда как например несовместимость зависемостей, но проходит день другой и всё становится на круги свои...

ttys, 2011-10-20 в 19:47:54

с ezjail всё отлично =)

romko, 2011-12-22 в 10:45:44

товарищи, помогите вот с чем. есть 2 внешних ипа в разных диапазонах с разными шлюзами соответсвенно. в основной системе один, а в клетке хочу другой, как сделать, будет ли работать если я присвою клетке второй ip и в rc.conf (в jail) укажу нужный defaultrouter ?

fox, 2011-12-22 в 21:26:25

Я думаю без танцев с бубном и fwd не обойтись) Или route править прейдётся...



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.1848 секунд
Из них PHP: 56%; SQL: 44%; Число SQL-запросов: 77 шт.
Исходный размер: 60080; Сжатая: 14076