Einleitung

Alle Artikel hier basieren auf der Erstellung eines Jails, da ich grundsätzlich jede Anwendung in einer eigenen Umgebung betreibe. Das sorgt für saubere Voraussetzungen und keine unnötig wechselseitige Abhängigkeiten. Jails können Dienste sehr einfach, sehr schlank und sehr sicher betreiben. Für FreeBSD ist es egal, ob eine oder 100 Jails gleichzeitig laufen, relevant sind nur die Dienste und deren Ressourcen, die darin laufen. Das macht das ganze sehr effizient und flexibel.

Ziele

Ziel ist die Erstellung eines Jails mit den wichtigsten Grundeinstellungen, damit andere Artikel darauf aufbauen können. Wichtig: Diese Anleitung ist explizit darauf ausgelegt worden in Koexistenz mit BHYVE auf einem FreeBSD Server betrieben zu werden. Das bedeutet, das die Ablage der Daten und auch die Netzwerkschnittstellen so konfiguriert sind, das beide auf die gleichen Logik aufbauen.

NEU: Für ganz ungeduldige habe ich einen Konsole only Abschnitt. Da gibts nur Befehle, keine Erklärungen.

Letzte Aktualisierung:

  • 17.01.2026: Kontrolle und kleinere Anpassungen
  • 23.12.2025: Update FreeBSD 15, kleinere Anpassungen. Bastille mit fester MAC Adresse.
  • 08.12.2024: Update FreeBSD 14.2, finale Version, Updates ergänzt
  • 01.12.2024: Weiteres Tuning
  • 01.12.2024: Auslagerung der Netzwerkeinstellungen in einen eigenen Artikel
  • 15.11.2024: Feinschliff. Integration in dee neuen Artikel: FreeBSD-Server
  • 02.03.2024: Initiale (interne) Version

Grundbedingungen

Bastille

Installieren

Bastille ist nach der Anpassung der Paketquelle mit pkg install -y bastille schnell installiert.

Konfiguration

Mit service bastille enable startet Bastille zwar automatisch beim booten.

In der Konfigurationsdatei /usr/local/etc/bastille/bastille.conf werden folgende Einträge angepasst:

sysrc -f /usr/local/etc/bastille/bastille.conf bastille_tzdata="Europe/Berlin" # Zeitzone einstellen
sysrc -f /usr/local/etc/bastille/bastille.conf bastille_zfs_enable="YES"       # ZFS Funktionen aktivieren
sysrc -f /usr/local/etc/bastille/bastille.conf bastille_zfs_zpool="work"       # ZFS Pool 
sysrc -f /usr/local/etc/bastille/bastille.conf bastille_network_loopback="localnet0" # Netzwrkschnittstelle für private Jails

Als erstes wird ein aktuelles FreeBSD mit bastille bootstrap 15.0-RELEASE update heruntergeladen.

Optional: Wenn der zusätzliche data Pool genutzt werden soll, dann kann dieser mit zfs create -o mountpoint=/usr/local/bastille/data data/bastille mit angelegt werden. Die Verzeichnisstruktur per zfs list | grep bastille sieht dann so aus:

NAME                                  USED  AVAIL  REFER  MOUNTPOINT
data/bastille                         96K   1.75T   136K  /usr/local/bastille/data
work/bastille                         651M   430G   136K  /usr/local/bastille
work/bastille/backups                  96K   430G    96K  /usr/local/bastille/backups
work/bastille/cache                   199M   430G    96K  /usr/local/bastille/cache
work/bastille/cache/XX.Y-RELEASE      199M   430G   199M  /usr/local/bastille/cache/XX.Y-RELEASE
work/bastille/jails                    96K   430G    96K  /usr/local/bastille/jails
work/bastille/releases                452M   430G    96K  /usr/local/bastille/releases
work/bastille/releases/XX.Y-RELEASE   451M   430G   451M  /usr/local/bastille/releases/XX.Y-RELEASE
work/bastille/templates                96K   430G    96K  /usr/local/bastille/templates

Bevor es weitergeht, ist jetzt ein guter Zeitpunkt das System mit reboot neu zu starten um zu schauen ob noch alles klappt.

  • Diese Schnittstellen existieren:
    • publicnet0 mit dem Mitglied igb0 und
    • localnet0 mit der IP Adresse 10.0.0.1
  • Routing ist aktiviert, denn sysctl net.inet.ip.forwarding hat den Wert 1
  • work/bastille ist nach /usr/local/bastille eingebunden
  • OPTIONAL: data/bastille ist nach /usr/local/bastille/data eingebunden

Damit sind die Vorbereitungen abgeschlossen und das System vorbereitet.

Erstellen

Nun können Jails auf zwei Arten erzeugt werden:

  • bastille create JAILNAME XX.Y-RELEASE 10.0.0.10 localnet0 erzeugt ein Jail mit dem privaten Netzwerk. Das Jail ist aus dem lokalen Netz erst mal nicht erreichbar, die benötigen Ports werden später per NAT in der pf Firewall freigegeben (so wie bei Docker). Die IP Adresse wird manuell vergeben!
  • bastille create -B -M JAILNAME XX.Y-RELEASE 0.0.0.0 publicnet0 erzeugt ein Jail welches sich per DHCP eine IP Adresse aus dem lokalen Netzwerk zieht und auch darüber komplett erreichbar ist (wenn die pf Firewall es zulässt). Die Option -M erzeigt eine zufällige MAC Adresse, die dann dem Jail fest zugewiesen wird.

Die IP-Adresse am besten statisch im DHCP-Server hinterlegen, damit sie sich nicht mehr ändert und per DNS veröffentlichen (JAILNAME.domain.local).

Anpassen

Jails sind von Hause aus relativ streng in den Berechtigungen, was innerhalb des Jails aufgerufen und an Systemfunktionen genutzt werden kann. Um z.B.

  • einen Ping aus einem localnet0 Jail heraus zu erlauben, muss die Funktion allow.raw_sockets aktiviert oder
  • der Zugriff auf geteilten Speicher per allow.sysvipc erlaubt werden, typischerweise für Postgres. Das kann aber einzeln pro Jail mit bastille config JAILNAME set OPTION gesetzt werden, in diesen beiden Beispielen mit:
  • bastille config JAILNAME set allow.raw_sockets 1
  • bastille config JAILNAME set allow.sysvipc 1 Wichtig ist, das ein Jail danach neu gestartet werden muss, damit die Option aktiviert wird.

Um z.B. allen Jails einen Ping zu erlauben, kann das auch für alle mit bastille config ALL set allow.raw_sockets 1 gesetzt werden.

Zugriff

Auf das Jail kann nun mit dem Befehl bastille console JAILNAME zugegriffen werden. Je nachdem was darin läuft, kann auch nach der Erstellung eines administrativen Benutzers auch SSH aktiviert werden. Dann aber unbedingt daran denken das root Passwort mit passwd zu setzen.

Updates

Updates sind für den sicheren und zuverlässigen Betrieb der Systeme unerlässlich. Neben der regelmäßigen Aktualisierung von Paketen betrifft dies auch das Basissystem selbst. Folgende Aufgaben sind daher regelmäßig durchzuführen:

Konsole

Voilá