Vorbereitung der Jails

Zur Verwaltung der Jails setze ich ezjail ein.

Hintergrund

Der Server hat nach außen hin einen /64er Block IPv6 Adressen, jedoch nur eine einzige IPv4 Adresse. Somit kommt man nicht drum rum, den IPv4 Verkehr aus den Jails raus durch ein NAT laufen zu lassen. Dies erledigt pf. Für den Weg rein wird jeglicher Verkehr (auch mit pf) auf eine Jail geleitet, in der ein Reverse Proxy läuft.

Vorwiegend sollen Webserver in den Jails laufen, somit wird jeglicher http und https Verkehr an die Reverse-Jail umgeleitet.

Ungefähr so:

                 +==Host==+
                          |
                 +-<-pf->-+
                 |        |
              +-----+  +-----+
              | em0 |  | lo0 |
              +-----+  +-----+
                 |        |
                 |        +------+==Reverse-Proxy==+
    +==Internet==+        |
                          +------+==Jail-A==+
                          |
                          +------+==Jail-B==+
                          |
                          +------+==...==+

Dies hat den Vorteil, dass ich die Terminierung der SSL-Zertifikate dem Reverse-Proxy überlassen kann.

Intern, zwischen den Jails wird dann nur IPv6 gesprochen.

Vorbereitung

Die Installation von ezjail ist recht einfach:

cd /usr/ports/sysutils/ezjail
make install

Pro Jail möchte ich ein eigenes ZFS Dataset haben, somit kommt in die /usr/local/etc/ezjail.conf (weiter unten) folgendes:

ezjail_use_zfs="YES"
ezjail_use_zfs_for_jails="YES"
ezjail_jailzfs="jail/root"

Ggf. ezjail_jailzfs anpassen, es sollte ein Dataset sein, dass auf /usr/jails zeigt:

zfs list -r jail
NAME        USED  AVAIL  REFER  MOUNTPOINT
jail        224K  2.56T    88K  none
jail/root   224K  2.56T    88K  /usr/jails

(Dieses Dataset habe ich mir bei der Installation erzeugt. Mehr Details dort nachlesen.)

Danach in der /etc/rc.conf ezjail selbst aktivieren:

ezjail_enable="YES"

Weil wir gerade dabei sind, ein zweites Loopback Interface einrichten, um den Traffic der Jails von dem Loopback Traffic des Hosts zu separieren:

cloned_interfaces="lo1"

Damit das mit dem Traffic in die Jails rein funktioniert muss man noch Forwarding aktivieren:

gateway_enable="YES"
ipv6_gateway_enable="YES"

Danach kann man lo1 und ezjail manuell starten:

service netif cloneup
service ezjail start

Für das Forwarding braucht es noch zwei sysctls. Unter /etc/sysctl.conf:

net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1

Bootstrapping

Auf meinem Server baue ich mir die Pakete selbst. Ich könnte mir das Base Jail mit ezjail-admin update -bp erstellen, doch dann wird world auf nur einem Core gebaut, und das dauert…

  • -b ruft make buildworld; make installworld auf, um die Base Jail zu bauen.
  • -p gibt der Base Jail mittels portsnap einen ports tree mit.

Um das ein bisschen zu beschleunigen mache ich das hier:

cd /usr/src
make buildworld -j8

ezjail-admin update -ip
  • -i ruft nur make installworld auf (haben world ja eben erst gebaut).
  • -j8 (von make) sollte der Anzahl von Cores entsprechen..

Siehe an, der Aufwand hat sich gelohnt:

zfs list -r jail
NAME                 USED  AVAIL  REFER  MOUNTPOINT
jail                1.18G  2.56T    88K  none
jail/root           1.18G  2.56T   104K  /usr/jails
jail/root/basejail  1.15G  2.56T  1.15G  /usr/jails/basejail
jail/root/newjail   26.4M  2.56T  26.4M  /usr/jails/newjail

Als nächsten Schritt kümmern wir uns um die Jail Flavours.