https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/jails-ezjail.html
Hier wird beispielhaft eine Jail speziell für einen Minecraft-Server eingerichtet (deshalb heißt sie nicht "jail01" sondern "minecraft").
hilfreiche Links:
so kann das Skript einfach genutzt werden:
> jail-classic_quick_and_dirty.sh testjail 10.10.10.10
#!/bin/sh ################################################################################ # https://docs.freebsd.org/de/books/handbook/book/index.html#jails-ezjail # # Die meisten Netzwerkdienste laufen problemlos in einer Jail. # Ein paar wenige Netzwerkdienste, vor allem ping(8) verwenden Netzwerk-Sockets. # Aus Sicherheitsgründen werden Netzwerk-Sockets innerhalb der Jails # deaktiviert, so dass Dienste, die diese Sockets benötigten, # nicht funktionieren werden. ################################################################################ if [ x == "x${2}" ] ; then echo "${0} [Jail-Name] [Jail-IP]" echo "${0} testjail 192.168.10.10" echo "${0} testjail 10.10.10.10" exit 1 fi JAIL_NAME="${1}" JAIL_IP="${2}" echo " JAIL_NAME: ${JAIL_NAME} JAIL_IP: ${JAIL_IP} " JAIL_DIR="/usr/jails" JAIL_CMD="$(which ezjail-admin)" if [ x == "x${JAIL_CMD}" ] ; then echo "... ggf. muß ezjail vorher noch installiert werden:" echo "> cd /usr/ports/sysutils/ezjail && make clean install clean" echo "> ezjail-admin update -b" exit 1 fi JLS_NAME="$(jls name | grep -E "^${JAIL_NAME}$")" if [ x != "x${JLS_NAME}" ] ; then echo "Eine Jail mit diesem Namen läuft bereits." echo "so kannst Du sie betreten:" echo "> ezjail-admin console ${JAIL_NAME}" exit 1 fi IFCONFIG_IP="$(ifconfig -a | grep -F "inet ${JAIL_IP} netmask")" if [ x != "x${IFCONFIG_IP}" ] ; then echo "Die IP existiert schon." exit 1 fi HOST_BASIS_RELEASE="$(uname -r | sed 's/[-]p.*//')" echo "OS-Release: ${HOST_BASIS_RELEASE}" ### die neue Jail bauen # "lo1" sollte schon eingerichtet sein: # > echo 'cloned_interfaces="lo1"' >> /etc/rc.conf # > service netif cloneup # Created clone interfaces: lo1. # #ezjail-admin create ${JAIL_NAME} "lo1|127.0.1.1,${NIC_ALIAS}|${JAIL_IP}" # NIC_ALIAS="$(cat /etc/rc.conf | grep -E 'ifconfig_[a-z0-9]+="inet ' | grep -Fv bridge | head -n1 | awk -F'=' '{print $1}' | awk -F'_' '{print $2}')" ifconfig ${NIC_ALIAS} alias ${JAIL_IP}/32 ezjail-admin create ${JAIL_NAME} ${JAIL_IP} # cp /etc/resolv.conf /etc/localtime /etc/make.conf "${JAIL_DIR}/${JAIL_NAME}"/etc/ ls -lha "${JAIL_DIR}/${JAIL_NAME}"/etc/resolv.conf "${JAIL_DIR}/${JAIL_NAME}"/etc/localtime "${JAIL_DIR}/${JAIL_NAME}"/etc/make.conf jls ### die neue Jail starten ezjail-admin start ${JAIL_NAME} echo " Um diese Jail nach dem nächsten reboot erneut starten zu können, ist das folgende Kommando nötig. Allerdings ist die Nummer von 'alias0' entsprechend richtig zu setzen: > echo 'ifconfig_${NIC_ALIAS}_alias0="inet ${JAIL_IP}/32"' >> /etc/rc.conf einloggen in die neue Jail: > ezjail-admin console ${JAIL_NAME} die neue Jail auf den neuesten Stand bringen: > ezjail-admin update -b \"${JAIL_DIR}/${JAIL_NAME}\" fetch install die neue Jail wieder löschen: > ezjail-admin stop ${JAIL_NAME} ggf. von Hand eingerichtete Bind-Mounts entfernen... > ezjail-admin delete -w ${JAIL_NAME} > service netif restart "
Allerdings mit einer Einschränkung.
Die Jail braucht eine IP und diese wird nicht automatisch bootfest konfiguriert!!! Da es sich um eine "Quick&Dirty"-Lösung handelt, die einfach nur mal schnell benutzt werden soll, ist es wohl auch besser so.
Will man die Jail jedoch dauerhaft bzw. länger betreiben, dann kann man das mit einer Zeile in der /etc/rc.conf bootfest machen.
Dabei muß allerdings das Beispiel-Kommando entsprechend anpassen:
ifconfig_em0_alias0="inet 10.10.10.10/32"
Die Nummer von alias0 (in diesem Fall die 0, für den aller ersten Alias) muß in der /etc/rc.conf absolut eindeutig sein und darf auf keinen Fall mehrfach für einen Alias vergeben werden!
http://www.admin-magazin.de/Das-Heft/2013/01/Wie-man-Jails-in-FreeBSD-konfiguriert-und-benutzt
Innerhalb einer Jail gibt es aufgrund der Implementierung wichtige Einschränkungen. Remote-Procedure-Calls (RPC) funktionieren im Jail-Betrieb aus Sicherheitsgründen nicht mehr. Daher gibt es keine Möglichkeit, NFS innerhalb einer Jail zu nutzen. Daemon-Prozesse auf dem Host müssen sehr sorgfältig konfiguriert sein, damit es nicht zu Adresskonflikten zwischen Jail und Host kommt. Das Laden oder Entladen von Kernelmodulen ist innerhalb einer Jail genauso unterbunden wie das Erstellen von Device-Nodes. Das Mounten und Unmounten von Dateisystemen ist nicht möglich. Das Modifizieren der Netzwerkkonfiguration, der Netzwerkadressen oder auch der Routing-Tabellen ist verboten. Der Zugriff auf sogenannte Raw-Sockets des Hostsystems ist nicht mehr möglich, aber innerhalb der Jail besteht die Möglichkeit, auf diesen Typ von Sockets zuzugreifen. Ebenso ist es nicht gestattet, Semaphoren des Hostsystems anzusprechen.
Aus den meisten dieser Einschränkungen resultiert bei genauer Betrachtung ein Sicherheitsgewinn im Vergleich zu einer Chroot-Umgebung.
alle laufenden Jails anzeigen:
# jls
JID IP Address Hostname Path
1 192.168.0.13 minecraft /usr/jails/minecraft
2 192.168.0.14 jail02 /usr/jails/jail02
3 192.168.0.15 jail03 /usr/jails/jail03
nur die Namen der laufenden Jails anzeigen
# jls name minecraft jail02 jail03
in die Jail "minecraft" einloggen
# ezjail-admin console minecraft
die Jail "minecraft" anhalten
# ezjail-admin stop minecraft Stopping jails: minecraft.
alle laufenden Jails anhalten
# ezjail-admin stop ezjailStopping jails: jail03 jail02 minecraft.
liste alle existierenden Jails auf
# ls -lha /usr/jails/ total 85 drwxr-xr-x 10 root wheel 10B 22 Aug. 2016 . drwxr-xr-x 17 root wheel 17B 15 Juni 2017 .. drwxr-xr-x 9 root wheel 9B 23 Feb. 2015 basejail drwxr-xr-x 12 root wheel 24B 25 Jan. 2016 minecraft drwxr-xr-x 3 root wheel 24B 23 Feb. 2015 jail02 drwxr-xr-x 12 root wheel 24B 8 Feb. 2016 jail03
alle Jails wieder starten
# ezjail-admin start ezjailStarting jails: minecraft jail02 jail03.
Paket installieren:
> pkg install sysutils/ezjail
neuerdings ist jetzt auch noch das hier nötig - hiermit wird die "Jail-Welt" kompiliert → es wird das Verzeichnis /usr/jails/ angelegt (das wurde früher bereits bei der Installation des Paketes gemacht):
> ezjail-admin update -b ... /usr/jails/basejail/usr/lib32/libprivateldns.so 146598 blocks Note: a non-standard /etc/make.conf was copied to the template jail in order to get the ports collection running inside jails. > ls -lha /usr/jails/ total 27 drwxr-xr-x 5 root wheel 5B 27 Mai 01:35 . drwxr-xr-x 19 root wheel 19B 26 Mai 19:50 .. drwxr-xr-x 9 root wheel 9B 27 Mai 01:35 basejail drwxr-xr-x 3 root wheel 3B 27 Mai 01:35 flavours drwxr-xr-x 13 root wheel 23B 27 Mai 01:35 newjail
> vi /etc/rc.conf
... ifconfig_sk0_alias0="inet alias 192.168.2.100/32" ... syslogd_flags="-ss" ezjail_enable="YES" #ifconfig_sk0_alias0="10.0.0.1/32" #pf_enable="YES"
Ports-Tree für die Jail's kopieren:
> mkdir /usr/jails/basejail/usr/ports > cp -a /usr/ports/ /usr/jails/basejail/usr/ports/
die IP für die neue Jail hoch fahren:
> ifconfig sk0 alias 192.168.2.100/32
eine Jail bauen:
> ezjail-admin create minecraft 192.168.2.100
die Jail starten:
> service ezjail start minecraft
oder
> ezjail-admin console -f minecraft
jls - Jails anzeigen
jexec - Verbindung mit einer laufenden Jail / Starten eines Befehls / Programme Ausfuehren
nachsehen, ob die Jail läuft:
> jls
JID IP Address Hostname Path
2 192.168.2.100 minecraft /usr/jails/minecraft
> ezjail-admin list
STA JID IP Hostname Root Directory
--- ---- --------------- ------------------------------ ------------------------
DR 2 192.168.2.100 minecraft /usr/jails/minecraft
sehen ob sie Netzwerk-Ports geöffnet hat:
> netstat -4anp tcp | fgrep 192.168.2.100
in die Jail "minecraft" einloggen:
> ezjail-admin console minecraft
in die Jail einloggen:
> ezjail-admin console minecraft
Zeitzone einstellen:
> rm -f /etc/localtime; ln -s /usr/share/zoneinfo/MET /etc/localtime
in der Jail muss als erstes das GateWay eingetragen werden, sonst kann man keine Pakete aus dem Internet installieren (es ist auch eine gute Idee SSH zu aktivieren):
> vi /etc/rc.conf hostname="minecraft.lan" # FQDN !!! defaultrouter="192.168.2.1" sshd_enable="YES"
ohne NameServer (DNS) geht nichts:
> vi /etc/resolv.conf search lan.de nameserver 192.168.2.1
aus der Jail wieder ausloggen:
> exit
den Hostnamen anpassen, hier fehlt ggf. die Domain:
> vi /usr/local/etc/ezjail/minecraft ... export jail_minecraft_hostname="minecraft" ...
die Jail neu starten:
> ezjail-admin stop minecraft > ezjail-admin start minecraft
alle Jails neu starten:
> service ezjail stop > service ezjail start
in die Jail einloggen:
> ezjail-admin console minecraft
… und die BASH installieren:
> pkg install -y shells/bash-static > bash ; exit
make-Optionen ⇒ kein X11 und optimieren für AMD K8 (siehe man make.conf und /usr/share/examples/etc/make.conf):
> vi /etc/make.conf
WITHOUT_X11=yes NO_X=yes OPTIONS_UNSET=X11 CPUTYPE=k8 DOC_LANG=de_DE.UTF-8
… diese Paket braucht man fast immer:
> pkg install misc/mc sysutils/screen misc/gnu-watch archivers/unzip ftp/wget converters/base64 net/bmon net-mgmt/iftop editors/vim
für die, die es wohl nie lernen werden…
> pkg install editors/nano
Web-Server installieren:
> pkg install www/apache24
PHP installieren:
> pkg install lang/php56 www/mod_php56 ftp/php56-curl textproc/php56-xml converters/php56-mbstring devel/php56-json textproc/php56-simplexml textproc/php56-dom
Java installieren:
> pkg install java/openjdk8-jre
VNC-Server installieren:
> pkg install net/tightvnc
... export jail_minecraft_cpuset="1" ...
> pkg install net/vnc x11/xorg x11-wm/icewm x11/xterm > vi ~/.vnc/xstartup #!/bin/sh xrdb $HOME/.Xresources & /usr/local/bin/icewm-session & /usr/local/bin/xterm > chmod 0755 ~/.vnc/xstartup > vncserver -depth 24 -geometry 640x480 -nolisten tcp :1
eine bestimmte Jail starten:
> service ezjail start minecraft
eine bestimmte Jail stoppen:
> service ezjail stop minecraft
alle Jails auf die aktuelle Version das Host-Systems aktualisieren:
> ezjail-admin stop > rm -fr /usr/jails/basejail/usr/src/* > cp -a /usr/src/ /usr/jails/basejail/usr/src/ > ezjail-admin update -p -u
so kann man in allen Jails gleichzeitig die Ports-Trees aktualisieren ohne die Jails zu stoppen:
> ezjail-admin update -P
die Jail-Umgebung neu kompilieren:
> ezjail-admin update -b
Jail "minecraft" anhalten:
> ezjail-admin stop minecraft
Jail "minecraft" löschen
> ezjail-admin delete -f minecraft > rm -R /usr/jails/minecraft > rm /usr/local/etc/ezjail/minecraft
oder so werden die Verzeichnisse auch gelöscht:
> ezjail-admin delete -w minecraft
zum Schluß kann man dann die IP der Jail auch aus der Konfigurationsdatei und der NIC entfernen:
> vi /etc/rc.conf > ifconfig sk0 inet 192.168.2.100 -alias
# Das Jail-Paket installieren: # > cd /usr/ports/sysutils/ezjail # > make clean # > make config-recursive # > make # > make deinstall # > make install # > pkg info -ao | grep -Fi jail # > make clean # # Die Jail-Umgebung kompilieren: # > ezjail-admin update -b # # Den aktuell verwendeten Ports-Tree in die Jail-Umgebung kopieren: # > mkdir /usr/jails/basejail/usr/ports # > cp -a /usr/ports/ /usr/jails/basejail/usr/ports/ # # Eine Jail einrichten: # > ifconfig em0 alias 192.168.1.2/32 # > ezjail-admin create testjail 192.168.1.2 # # Ein paar Einstellungen in der Jail vornehmen: # > cat /etc/make.conf > /usr/jails/testjail/etc/make.conf # > vi /usr/jails/testjail/etc/rc.conf # hostname="erde.fritz.box" # defaultrouter="192.168.1.254" # sshd_enable="YES" # > vi /usr/jails/testjail/etc/resolv.conf # search fritz.box # nameserver 192.168.1.4 # > tar cf - /home/bin /home/sbin /home/etc | tar xf - -C /usr/jails/testjail/ # > chown -R 0:0 /usr/jails/testjail/home/ # > ls -lha /usr/jails/testjail/home/ # # Jail starten # > service ezjail start testjail # > jls # > netstat -4anp tcp | fgrep 192.168.1.2 # # In die Jail einloggen und einige Kommandos ausführen: # > ezjail-admin console testjail # > rm -f /etc/localtime # > ln -s /usr/share/zoneinfo/MET /etc/localtime # > exit # > ezjail-admin console testjail # > cd /usr/ports/shells/bash-static # > make clean # > make # > make install # > make clean # > cd /usr/ports/sysutils/screen # > make clean # > make # > make install # > make clean # > screen -mdS Pakete /root/bin/Update_-_FreeBSD_-_alle_Pakete_aus_dem_Ports-Tree.sh # > exit # # Jail wieder runter fahren: # > service ezjail stop testjail