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:

  1. Iocage Jail Manager installieren
  2. FreeBSD Release herunterladen
  3. Shared IP und Pf Firewall einrichten
  4. Neues Jail mit Iocage erstellen
  5. 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.

Referenz

Das könnte dich auch interessieren …