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

в 23:24, , рубрики: freebsd, freebsd jail, freebsd zfs, ipfw, резервное копирование, Серверное администрирование, системное администрирование

Введение

На написание данной публикации меня подтолкнул тот факт, что в сети интернет крайне мало информации по администрированию 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
Для настройки необходим ещё один сервер в сети, или виртуальная машина(как в моём случаи). Для установки выполните команду(к слову это единственное, что необходимо установить, так-как всё остальное уже имеется в FreeBSD):

pkg install istgt-20150713

если установка не произошла, то скорее всего изменилось название версии, для поиска корректного имени введите:

pkg search istgt

После нажатия клавиши Enter pkg выдаст корректную версию. Добавит в rc.conf автозапуск:

sysrc istgt_enable="YES"

Настройка iscsi оказалась довольно простой, необходимо изменить всего несколько строк в файлах конфигурации. Файлы конфигурации находятся в папке /usr/local/etc/istgt. Первый «конфиг» который необходимо отредактировать — auth.conf, введите:

ee /usr/local/etc/istgt/auth.conf

В разделе [AuthGroup1] приведите строку Auth к виду:

Auth "user1" "password"

Имя пользователя и пароль введите которые Вам необходимы. На этом настройка auth.conf завершена. Настроим istgt.conf, введите:

ee /usr/local/etc/istgt/istgt.conf

В разделе [Global] измените параметр NodeBase на тот который Вам больше подходит, например:

NodeBase "iscsi_target"

Хотя этот параметр необязательно менять. В разделе [PortalGroup1] измените параметр Portal DA1 на ip адрес который используется у Вас на данном сервере, в моём случаи параметр будет выглядеть вот так:

Portal DA1 192.168.1.106:3260

В разделе [InitiatorGroup1] измените параметр Netmask, в моём случаи параметр выглядит так:

Netmask 192.168.1.0/24

Последний раздел который необходимо отредактировать — [LogicalUnit1], измените параметр TargetName на тот который Вам более подходит, у меня используется targ_disk1. В параметре LUN0 указывается жёсткий диск и его размер:

LUN0 Storage /dev/md0 10G

Здесь указан виртуальный жёсткий диск, если используете физический, то укажите его, а если желаете использовать виртуальный, то читаем дальше. Перейдите в каталог в котором желаете создать файл для виртуально жёсткого диска и выполните команду:

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

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

mdconfig -a -t vnode -f disk

После выполнение данной команды отобразиться название виртуально диска (в моём случаи — md0), если название отличается, то так-же необходимо изменить параметр LUN0 в istgt.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=password
initiatorname=nxl
TargetName=iscsi_target:targ_disk1
TargetAddress=192.168.1.106:3260,1
LoginTimeout=10
AuthTimeout=10
IdleTimeout=10
ConnFailTimeout=10
AbortTimeout=10
ResetTimeout=10
}

Если настройки в файле istgt.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

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

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

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

service istgt 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

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

service istgt 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

Автор: Nemets85

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js