Wie man ein Jail mit Iocage unter FreeBSD einrichtet
Jail ist ein Begriff für die Virtualisierung auf Betriebssystemebene unter FreeBSD. Sie wurde 1999 von Poul-Henning Kamp eingeführt und von FreeBSD seit Version 4.x übernommen.
Die Jail ermöglicht es dem Systemadministrator, ein isoliertes und unabhängiges Minisystem oder „Jail“ innerhalb des FreeBSD-Systems zu erstellen. Das „Jail“ hat sein eigenes Root-System und seine eigene Konfiguration und ist hilfreich, wenn du eine Anwendung in einer isolierten Umgebung einsetzen willst.
Iocage ist ein FreeBSD Jail-Manager, der in Python geschrieben ist. Er ist einfach und verfügt über eine leicht verständliche Befehlssyntax. Der Iocage Jail-Manager widmet sich dem ZFS-Datensatz innerhalb von Jails und ermöglicht es dir, eine Jail zu erstellen, die auf den virtuellen Netzwerkstapeln „VNET“ und/oder der „Shared IP“-basierten Jail basiert. Mit Iocage kannst du die Jail-Vorlage, die Basis-Jail und die normale Jail erstellen.
In diesem Lernprogramm zeigen wir dir, wie du mit dem Iocage Jail Manager eine FreeBSD-Jail einrichtest und konfigurierst. Wir werden Iocage auf FreeBSD installieren, eine neue Jail mit einer gemeinsamen IP einrichten, die pf-Firewall einrichten und dann den nginx-Webserver zum Testen in der Jail installieren.
Voraussetzung
Für diese Anleitung musst du den Iocage Jail Manager auf dem FreeBSD-System installieren und konfigurieren, das auf dem ZFS (Z File System) installiert ist. Außerdem musst du sicherstellen, dass du die pf Firewall auf deinem FreeBSD-System aktiviert hast.
Was wir tun werden:
- Iocage Jail Manager installieren
- FreeBSD Release herunterladen
- Shared IP und Pf Firewall einrichten
- Neues Jail mit Iocage erstellen
- Testen
Schritt 1 – Iocage auf FreeBSD installieren
Als erstes werden wir den Iocage Jail-Manager auf dem FreeBSD-System installieren und konfigurieren. Iocage ist in Python geschrieben und steht im FreeBSD Binary Package Repository zur Verfügung.
Installiere Iocage auf dem FreeBSD-System mit dem unten stehenden pkg-Befehl.
pkg install py36-iocage
Tippe „y“ ein, um die Installation des Iocage Python-Pakets zu akzeptieren und die Installation beginnt.
Sobald die Installation abgeschlossen ist, überprüfe den verfügbaren ZFS-Pool auf dem System mit dem unten stehenden Befehl zpool.
zpool list
Wähle nun den ZFS-Pool für die Iocage-Installation aus. Für diese Anleitung verwenden wir den Standard-ZFS-Pool für das installierte FreeBSD namens „zroot“.
Aktiviere den „zroot“-Pool für die Verwendung von Iocage mit dem unten stehenden Befehl.
iocage activate zroot
Jetzt ist die Iocage-Installation unter FreeBSD 12.0 abgeschlossen und du kannst die iocage-Kommandozeile verwenden, um eine FreeBSD-Jail zu erstellen und zu verwalten.
Außerdem kannst du die Jail beim Systemstart aktivieren, indem du den iocage-Dienst mit dem unten stehenden Befehl sysrc zur Datei „/etc/rc.conf“ hinzufügst.
sysrc iocage_enable=yes
Schritt 2 – FreeBSD Release herunterladen
Um eine neue Jail zu erstellen, musst du das FreeBSD Release herunterladen. Du kannst auch eine neue Jail erstellen, die eine andere Version deines FreeBSD Hosts ist.
Überprüfe die verfügbaren Release-Versionen mit dem unten stehenden iocage-Befehl.
iocage fetch
Jetzt erhältst du eine andere Version des Releases. Wähle die Version aus, die du brauchst, und gib die Nummer ein. Wähle die Nummer „2“, um die neueste Release-Version herunterzuladen.
Warte, bis das FreeBSD-Release-Image heruntergeladen ist.
Wenn du ein anderes Image herunterladen möchtest, kannst du den folgenden Befehl verwenden.
iocage fetch 11.3-RELEASE
Das FreeBSD-Release-Image für Jail wurde heruntergeladen.
Schritt 3 – Shared IP und Pf Firewall einrichten
Nachdem wir die Quell-Images für die Jail heruntergeladen haben, konfigurieren wir das Netzwerk und die Pf-Firewall auf dem System. Wir erstellen eine neue Netzwerkschnittstelle namens „bridge0“ mit der Netzwerk-IP-Adresse „10.8.8.1/24“, die von der Jail verwendet wird.
Füge die neue Konfiguration zur Datei „/etc/rc.conf“ hinzu, indem du den folgenden Befehl ausführst.
sysrc cloned_interfaces+="bridge0" sysrc ifconfig_bridge0="10.8.8.1/24"
Erstelle eine neue Schnittstelle „bridge0“ mit der Netzwerk-IP-Adresse „10.8.8.1/24“.
ifconfig bridge0 create ifconfig bridge0 10.8.8.1/24 up
Nachdem du die Schnittstelle „bridge0“ erstellt hast, überprüfe sie mit dem folgenden Befehl.
ifconfig bridge0
Du erhältst dann das unten stehende Ergebnis.
Als Nächstes konfigurieren wir die pf-Firewall und fügen eine neue Konfiguration für die Jail-Umgebung hinzu. In dieser Anleitung verwenden wir die einfache Pf-Firewall-Konfiguration.
So richtest du die Pf Firewall unter FreeBSD 12.0 ein
Gehe in das Verzeichnis „/usr/local/etc“ und bearbeite die Konfigurationsdatei „pf.conf“.
cd /usr/local/etc/ vim pf.conf
Füge die interne Netzwerkschnittstelle „bridge0“ und ihre IP-Adresse als Variablen „int_if“ und „localnet“ hinzu.
# Internal interface int_if = "bridge0" localnet = $int_if:network
Definiere nun die IP-Adresse der Host-Jail und die Ports, die an die Jail weitergeleitet werden sollen. Wir werden die HTTP- und HTTPS-Verbindungen auf der externen Schnittstelle des Systems an die IP-Adresse des Jail-Hosts „10.8.8.5“ weiterleiten.
# Port-Forward http and https to Jail '10.8.8.5' ports_to_forward="{ 80, 443 }" forward_host="10.8.8.5"
Aktiviere nat auf der externen Schnittstelle „ext_if“ für die Jail-Variable „localnet“ und aktiviere dann die Portumleitung von der Variable „ports_to_forward“ zum Host „forward_host“.
# nat jail to internet and internet to jail (http and https only) nat on $ext_if inet from $localnet to any -> ($ext_if) rdr on $ext_if proto tcp from any to any port $ports_to_forward -> $forward_host
Leite nun alle Verbindungen von der Schnittstelle ‚bridge0‘ weiter und leite eingehende Verbindungen auf der externen Schnittstelle an die HTTP- und HTTPS-‚ports_to_forward‘ weiter.
pass from { self, $localnet } to any keep state pass in on $ext_if proto {udp, tcp} from any to any port $ports_to_forward keep state
Speichern und schließen.
Teste nun die Konfiguration der pf-Firewall und vergewissere dich, dass kein Fehler auftritt, dann lade den pf-Dienst neu.
service pf check service pf reload
Überprüfe danach alle Regeln der Pf-Firewall mit dem folgenden Befehl.
pfctl -s rules
Du erhältst dann das unten stehende Ergebnis.
Außerdem kannst du den nat-Status auf der pf-Firewall überprüfen.
pfctl -v -s nat
Das Ergebnis: Die neue Schnittstelle „bridge0“ wurde erstellt und die pf-Firewall konfiguriert. Nun können wir die erste Jail erstellen.
Unten siehst du die vollständige Konfiguration der Pf-Firewall.
cat /usr/local/etc/pf.conf
# Define External Interface and IP Address ext_if="vtnet0" ext_ip="198.13.39.207" # Define TCP and UDP Services ext_tcp_ports="{ ssh, smtp, smtps, imaps, http, https, domain }" ext_udp_ports="{ domain, ntp }" # Internal interface int_if = "bridge0" localnet = $int_if:network # Port-Forward http and https to Jail '10.8.8.5' ports_to_forward="{ 80, 443 }" forward_host="10.8.8.5" # Skip the localhost set skip on lo0 # Log interface set loginterface $ext_if # nat jail to internet and internet to jail (http and https only) nat on $ext_if inet from $localnet to any -> ($ext_if) rdr on $ext_if proto tcp from any to any port $ports_to_forward -> $forward_host # Default Policy block in all pass out all keep state # Allow Ping pass inet proto icmp icmp-type echoreq pass from { self, $localnet } to any keep state pass in on $ext_if proto {udp, tcp} from any to any port $ports_to_forward keep state # Allow Services pass in proto tcp from any to any port $ext_tcp_ports pass in proto tcp from any to any port $ext_udp_ports # Log access for ssh and http pass log quick proto tcp from any to any port { ssh,http }
Schritt 4 – Ein neues Jail mit Iocage erstellen
Nachdem wir das Netzwerk und die pf-Firewall auf dem FreeBSD-System konfiguriert haben, können wir mit iocage eine neue Jail erstellen.
Erstelle mit dem folgenden iocage-Befehl eine neue Jail mit dem Namen „jail01“ und dem FreeBSD-Release „12.0-RELEASE“.
iocage create -n jail01 -r 12.0-RELEASE
Füge nun die IP-Adresse und das Standard-Router-Gateway der Jail hinzu. Wir geben der ‚jail01′ die IP-Adresse 10.8.8.5‘ und das Standard-Router-Gateway ist die IP-Adresse des ‚bridge0‘-Hosts ‚10.8.8.1‘.
iocage set ip4_addr="bridge0|10.8.8.5" jail01 iocage set defaultrouter="10.8.8.1" jail01
Aktiviere die Jail, damit sie beim Booten startet.
iocage set boot=on jail01
Überprüfe nun die Jail-Liste.
iocage list
Dort findest du die „jail01“ mit der IP-Adresse „10.8.8.5“ und der FreeBSD-Version „12.0“.
Starte die „jail01“ mit dem unten stehenden Befehl.
iocage start jail01
Sobald die Jail gestartet ist, greifst du mit dem folgenden Befehl auf die Jail zu.
iocage console jail01
Du erhältst eine neue Shell in der jail01, wie unten gezeigt.
Überprüfe in der Jail die IP-Adresse der Schnittstelle „bridge0“ der „jail01“.
ifconfig bridge0
Du wirst feststellen, dass die Schnittstelle „bridge0“ die konfigurierte IP-Adresse „10.8.8.5“ hat.
Damit ist eine neue Jail mit dem Namen „jail01“ erstellt worden.
Schritt 5 – Testen
In diesem Schritt werden wir die „jail01“ testen, indem wir den Nginx-Webserver darauf installieren und dann versuchen, von außerhalb des Netzwerks auf Nginx zuzugreifen, wobei die Verbindung zur „jail01“ umgeleitet wird.
Aktualisiere zunächst die Binärpakete in der Jail mit dem unten stehenden pkg-Befehl.
pkg update
Danach installierst du den nginx-Webserver mit dem folgenden pkg-Befehl innerhalb der Jail.
pkg install nginx
Sobald die Installation abgeschlossen ist, füge den nginx-Dienst zum Systemstart hinzu und starte ihn.
sysrc nginx_enable=yes service nginx start
Überprüfe nun die Liste der offenen Ports in der „jail01“.
sockstat -l4
Du wirst sehen, dass der Nginx-Dienst auf dem HTTP-Port „80“ aktiv ist und läuft.
Als Nächstes ändern wir die Standardseite index.html auf der „jail01“.
Gehe in das Verzeichnis „/usr/loca/www/“ und bearbeite die Datei „index.html“.
cd /usr/local/www/ edit nginx-dist/index.html
Nimm einige Änderungen vor und beende sie.
cat nginx-dist/index.html
Rufe nun die externe IP-Adresse des Servers über deinen Webbrowser auf.
http://198.xx.xx.207/
Du erhältst die nginx index.html Seite innerhalb der „jail01“.
Damit ist die „jail01“ mit dem darauf installierten Nginx betriebsbereit. Alle HTTP- und HTTPS-Verbindungen zum Server werden auf die „jail01“ umgeleitet.