В связи с тем, что на сегодняшний день машинки довольно таки мощные — иногда есть смысл использовать технологии виртуализации, поэтому об одной из них я сегодня расскажу.

Технологиями виртуализации я активно пользуюсь уже долгое время, иногда для того что бы что то испытать не нарушая целостность всей системы, а иногда для того что бы выделить часть ресурсов для каких-то задач и при этом не переживать что если будет произведен взлом последней — не пострадает основная система. Бывают случаи, когда нужно предоставить root права на машину, например как в хостинговых кампаниях, и при этом не переживать что на основной системе будет крах из-за неумелых или кривых рук тех, кому были предоставлены данные права. В случае когда, необходимо разграничить ресурсы системы под разные задачи и предоставить виртуальную машину стороннему человеку, тоже можно использовать одну из технологий виртуализации.

В сегодняшней статье, я опишу технологию виртуализации на базе FreeBSD 8.0 с помощью стандартного набора команд, конфигов и так называемых «решеток» jail.

Итак, что мы имеем?

# uname -a
FreeBSD xxx.xxx.xxx 8.0-RELEASE-p2 FreeBSD 8.0-RELEASE-p2 #1: Wed Jan 27 16:29:20 UTC 2010     root@xxx.xxx.xxx:/usr/obj/src/sys/jails  i386

Диск установочный FreeBSD 8.0 — для того что бы по быстрому подготовить образ, который потом можно будет просто копировать для других машин. Также можно воспользоваться исходниками системы и собрать, но это будет дольше.

Если у вас все необходимое под рукой, то можно приступить к делу:

# cd /
# mkdir -p jails/vps1
# cd /jails/vps1
# mount /cdrom
# bash
[root@jails /jails/vps1]# cd /cdrom/8.0-RELEASE/base
[root@jails /cdrom/8.0-RELEASE/base]# DESTDIR=/jails/vps1/ /cdrom/8.0-RELEASE/base/install.sh
You are about to extract the base distribution into /other/jails/vps1/ - are you SURE
you want to do this over your installed system (y/n)? y

А если у вас на системе нет установленного bash, тогда после монтирования привода делаем так:

# cd /cdrom/8.0-RELEASE/base/
# env DESTDIR=/jails/vps1/ /cdrom/8.0-RELEASE/base/install.sh
You are about to extract the base distribution into /other/jails/vps1/ - are you SURE
you want to do this over your installed system (y/n)? y

После выполнения вышеприведенной операции, в директории /jails/vps1/, появятся системные файлы операционной системы FreeBSD.

Если под руками нет диска, или это удаленная система, то можно воспользоваться либо подключенным образом как диском — это немного ускорит время установки системных файлов для новой vps, либо воспользоваться исходниками и скомпилировать новую систему для vps.

Для этого переходим в каталог /usr/src и выполняем:

# make world DESTDIR=/jails/vps1
# make distribution DESTDIR=/jails/vps1

Далее, нам необходимо создать пустой файл /jails/vps1/etc/fstab и создаем конфиг rc.conf для нашего jail.

# touch /jails/vps1/etc/fstab
# echo '#vps_rc.conf' >> /jails/vps1/etc/rc.conf
# echo 'hostname="vps1.hosting.org.ua"' >> /jails/vps1/etc/rc.conf
# echo 'ifconfig_rl0="inet 74.117.xxx.xx netmask 255.255.255.255"' >> /jails/vps1/etc/rc.conf
# echo 'defaultrouter="74.117.xxx.xx"' >> /jails/vps1/etc/rc.conf
# echo 'clear_tmp_enable="YES"' >> /jails/vps1/etc/rc.conf
# echo 'kern_securelevel_enable="YES"' >> /jails/vps1/etc/rc.conf
# echo 'kern_securelevel="3"' >> /jails/vps1/etc/rc.conf
# echo '# Запускаем sshd' >> /jails/vps1/etc/rc.conf
# echo 'sshd_enable="YES"' >> /jails/vps1/etc/rc.conf
# echo 'sendmail_enable="NONE"' >> /jails/vps1/etc/rc.conf
# echo 'syslogd_flags="-ss"' >> /jails/vps1/etc/rc.conf
# echo 'rpcbind_enable="NO"' >> /jails/vps1/etc/rc.conf

Теперь заведем нового пользователя на машине vps1 и поменяем пароль пользователю root:

# chroot /jails/vps1 /bin/csh
# pwd
/
# adduser
......
OK? (yes/no): yes
adduser: INFO: Successfully added (user548) to the user database.
Add another user? (yes/no): no
Goodbye!
# id
uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)
# password
Changing local password for root
New Password:
Retype New Password:
# Ctrl + D (или exit)

Теперь зайдем на машину с консоли и сделаем несколько поправок в конфигах:

# jail /jails/vps1/ vps1 74.117.xxx.xx /bin/sh
# newaliases
# tzsetup
# echo 'nameserver IP_DNS_servera' >> /etc/resolv.conf
# exit

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

# mount_unionfs /usr/ports /jails/vps1/usr/ports
или так
# mount_nullfs /usr/ports /jails/vps1/usr/ports
Теперь остальное:
# cd /jails/vps1/
# mount -t procfs proc /jails/vps1/proc
# mount -t devfs devfs /jails/vps1/dev
# devfs -m /jails/vps1/dev rule -s 4 applyset

Осталось несколько штрихов:

# pwd
/jails/vps1/
# ln -s dev/null kernel
# jail /jails/vps1 vps1.hosting.org.ua 74.117.xxx.xx /bin/sh /etc/rc

Думаю, что с VPS машиной мы разобрались, перейдем теперь к хостовой машине.
Основная задача, это сделать так, что бы все сервисы которые имеются на данной машине слушали и вешали только на свой IP-адрес. Для этого правим все нужные конфиги.

Для сервиса inetd, если он используется:

# echo 'inetd_flags="-wW -a <IP-адрес хостовой машины>"' >> /etc/rc.conf

Для ssh:

# edit /etc/ssh/sshd_config
ListenAddress <IP-адрес хостовой машины>

Для apache:

# edit /usr/local/etc/apache/httpd.conf
Listen <IP-адрес хостовой машины>:80
# apachectl restart

Для mysql:

# edit /etc/my.cnf
bind-address=<IP-адрес хостовой машины>

Для syslogd:

# edit /etc/rc.conf
syslogd_flags="-s -s" #Не слушать
syslogd_flags="-a <IP-адрес хостовой машины>"

Для bind (named):

# edit your named.conf (may be in /var/named/etc/named.conf)
в секции "options" добавить
listen-on { <IP-адрес хостовой машины>; };
listen-on-v6 port 53 { 2003:d5ae:10a1:5:201:b3ff:fee1:7ee3; };
query-source address <IP-адрес хостовой машины> port *;
query-source-v6 address 2003:d5ae:10a1:5:201:b3ff:fee1:7ee3 port *;

Теперь, когда всё сконфигурировано на нужный IP-адрес, мы добавляем некоторые записи в /etc/rc.conf основной машины:

# edit /etc/rc.conf
ifconfig_rl0_alias0="inet 74.117.xxx.xx netmask 0xffffffff"
jail_enable="YES"
jail_list="vps1"
jail_set_hostname_allow="YES"
jail_socket_unixiproute_only="YES"
jail_vps1_interface="rl0"
jail_vps1_rootdir="/jails/vps1"
jail_vps1_hostname="vps1.hosting.org.ua"
jail_vps1_ip="74.117.xxx.xx"
jail_vps1_exec_start="/bin/sh /etc/rc"
jail_vps1_devfs_enable="YES"
jail_vps1_devfs_ruleset="devfsrules_jail"
jail_vps1_exec_stop="/bin/sh /etc/rc.shutdown"
jail_vps1_procfs_enable="YES"
jail_vps1_flags="-l -U root"

Возможно понадобится сделать ещё вот такое:

# echo "add path 'bpf*' unhide'" >> /etc/devfs.rules
или по каждому интерфейсу:
# echo "add path 'bpf0' unhide mode 0640 group bpf" >> /etc/devfs.rules
# echo "add path 'bpf1' unhide mode 0640 group bpf" >> /etc/devfs.rules

Возможно, потребуется поправить некоторые параметры sysctl на хост-машине:

Параметр sysctl      Значение    
security.jail.set_hostname_allowed если 1, то внутри jail можно поменять имя хоста;
security.jail.socket_unixiproute_only если 1, то сокет в jail можно создать только для доменов: PF_LOCAL, PF_INET или PF_ROUTE, иначе, возвращается ошибка;
security.jail.sysvipc_allowed если 1, то то в jail можно получить доступ к глобальному System VIPC;
security.jail.getfsstatroot_only если 1, то в jail можно получить информацию (df)только о той файловой системе на которой создан jail;
security.jail.allow_raw_sockets если 1, то в jail можно создавать raw sockets;
security.jail.chflags_allow если 1, то процессы в jail могут модифицировать флаги ФС.

Ну, вот..
Я думаю что в данной теме, я очень глубоко зацепил тему виртуализации на FreeBSD, следующим этапом я опишу ещё несколько полезных штук связанных с этой темой.

PS. Кстати, в портах имеются несколько утилит для создания и управления jailами, например: /usr/ports/sysutils/jailadmin. Я думаю что немного позже я опишу как ею пользоваться в другой статье.

Напоминаю всем копирующим мой контент о существовании закона "Об авторском праве".
В связи с этим, прошу во избежании конфликтов при копировании данного материала, ставить на него ссылку:

http://noted.org.ua/1396


Также, вы можете отблагодарить меня переслав любую сумму на любой кошелек WebMoney, для поддержания данного ресурса. Или просто админу на пиво ;)

Кошельки для получения благодарности:
R386985788805
U234140473141
Z147712360455

На данной странице нет комментариев, возможно они закрыты. Если Вы хотите оставить свой комментарий, перейдите на специально созданный раздел

Add your comment now

Please note: JavaScript is required to post comments.