Az első jail
Miután az előző fejezet végén eltakarítottuk a nyomokat magunk után, megejtjük a klónozást, és csinálunk egy jail-t, amelynek rövid életében feladata annyi lesz, hogy kipróbáljuk a jail lehetőségeit:
[root@freebsd:~]$ zfs clone dpool/jails/v8.1.0/template@base dpool/jails/v8.1.0/httpd [root@freebsd:~]$ zfs get compression dpool/jails/v8.1.0/httpd NAME PROPERTY VALUE SOURCE dpool/jails/v8.1.0/httpd compression off default [root@freebsd:~]$ zfs set compression=on dpool/jails/v8.1.0/httpd [root@freebsd:~]$ zfs get compression dpool/jails/v8.1.0/httpd NAME PROPERTY VALUE SOURCE dpool/jails/v8.1.0/httpd compression on local
Nem kötelező a tömörített jail fájlrendszer, de én két dolog miatt szeretem:
- ránézésre látom, hogy a tömörített mentés mennyi helyet fog elfoglalni.
- több hely marad és teljesítményben sem roszabb, mivel a programokat csak egyszer kell betölteni - a jail indulásakor.
Ha megtekintjük az elfoglalt helyet, akkor látszik igazán, hogy mire képes a ZFS klónozás: a template fájlrendszerből létrehozott httpd fájlrendszer egyelőre 0 bájt helyet foglal el, mivel minden egyes fájl és könyvtár hivatkozik a template megfelelő állományára:
[root@freebsd:~]$ zfs list NAME USED AVAIL REFER MOUNTPOINT [...] dpool/jails/v8.1.0 254M 3.40G 21K /dpool/jails/v8.1.0 dpool/jails/v8.1.0/httpd 0 3.40G 254M /dpool/jails/v8.1.0/httpd dpool/jails/v8.1.0/template 254M 3.40G 254M /dpool/jails/v8.1.0/template dpool/jails/v8.1.0/template@base 0 - 254M -
A létrehozott jail még nem üzemképes, ahhoz fel kell vennünk a /etc/rc.conf állományba a jail támogatást:
jail_enable="YES" jail_devfs_enable="YES" jail_procfs_enable="YES" jail_list="httpd" jail_httpd_rootdir="/dpool/jails/v8.1.0/httpd" jail_httpd_hostname="httpd.jails.javaforum.hu" jail_httpd_ip="192.168.2.6"
A _jail_ IP címe
A jail IP címe megér pár mondatot, hiszen a jail csak hálózaton keresztül tud a külvilággal kommunikálni. Minden jail rendelkezik egy és csakis egy IP címmel, amely lehet egy publikus IP cím is, ha a jail-nek érintkeznie kell a külvilággal, ha csak egy bizonyos szolgáltatás a célja, akkor célszerű az alias használata, amelyet már az előző fejezetben létrehoztunk, de csak parancssorból:
[root@freebsd:~]$ ifconfig bge1 alias 192.168.2.6 netmask 255.255.255.0 [root@freebsd:~]$ ifconfig bge1 bge1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM> ether 00:1a:64:6f:0e:d8 inet 192.168.2.254 netmask 0xffffff00 broadcast 255.255.255.0 inet 192.168.2.1 netmask 0xffffff00 broadcast 192.168.2.255 inet 192.168.2.6 netmask 0xffffff00 broadcast 192.168.2.255 media: Ethernet autoselect (none) status: no carrier
Az alias megőrzéséhez módosítani kell a /etc/rc.conf állományt:
ifconfig_bge1_alias0="inet 192.168.2.6 netmask 255.255.255.0"
Visszatérve a httpd nevű – amúgy üres – jail használatára, most már el tudjuk indítani:
[root@freebsd:~]$ /etc/rc.d/jail start httpd Configuring jails:. Starting jails: httpd.jails.javaforum.hu. [root@freebsd:~]$ jls JID IP Address Hostname Path 24 192.168.2.6 httpd.jails.javaforum.hu /dpool/jails/v8.1.0/httpd [root@freebsd:~]$ ssh root@192.168.2.6 The authenticity of host '192.168.2.6 (192.168.2.6)' can't be established. DSA key fingerprint is a4:ac:e7:f0:4a:43:16:3b:ce:d0:4b:68:7d:2b:eb:c4. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.2.6' (DSA) to the list of known hosts. Password: Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD 8.1-STABLE (JAVAFORUM) #0: Sat Nov 20 09:45:09 CET 2010 [root@httpd:~]$ df Filesystem 1K-blocks Used Avail Capacity Mounted on dpool/jails/v8.1.0/httpd 3823104 259968 3563136 7% / [root@httpd:~]$ ps aux USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND root 38827 0.0 0.0 13792 1388 ?? SsJ 3:04PM 0:00.00 /usr/local/sbin/syslog-ng -p /var/run/syslog.pid root 38867 0.0 0.2 23812 8264 ?? SsJ 3:04PM 0:00.01 /usr/local/sbin/munin-node (perl) root 38910 0.0 0.1 22876 2724 ?? SsJ 3:04PM 0:00.00 /usr/sbin/sshd root 38916 0.0 0.1 10732 2836 ?? SsJ 3:04PM 0:00.00 sendmail: accepting connections (sendmail) smmsp 38920 0.0 0.1 10732 2944 ?? IsJ 3:04PM 0:00.00 sendmail: Queue runner@00:30:00 for /var/spool/clientmqueue (sendmail) root 38926 0.0 0.0 6744 1184 ?? SsJ 3:04PM 0:00.00 /usr/sbin/cron -s root 39440 0.0 0.1 33768 3456 ?? SsJ 3:05PM 0:00.02 sshd: root@ttyp2 (sshd) root 39446 0.0 0.0 9012 1996 p2 SsJ 3:05PM 0:00.01 -bash (bash) root 39449 0.0 0.0 6788 988 p2 R+J 3:05PM 0:00.00 ps aux [root@httpd:~]$ exit logout Connection to 192.168.2.6 closed. [root@freebsd:~]$ zfs list NAME USED AVAIL REFER MOUNTPOINT dpool/jails/v8.1.0 255M 3.40G 21K /dpool/jails/v8.1.0 dpool/jails/v8.1.0/httpd 773K 3.40G 254M /dpool/jails/v8.1.0/httpd dpool/jails/v8.1.0/template 254M 3.40G 254M /dpool/jails/v8.1.0/template dpool/jails/v8.1.0/template@base 0 - 254M -
Mint látszik, mindössze 773kBájt helyet foglal a futó jail, amelyben működik a cron, a sendmail, az sshd, a munin-node és a syslog-ng is, egy dolog hiányzik: a ports fájlrendszer, amelyet – frissítés után – gyorsan be is csatolunk, majd belépünk a friss és ropogós httpd jail-be, és megnézzük van-e valami frissítenivaló:
[root@freebsd:~]$ zfs set mountpoint=/dpool/jails/v8.1.0/httpd/usr/ports/ dpool/jails/ports [root@freebsd:~]$ ssh root@192.168.2.6 Password: Last login: Sat Jan 17 15:05:10 2009 from 192.168.2.6 Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD 8.1-STABLE (JAVAFORUM) #0: Sat Nov 20 09:45:09 CET 2010 [root@httpd:~]$ portupgrade -i -a ---> Session started at: Sat, 17 Jan 2009 15:09:35 +0100 [Updating the pkgdb <format:bdb_btree> in /var/db/pkg ... - 71 packages found (-1 +1) (...). done] ** None has been installed or upgraded. ---> Session ended at: Sat, 17 Jan 2009 15:09:45 +0100 (consumed 00:00:10) [root@httpd:~]$ portaudit -F auditfile.tbz 100% of 53 kB 49 kBps New database installed. [root@httpd:~]$ portaudit 0 problem(s) in your installed packages found.
Szerencsére nincs semmi frissítenivaló és biztonsági hibát hordozó csomagunk sincs.
Az Apache telepítése
A httpd nevű jail azzal a céllal jött létre, hogy kipróbáljuk a jail lehetőségeit, ezért egy kezdetleges webszolgáltatást hozunk létre, amely látványos lehet, mégis egyszerű beállítani. Kiszolgáló programként az Apache httpd szerverét fogjuk használni, annak is a 2.2 verzióját. A telepítéshez egyszerűen be kell lépnünk a jail-be, és a portinstall használatával fel kell telepítenünk:
[root@httpd:~]$ portinstall -i apache ---> Session started at: Sat, 17 Jan 2009 15:13:52 +0100 ---> Found 3 ports matching 'apache': www/apache13 www/apache20 www/apache22 Install 'www/apache13'? [yes] n Install 'www/apache20'? [yes] n Install 'www/apache22'? [yes] [Gathering depends for www/apache22 ..................... done] ---> Fresh installation of devel/autoconf-wrapper started at: Sat, 17 Jan 2009 15:13:56 +0100 [...] + www/apache22 ---> Packages processed: 7 done, 0 ignored, 0 skipped and 0 failed ---> Session ended at: Sat, 17 Jan 2009 15:19:37 +0100 (consumed 00:05:44) [root@httpd:~]$ exit logout Connection to 192.168.2.6 closed. [root@freebsd:~]$ rm -Rf /dpool/jails/v8.1.0/httpd/tmp/* [root@freebsd:~]$ zfs list NAME USED AVAIL REFER MOUNTPOINT [...] dpool/jails/v8.1.0 263M 3.39G 21K /dpool/jails/v8.1.0 dpool/jails/v8.1.0/httpd 9.17M 3.39G 260M /dpool/jails/v8.1.0/httpd dpool/jails/v8.1.0/template 254M 3.39G 254M /dpool/jails/v8.1.0/template dpool/jails/v8.1.0/template@base 0 - 254M -
Ha a telepítés után kilépünk, majd letöröljük a felesleges fájlokat, akkor láthatjuk, hogy egy webszervert tartalmazó jail mindössze ~10MBájtot foglal el.
Az Apache beállítása
Lépjünk vissza a jail-be és üzemeljük be a feltelepített Apache kiszolgálót. Első dolgunk, hogy a /etc/rc.conf állományban engedélyezzük az Apache 2.2 futását:
apache22_enable="YES"
A httpd.conf állományt a /usr/local/etc/apache22 könyvtár alatt találjuk, első körben nem kell hozzányúlnunk, bár az Apache panaszkodni fog, de ezzel ne törődjünk, lépjünk ki a jail-ből és indítsuk újra azt, s ellenőrizzük a httpd processzek elindulását:
[root@httpd:~]$ exit logout Connection to 192.168.2.6 closed. [root@freebsd:~]$ /etc/rc.d/jail restart httpd Stopping jails: httpd.jails.javaforum.hu. Configuring jails:. Starting jails: httpd.jails.javaforum.hu. [root@freebsd:~]$ ssh root@192.168.2.6 Password: Last login: Sat Jan 17 15:23:29 2009 from 192.168.2.6 Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD 8.1-STABLE (JAVAFORUM) #0: Sat Nov 20 09:45:09 CET 2010 [root@httpd:~]$ ps aux | grep httpd USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND www 46999 1.0 0.1 73180 5488 ?? SJ 3:25PM 0:00.00 /usr/local/sbin/httpd -DNOHTTPACCEPT www 47000 1.0 0.1 73180 5504 ?? SJ 3:25PM 0:00.00 /usr/local/sbin/httpd -DNOHTTPACCEPT www 47001 1.0 0.1 73180 5504 ?? SJ 3:25PM 0:00.00 /usr/local/sbin/httpd -DNOHTTPACCEPT www 47002 1.0 0.1 73180 5516 ?? SJ 3:25PM 0:00.00 /usr/local/sbin/httpd -DNOHTTPACCEPT www 47003 1.0 0.1 73180 5520 ?? SJ 3:25PM 0:00.00 /usr/local/sbin/httpd -DNOHTTPACCEPT root 46954 0.6 0.1 73180 5488 ?? SsJ 3:25PM 0:00.09 /usr/local/sbin/httpd -DNOHTTPACCEPT
Működni látszik, de egyelőre a gép publikus IP címén nem érhetjük el, mivel a jail egy privát IP címet használ, ezért lépjünk ki a jail parancssorából, és oldjuk meg a problémát.
A portforward beállítása
Meg kell írnunk a portforward utasítását, amelyet a /etc/ipnat.rules fájlba kell írnunk:
rdr bge0 91.83.48.130/32 port 80 -> 192.168.2.6 port 80 tcp
Már csak el kell indítanunk az ipnat szolgáltatást:
[root@freebsd:~]$ /etc/rc.d/ipnat reload 9 entries flushed from NAT table 1 entries flushed from NAT list
És már készen is vagyunk:
Van egy ~10MBájt helyet foglaló Apache alapú webszolgáltatást nyújtó jail-ünk, amely a feladatát megbízhatóan és gyorsan végzi... törüljük le, majd később újra létrehozzuk, már kicsit több hozzáértéssel és több lehetőséggel...
[root@freebsd:~]$ /etc/rc.d/jail stop httpd Stopping jails: httpd.jails.javaforum.hu. [root@freebsd:~]$ zfs set mountpoint=/usr/ports dpool/jails/ports [root@freebsd:~]$ zfs destroy dpool/jails/v8.1.0/httpd