(bg) FreeBSD 9.x Jails – vnet

Важно: Тази статия не е how to за jail и vnet а е написана да даде насока как може да се използва /etc/jail.conf и vnet.
Не претендирам че е на 100% детайлна но мисля че ще е от полза на хора който вече са запознати със FreeBSD jail и искат да го използват със VIMAGE

За повече информация:

http://www.freebsd.org/
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/jails.html
https://wiki.freebsd.org/NetworkVirtualization
http://en.wikipedia.org/wiki/FreeBSD_jail
https://www.google.bg/ # 🙂

man ifconfig
man jail.conf
man jail

Малко теория:

1. Какво е FreeBSD Jail

Jail подобряват концепцията за традиционния chroot по няколко начина. В традиционния chroot , процесите са ограничени в рамките на файловата система до която имат достъп. Останалата част от системните ресурси (системни юзери, стартирани процеси, подсистема мрежа) се споделя между chroot и операционна система. За разлика от chroot, Jail изолира освен файловата система също и стартираните процеси, мрежовите ресурси (vimage (vnet) или fib), системните юзери.

2. Какво е VIMAGE (vnet)

VIMAGE е кърнел модул за виртуализиране на мрежи. VIMAGE или vnet създава „частен“ или по точно изолиран мрежов стак.
VIMAGE изисква използването на „собствен“ мрежови интерфеис който може да бъде преместен във Jail като по този начин става видим единствено от Jail не и от хост операционна система (тоест е видим единствено от кернела и Jail към който е закачен)

3. Какво е Epair интерфейс

Epair е част от двойка софтуерни мрежопудобни интерфиси който са свързани със виртуален cross-over „кабел“ (пример epair1a и epair1b)

Топология:

(примерна)

Mрежова топология за FreeBSD jails VIMAGE

internet –> FreeBSD host –> natd via rl0 –> bridge0 (member: epair1a,epair2a,epair3a)
–> jail testA.jail.local (lo0 (jail loopback netif), epair1b)
–> jail testB.jail.local (lo0 (jail loopback netif), epair2b)
–> jail testC.jail.local (lo0 (jail loopback netif), epair3b)

Epair интерфеиса се състои от две части което го прави подходящ за използването му със bridge. Първата част се отбелязва със а (epair1a) която се атачва към bridge интерфеис а втората b (epair1b) се „вкарва“ в jail. По този начин може да трафикът да бъде „изведен“ от изолирания jail, през връзката epairXb <-> epairXa а от там към „външният свят или интернет“ чрез bridge и nat.
Забележете, че при jail vnet тъйкато мрежовият стак е изолиран от останалия „свят“ може да създавате и други полезни интефеиси като наприме loopback интефеис и тн. (забележка за vlan и подобни: въпкреи че vnet е „изолиран“ кърнелът постояно има достъп до всички интерфейси което води до някои ограничения)

Конфигуриране:

FreeBSD 9.1 и по нови предлага така наречения jail.conf файл което улеснява кофигуриранте на jail, в интернет може да откриете достатъчно информация как се конфигурира традиционен jail за това ще се спра на използването на jail.conf и vnet.

1. FreeBSD кернел

Прекомпилирате кернела със следната опция

options VIMAGE

това ще добави VIMAGE / vnet модула.

2. Jail envoirment

Аз лично предпочитам по ред причини да използвам отделна директория за всеки отделен jail (FreeBSD + zfs), разбирасе може да използвате и така нареченият скелетен модел или дори ezjail за да съсздете основната директория/скелетен модел за всеки отделен jail.

пример: /jails/testjal

3. Jail world

След съсздаването на директорията трябва да я „запълним“ със основните фиалове на jail операционна система.
След buildworld на freebsd src инсталираме със маке installworld

cd /usr/src
a) make installworld DESTDIR=/jails/testjail
b) make distribution DESTDIR=/jails/testjail

a – инсталира компилираните файлове във директория /jails/testjail
b – инсталира основните конфигурационни файлове /jails/testjail/etc

4. /etc/rc.conf /etc/natd.conf /etc/rc.ipfw

Трябва да инсталираме jail2 което не е нищо по различно от имплементиране на /etc/jail.conf със jail /etc/rc.conf
– cd /usr/ports/sysutils/jail2 && make install clean

Във основният run config файл /etc/rc.conf трябва да конфигурираме jails, bridge0 и ipfw/natd

– /etc/rc.conf
cloned_interfaces=“bridge0″ # създаваме bridge0
firewall_enable=“YES“ # стартираме ipfw със /etc/ipfw.conf конфигурация
firewall_script=“/etc/ipfw.conf“
natd_enable=“YES“ # стартираме natd със /etc/natd.conf конфигурация
natd_flags=“-f /etc/natd.conf“
jail2_enable=“YES“ # стартираме jail2
jail2_list=“testjail“ # лист със jail имената за стартиране при booт=

– /etc/ipfw.conf
#!/bin/sh
# var
fwcmd=“/sbin/ipfw -q“
eif=“rl0″ # името на външната ни мрежова карта

# rules
${fwcmd} -f flush
# NAT rules
${fwcmd} add 65532 divert natd ip from any to any via ${eif}

– /etc/natd.conf
interface rl0 # името на външната ни мрежова карта
dynamic yes
same_ports yes
# пример за редирект на порт 80 от външното ни IP към ипто на jail (192.168.0.10 – външно ip)
redirect_port tcp 10.10.15.100:80 192.168.0.10:80

5. /etc/jail.conf
Създаваме – /etc/jail.conf

# Default Settings

vnet; # разрешава vimage/vnet модула
mount.devfs; # монтира /dev/ вътре във всички jail
exec.start = „ifconfig lo0 127.0.0.1/8“; # създава loopback интерфеиса във всички jail при старт на jail
exec.stop = „/bin/sh /etc/rc.shutdown“; # rc.shutdown скрипта във всички jail при стоп на jail

# Jails Settings

testjail # името на jail
{
path = /jails/testjail; # пътя до home директорията на jail
host.hostname = testjail.jails.loacl; # jail hostname
jid = 1; # jail id
mount.fstab = /etc/fstab.test.jail.local; # fstab за монтиране вътре във jail
devfs_ruleset = 5; # правилата за разрешаване или забраняване на устройствата във /dev/ вътре във jail
exec.prestart = „ifconfig epair1 create“; # създаваме epair интерфеиса преди старт на jail
exec.prestart += „ifconfig bridge0 addm epair1a up“; # присъединяваме epair1a към bridge интерфеиса
exec.prestart += „ifconfig bridge0 alias 10.10.15.1/24“; # добавяме alias ip към bridge което ip играе ролята на gateway за мрежата на jail
exec.prestart += „ifconfig epair1a up“; # статрираме epair1a
vnet.interface = epair1b; # вкарваме epair1b вътре във jail
exec.start += „ifconfig epair1b 10.10.15.100/24“; # добавамe ip на jail
exec.start += „route add default 10.10.15.1“; # добавяме default gatewat на jail
exec.start += „/bin/sh /etc/rc“; # изпълняваме run configs
exec.poststop = „ifconfig bridge0 deletem epair1a“; # премахваме epair1a от bridge
exec.poststop += „ifconfig bridge0 -alias 10.10.15.1“; # премахваме alias ip от bridge
exec.poststop += „ifconfig epair1a destroy“; # унищожаваме epair1a и epair1b
}

може да използвате почти всички променливи от sysctl -a |grep jail във /etc/jail.conf

Обяснение на /etc/jail.conf:

Този файл се състои от две основни части, всичко което е между { } е локална конфигурация за всеки отделен jail, всичко извън тях е default за всички jails
Може да имаме колкото поискате конфигурации на jail вътре разделени от името на jail и ограничаващи скоби за локален конфиг { }
Всяка опция се одтеля със ; изключение правят името на jail и { }

общ пример:

default setting 1;
default setting 2;

testjail
{
.. .. ;
}

otherjail
{
.. .. ;
}

– основни променливи
– exec.prestart – изпълнява се преди старт на jail
– exec.start – изпълнява се при старт на jail
– exec.poststop – изпълнява се преди спиране на jail

Тези променливи се ипзъняват една след друга от горе на долу като правило е че първата във файл винаги е със = а всяка следваща е със +=

Например ако имаме във дефолтната секция exec.start = „ifconfig lo0 127.0.0.1/8“ всяко следващо използване e exec.start +=
без значение дали е за индивидуален конфиг {} или извън него.

Стартиране и спиране на jail

стартиране на jail jail -c testjail
спиране на jail jail -r testjail

Приемам всякакъв тип градивна критика ако съм изпуснал нещо или има някакви неточности (и за правопис писана е за 30 мин.), също приемам всякакви идеи и предложения по темата.
Използвал съм реални примери!

Вашият коментар