Настройка Jail в FreeBSD 11.1

    Введение


    На написание данной публикации меня подтолкнул тот факт, что в сети интернет крайне мало информации по администрированию Jail в FreBSD. Можно конечно найти отличные публикации на эту тему, но они, в основном, по большей части были написаны много лет назад, и не затрагивают новые возможности Jail и самой операционной системы FreeBSD.
    Публикацию разделю на две части. В первой части пойдёт речь о подготовке и настройке FreeBSD, а во второй части пойдёт речь непосредственно о создании Jail.

    Часть 1. Подготовка и настройка FreeBSD.


    Для того что-бы всё, что здесь написано корректно заработало, необходимо использовать FreeBSD версии 11.1, так-как начиная с данной версии в системе включена поддержка ограничения дискового ввода/вывода и т.п. Если в этом нет необходимости, тогда подойдёт версия 10.X.
    Добавим в rc.conf несколько параметров:

    sysrc jail_enable="YES"
    sysrc rctl_enable="YES"
    sysrc rctl_rules="/etc/rctl.conf"
    sysrc zfs_enable="YES"
    sysrc ifconfig_em0_alias="192.168.1.105/24"
    

    Первая строка указывает Jail автоматически запускаться с системой, вторая строка указывает включение ограничений для Jail, третья строка указывает на файл правил с ограничениями. В четвёртой строке активируется возможность использовать файловую систему ZFS(все Jail будут сохранены на разделах ZFS), этот параметр необходим если система использует родную файловую систему UFS. Запустить ZFS можно командой:

    /etc/rc.d/zfs start
    

    Пятая строка создаёт алиас для Jail, если необходимо несколько Jail, то в том случаи добавьте необходимое количество ip алиасов(так-как я использую VMware ESXI название сетевой карты у меня em0, Вам необходимо использовать название своей карты).
    В FreeBSD по умолчанию ядро собрано с отключённой возможность ограничивать ресурсы, но к счастью данное ограничение легко устранить, достаточно добавить одну строку в файл loader.conf, командой:

    echo 'kern.racct.enable="1"' >> /boot/loader.conf
    

    Изменения вступят в силу после перезагрузки системы. Так-же необходимо включить поддержку протокола iscsi, так-как резервное копирование будет осуществляться именно через этот протокол, добавить поддержку можно следующей командой:

    echo 'iscsi_initiator_load="YES"' >> /boot/loader.conf
    

    Изменения вступят в силу после перезагрузки системы.
    Последнее, что необходимо настроить в системе(если не считать самого Jail) — firewall на ipfw. Следующая команда создаст файл с правилами ipfw:

    ee /etc/firewall.sc
    

    В данный файл необходимо внести следующие строки:

    ipfw -q -f flush
    c="ipfw -q add "
    
    $c 00105 allow tcp from any to 192.168.1.105 80 setup keep-state
    
    $c 00110 allow tcp from any to me 22 setup keep-state
    $c 00140 allow tcp from me to any 443,80,21,53,3260 setup keep-state
    $c 00143 allow icmp from me to any keep-state
    $c 00144 allow udp from me to any 53 keep-state
    
    $c 40533 deny all from any to any frag
    $c 40534 deny all from any to any established
    $c 40535 deny all from any to any
    

    Данные правила разрешат всем Jail осуществлять исходящие подключения через порты 443, 80, 21, 53, 3260(iscsi), а так-же будет возможность подключаться ко всем Jail через SSH. Строка:

    $c 00105 allow tcp from any to 192.168.1.105 80 setup keep-state
    

    отвечает зак подключение к будущему Jail, а в частности для вэб сервера, если необходимо добавить другие порты, то укажите их через запятую(80,21,443,68 и т.д). Если необходимо подключение udp, то необходимо скопировать строку и заменить tcp на udp, и изменить номер строки, а также убрать setup, так-как протокол udp не имеет флага SYN:

    $c 00105 allow tcp from any to 192.168.1.105 80,21,22,443 setup keep-state
    $c 00106 allow udp from any to 192.168.1.105 53 keep-state
    

    Выполните последовательно команды:

    sysrc firewall_enable="YES"
    sysrc firewall_script="/etc/firewall.sc"
    service ipfw start
    

    После выполнения данных команд, скорее всего, необходимо переподключиться по SSH. На этом начальная настройка закончена, перейдём к настройки сервера iscsi target.

    Настройка iscsi target
    Для настройки необходим ещё один сервер в сети, или виртуальная машина(как в моём случае).
    Для настройки iscsi target будем использовать ctld(входит в состав FreeBSD), добавим запись в rc.conf:

    sysrc ctld_enable="YES"
    

    На следующем шаге необходимо создать файл конфигурации для ctld:

    ee /etc/ctl.conf
    

    В созданный файл добавьте строки:

    auth-group      group1 {
                 chap "user"        "password1234"
                 }
    
         portal-group pg0 {
                 discovery-auth-group group1
                 listen 192.168.1.106:3260
         }
    
         target iqn.iscsi:target1 {
                 alias "Example target"
                 auth-group group1
                 portal-group pg0
                 lun 0 {
                         path /dev/md0
                         size 10G
                 }
         }
    

    В строке chap укажите необходимое имя и пароль(минимум 12-ть символов). Название
    в строке target обязательно должно начинаться на iqn. В строке listen укажите ip адрес текущего сервера. В строке path укажите путь к диску.
    Здесь указан виртуальный жёсткий диск, если используете физический, то укажите его, а если желаете использовать виртуальный, то читаем дальше. Перейдите в каталог в котором желаете создать файл для виртуально жёсткого диска и выполните команду:

    dd if=/dev/zero of=disk bs=1k count=10m
    

    Параметр count отвечает за количество гигабайт, в данном случаю создастся файл размером 10 гигабайт, если укажите другое число, то в этом случаи необходимо изменить параметр LUN 0 в ctl.conf. Данные процесс занимает относительно не много времени. После того как процесс завершиться, в текущей папке создастся фай disk, осталось только создать виртуальный жесткий диск командой:

    mdconfig -a -t vnode -f disk
    

    После выполнение данной команды отобразиться название виртуально диска (в моём случаи — md0), если название отличается, то так-же необходимо изменить параметр LUN 0 в ctl.conf. Для того что-бы данный диск не пропал после перезагрузки, необходимо выполнить команду:

    sysrc mdconfig_md0="-a -t vnode -f disk"
    

    Либо укажите путь до файл:

    sysrc mdconfig_md0="-a -t vnode -f /home/user/disk"
    

    Остался один штрих — firewall. Как и на основной системе создайте файл:

    ee /etc/firewall.sc
    

    Добавьте строки:

    ipfw -q -f flush
    c="ipfw -q add "
    
    $c 00110 allow tcp from any to me 22,3260 setup keep-state
    $c 00140 allow tcp from me to any 443,80,21,53,3260 setup keep-state
    $c 00143 allow icmp from me to any keep-state
    $c 00144 allow udp from me to any 53 keep-state
    
    $c 40533 deny all from any to any frag
    $c 40534 deny all from any to any established
    $c 40535 deny all from any to any
    

    После того как сохраните изменения, введите:

    sysrc firewall_enable="YES"
    sysrc firewall_script="/etc/firewall.sc"
    service ipfw start
    

    На этом настройка сервера iscsi закончена, теперь приступим к настройки непосредственно Jail.

    Часть 2. Настройка Jail


    Начиная с версии FreeBSD 9 настройка Jail вынесена в отдельный файл — /etc/jail.conf. Давайте создам данный файл и внесём необходимые изменения, введите команду:

    ee /etc/jail.conf
    

    В данный файл необходимо внести следующие строки:

        allow.raw_sockets = 1;
        exec.clean;
        exec.start = "/bin/sh /etc/rc";
        exec.stop = "/bin/sh /etc/rc.shutdown";
        mount.devfs;
        allow.set_hostname = 1;
        allow.sysvipc = 1;
        jail1 {
            host.hostname = "jail";
            path = "/jails/1/";
            interface = "em0";
            ip4.addr = 192.168.1.105;
        }
    

    После того как сохраните изменения, можно приступать к сборке окружения Jail. Согласно данному файлу будет использоваться один Jail с именем jail1, если необходимо использовать дополнительный Jail, достаточно изменить вид файл следующим образом:

    allow.raw_sockets = 1;
        exec.clean;
        exec.start = "/bin/sh /etc/rc";
        exec.stop = "/bin/sh /etc/rc.shutdown";
        mount.devfs;
        allow.set_hostname = 1;
        allow.sysvipc = 1;
        jail1 {
            host.hostname = "jail";
            path = "/jails/1/";
            interface = "em0";
            ip4.addr = 192.168.1.105;
        }
        jail2 {
            host.hostname = "jail";
            path = "/jails/2/";
            interface = "em0";
            ip4.addr = 192.168.1.107;
        }
    

    В данной публикации будет рассмотрено создание одного Jail. Создадим каталог для будущего Jail командой:

    mkdir -p /jails/1
    

    Для создания окружения необходимы «исходники», проще всего установить их в процессе установки системы, или использовать subversion(довольно не приятный процесс). Для создания окружения перейдите в каталог /usr/src, командой:

    cd /usr/src
    

    Для создания окружения введите команду:

    make -j4 world DESTDIR=/jails/1
    

    Процесс довольно длительный, на моей системе установлен процессор Intel Core i5 3550, создание окружение заняло около часа. В команде создания окружения используется параметр -j4, число указывает на количество ядер у процессора, чем больше, тем быстрее. После того как окружение будет создано, необходимо добавить файлы конфигураций в jail командой:

    make distribution DESTDIR=/jails/1
    

    На этом создание окружения закончено. Введите команду:

    /etc/rc.d/jail start
    

    В вновь созданный Jail по ssh подключиться пока нету возможности, так-как ssh отключен. Для того что-бы зайти в jail выполните команду:

    jexec jail1
    

    Первое, что необходимо сделать — добавить DNS сервера, выполните:

    ee /etc/resolv.conf
    

    Добавьте в созданный файл строку:

    nameserver 8.8.8.8
    

    Осталось добавить учётную запись(внести её в группу wheel), создать пароль на root и запустить ssh, всё это можно проделать командами:

    adduser
    sysrc sshd_enable="YES"
    service sshd start
    passwd root
    

    Могу порекомендовать установить midnight commander:

    pkg install mc
    

    Во время установки mc подтянутся многие распространённые зависимости, такие как python, perl. После выполнения данных манипуляций необходимо выйти из данного jail командой exit. Далее останавливает jail:

    /etc/rc.d/jail stop
    

    Представьте ситуацию когда необходимо создать 5-ть jail, такая задача займёт много времени, но к счастью можно создать архив с содержимым данного jail, а так-же сохранить все права для файлов. Поможет в данной ситуации архиватор tar. Перейдём в каталог с jail:

    cd /jails/1
    

    Выполним команду:

    tar -zcvpf jail.tar *
    

    После того как архив будет создан, его необходимо переместить в другой каталог(данный каталог будет удалён):

    mv jail.tar /jail.tar
    

    Удалить каталог /jails не удастся до тех пор пока со всех файлов не будет убран «флаг» «неизменяемости»:

    chflags -R noschg /jails
    rm -rf /jails/
    

    Если что то не удалиться, то просто необходимо перезагрузить систему и выполнить команду rm -rf ещё раз. Приступим к созданию виртуального жёсткого диска, создадим файл для диска:

    dd if=/dev/zero of=disk bs=1k count=10m
    

    И непосредственно сам виртуальный диск:

    mdconfig -a -t vnode -f disk
    

    Добавим автоматическое создание диска:

    sysrc mdconfig_md0="-a -t vnode -f disk"
    

    Укажите название того диска который создался у Вас(если название отличается), а так-же путь к файлу для виртуального диска. Следующим шагом будет автоматическое подключение диска через iscsi. Для корректного подключению к диску необходимо создать файл конфигурации:

    ee /etc/iscsi.conf
    

    В данный файл внесите следующие изменения:

    iscsi_disk{
    authmethod=CHAP
    chapIName=user1
    chapSecret=password1234
    initiatorname=nxl
    TargetName=iqn.iscsi:target1
    TargetAddress=192.168.1.106:3260,1
    LoginTimeout=10
    AuthTimeout=10
    IdleTimeout=10
    ConnFailTimeout=10
    AbortTimeout=10
    ResetTimeout=10
    }
    

    Если настройки в файле ctl.conf выставлены в соответствии с данной публикацией, то подключение произойдёт корректно. Единственный способ для автоматического подключения диска через iscsi я нашёл только способом размещения скрипта в rc.d. Создадим данный скрипт:

    ee /etc/rc.d/iscsi.sc
    

    Добавьте следующие строки:

    iscontrol -c /etc/iscsi.conf -n iscsi_disk
    zfs mount jails/1
    /etc/rc.d/jail start
    

    Нужно учесть то, что если Вы создали ещё один jail, то его необходимо внести в данный скрипт(zfs mount jails/2 например). Первая строка подключает диск через iscsi, вторая строка монтирует файловую систему(если локальный жесткий диск «отвалился»), третья строка запускает jail. Осталось только сделать файл исполняемым:

    chmod +x /etc/rc.d/iscsi.sc
    

    После выполнения данного скрипта, или перезагрузки системы удалённый жесткий диск будет доступен для манипуляций. В моём случаи имя диска da1, Вам же необходимо использовать то имя которое используется у Вас. Создадим zfs pool из этих двух дисков:

    zpool create jails mirror md0 da1
    

    zfs pool будет зеркальным, как нетрудно догадаться из команды.
    Создадим раздел для jail:

    zfs create jails/1
    

    Назначим лимит на данный каталог в 5 гигабайт:

    zfs set quota=5g jails/1
    

    Скопируем архив с jail в каталог /jails/1 и перейдём в данный каталог:

    cp /jail.tar /jails/1
    cd /jails/1
    

    Распакуем данный архив и удалим его:

    tar -zxvpf jail.tar
    rm jail.tar
    

    Запустим jail:

    /etc/rc.d/jail start
    

    После данных манипуляций можно подключаться к jail по SSH, а так-же устанавливать необходимые роли для сервера. Осталось только настроить ограничения для Jail. Для того что-бы настроить rctl необходимо только добавить файл конфигурации:

    ee /etc/rctl.conf
    

    Добавьте в данный файл следующие строки:

    jail:jail1:memoryuse:deny=1073741824
    jail:jail1:readbps:throttle=4097152
    jail:jail1:writebps:throttle=4097152
    jail:jail1:pcpu:deny=50
    

    1-я строка ограничит использование памяти в 1 гигабайт, 2-я и 3-я строки ограничат использование чтения и записи на диск в 4 мегабайта, 4-я строка ограничивает использование каждого ядра на 50 процентов. Это далеко не весь список ограничений, в списке источников укажу ссылку на сайт FreeBSD где это подробно описывается. После сохранения данного файла необходимо перезагрузить rctl:

    service rctl restart
    

    Ограничения вступят в силу буквально в течение нескольких секунд.

    Дополнительно


    Можно было бы на этом закончить, но может возникнуть ситуация такая, что выйдет из строя не жёсткий диск, а сам сервер(например сгорит). В таком случаи можно использовать диск который находится на удалённом сервере, но просто так его использовать не удастся, первым делом необходимо остановить службу ctld и включить zfs:

    service ctld stop
    sysrc zfs_enable="YES"
    /etc/rc.d/zfs start
    

    После этого необходимо ввести команду:

    zpool import
    

    После выполнения данной команды на экране отобразятся все возможные пулы которые можно импортировать, в данном случаи пул jails, а имя диска будет отображено md0. Для того что бы смонтировать данный пул необходимо выполнить команду:

    zpool import -f jails jails
    

    Обязательно укажите -f, в противном случат zpool будет ругаться, что данный пул принадлежит другому серверу. При необходимости так-же можно настроить jail на данном сервере используя данный пул, что в свою очередь сведёт простой к минимуму. Для того что бы опять можно было использовать данный диск для iscsi, необходимо отключить данный пул:

    zpool export jails
    

    А так-же запустить ctld:

    service ctld start
    

    На этом можно и закончить.

    Список источников которые очень помогли в написании данной публикации:
    Майкл Лукас FreeBSD. Подробное руководство.
    www.freebsd.org/cgi/man.cgi?query=rctl&sektion=8
    www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/disks-adding.html
    docs.oracle.com/cd/E19253-01/820-0836/gavwn/index.html
    www.freebsd.org/cgi/man.cgi?query=ctl.conf&sektion=5&apropos=0&manpath=FreeBSD+11.1-RELEASE+and+Ports
    Поделиться публикацией
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 19
      0
      Очень редкий материал. Спасибо!
        0
        Неплохо было бы в самом начале статьи расписать что это такое и зачем вообще нужно, какие-то типовые случаи использования и т.п.
          0
          А чего их описывать? Контейнеры они и есть контейнеры.
            0
            Как раз тут было бы интересно сравнить с существующими (докер), в чем преймущества?
              0
              Сравнивать надо не с докером, который больше инфраструктура, чем собственно контейнеры, а с lxc или openvz
          0

          А чем обусловлена именно такая конструкция? Почему не проксмокс какой-нибудь?

            0
            Я предположу скромно, пока автор не ответил, это может быть потому, что FreeBSD jails значительно удобнее
              0
              Очень мало overhead при использовании jail видимо
                0
                При чем тут проксмокс вообще? При чем тут докер? Если и сравнивать то в разрезе Jail vs LXC
                0
                ЕМНИП с версии 10.1 во FreeBSD уже есть «родной» iSCSI-target (CTL — CAM Target Layer), поэтому использование istgt от уважаемого Д.Аоямы совсем не очевидно и, паче чаяния, не обязательно.
                  0
                  Спасибо за материал!
                    0
                    Хотелось бы узнать почему выбор пал на iscsi. А так, большое спасибо
                      0
                      а я обычно создаю базовый snapshot
                      zfs snapshot ZFS/jails/.base11x64@template

                      и клонирую его под нужные проекты :)
                      zfs clone ZFS/jails/.base11x64@template ZFS/jails/project1
                        0
                        Начиная с версии FreeBSD 9 настройка Jail вынесена в отдельный файл — /etc/jail.conf.

                        Имея сервер на 9 и на 10 могу сказать, что в 9 версии jail настраивается в rc.conf, а вот в 10 я сразу и не понял от чего не стартанули клетки, полез читать маны оказалось вся настройка клеток вынесена в отдельный файл.
                          0
                          А почему не использовать ezjail? С ним намного проще и удобнее, там и общий базовый образ из коробки который обновляется одной командой.
                            0
                            ezjail не понимает новые форматы описания клеток. но судя по всему это проблема и qjail-а тоже (за cbsd не скажу). есть баг с бинарным обновлением базовой клетки.
                            0

                            можете не соглашаться.
                            но.


                            1. режут глаз грамматические ошибки: "(как в моём случаи)", "Добавит в rc.conf автозапуск:", etc.
                            2. вместо dd if=/dev/zero of=disk bs=1k count=10m
                              быстрее будет dd if=/dev/zero of=disk bs=1m count=10k
                              • блок 1024 мелковат для современных устройств.
                            3. ee /etc/rc.d/iscsi.sc — не надо "гадить" в системную директорию.
                              используйте /usr/local/etc/rc.d или сделайте для своих скриптов, скажем, [/usr/local]/etc/rc.d.local (+ не забыть добавить оную директорию в переменную local_startup в /etc/rc.conf[.local]. в скобках [] — по собственному предпочтению).
                            4. если в jail'е крутится та же ОС, что и на хосте, не надо компайлить и тарить — откройте для себя nullfs. +обновления ОС, устанавливаемые на хост, будут автоматически распространены на гостевые окружения.
                              /etc/defaults /etc/mtree /etc/periodic /etc/rc.d /bin /lib /libexec /sbin /usr/bin /usr/include /usr/lib /usr/libexec /usr/sbin /usr/share /usr/ports/distfiles можно монтировать в гостей в режиме ro.
                              /usr/ports /usr/ports/packages — зависит от ситуации.

                            в остальном — нормуль, так держать! ;)

                              0
                              man ctld — штатный таргет без извратов с портами и пакетами уже в системе.

                              Если на таргете zfs, то md не нужен. ctld умеет делать LUN прямо из zvol.
                              Ребутать сервер через шаг несерьезно. kldload -v iscsi_initiator.ko в стандартном ядре уже есть.

                              Пересобирать jail наверное можно, если есть специальные требования, но намного удобнее использовать готовые бинарники от дистрибутива, с которыми еще и freebsd-update будет работать.

                              С jail.conf удобно работать через инклуды для конкретных jail или сразу на директорию, в которых лежат файлы с конфигами тюрем.

                              Алиас, если в той же сети, что и физ интерфейс нужно добавлять с /32

                              em0 не относиться к vmware это драйвера интеловской сетевой карты, которую vmware эмулирует
                                0
                                Спасибо за подсказку о ctld, подправил.

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                              Самое читаемое