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

Технологиями виртуализации я активно пользуюсь уже долгое время, иногда для того что бы что то испытать не нарушая целостность всей системы, а иногда для того что бы выделить часть ресурсов для каких-то задач и при этом не переживать что если будет произведен взлом последней — не пострадает основная система. Бывают случаи, когда нужно предоставить 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/?p=1396


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

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

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

Add your comment now

You must be logged in to post a comment.