В связи с тем, что на сегодняшний день машинки довольно таки мощные — иногда есть смысл использовать технологии виртуализации, поэтому об одной из них я сегодня расскажу.
Технологиями виртуализации я активно пользуюсь уже долгое время, иногда для того что бы что то испытать не нарушая целостность всей системы, а иногда для того что бы выделить часть ресурсов для каких-то задач и при этом не переживать что если будет произведен взлом последней — не пострадает основная система. Бывают случаи, когда нужно предоставить 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. Я думаю что немного позже я опишу как ею пользоваться в другой статье.
Напоминаю всем копирующим мой контент о существовании закона "Об авторском праве".
В связи с этим, прошу во избежании конфликтов при копировании данного материала, ставить на него ссылку:
Также, вы можете отблагодарить меня переслав любую сумму на любой кошелек WebMoney, для поддержания данного ресурса. Или просто админу на пиво ;)
Кошельки для получения благодарности:
R386985788805
U234140473141
Z147712360455
На данной странице нет комментариев, возможно они закрыты. Если Вы хотите оставить свой комментарий, перейдите на специально созданный раздел