Bisherige Beiträge in der Reihe:

In diesem Beitrag geht es um die Strukturierung der Netzwerke um den Server herum. Ich trenne die an die FritzBox angeschlossenen Geräte von den virtuellen Maschinen auf meinem Server ab. Dazwischen vermittelt eine Firewall-VM. Zunächst sind nur diese beiden Netzwerke geplant; eine DMZ für Dienste im Internet folgt eventuell später. Von vorne herein wird sowohl auf IPv4, IPv6 und auf funktionierendes DNS gesetzt.

Netzwerk-Übersicht

Wie gesagt, es gibt eine FritzBox, an der hängen einige physikalisch vorhandene Geräte mit Kabeln oder WLAN. Aus der FritzBox kommt auch das Internet, sowohl IPv4 als auch IPv6 im dual stack. Das heißt insbesondere, dass wir a) global verwendbare IPv6-Adressen haben und b) nicht wie bei DSLite dafür keine global verwendbare IPv4-Adresse. Für das Server-Setup ist das relativ egal; interessant ist daran hauptsächlich, dass die FritzBox unter den Vorgaben des Providers IPv6-Adressen verteilt und wir einen Teil davon dem Server zur Verwaltung weiterreichen (prefix delegation). Mehr Details zu dem Thema gibt es in den IPv6-Vorüberlegungen.

Wir haben also folgende Netzwerke:

  • Eine einzelne IPv4-Adresse im globalen Internet, zugewiesen an die FritzBox, die macht damit NAT.
  • Ein global routbares IPv6-Subnetz mit Präfix /56, also 4722366482869645213696 IPs. Sollte vorerst genügen. Das kann man in bis zu 256 Subnetze mit Präfix /64 aufteilen.
  • Weil IPv4 knapp ist, haben wir noch ein paar global nicht routbare, interne Netze:
    • 192.168.178.0/24 für die Geräte, die direkt an der FritzBox hängen.
    • 192.168.179.0/24 für die Geräte im Gast-WLAN der FritzBox. Irrelevant für den Server.
    • 10.0.0.0/24 für die VMs. Die kommen vorerst alle in das gleiche Subnetz, bis eine sinnvolle Teilung offensichtlich wird.

Nachdem ich zwei Mitbewohner habe, sind natürlich nicht alle Geräte im Netzwerk der FritzBox unter meiner Kontrolle und überhaupt haben die Windows und auch beim Datenverkehr sollte man da immer auf Schutz achten. Die VMs sollen natürlich verschiedene den Nutzern dienliche Server anbieten, der Zugang zum VM-Netzwerk wird daher zwar direkt möglich sein (ohne NAT), eine Firewall wird dazwischen aber ggf. den Verkehr beschränken. Andersherum gilt gegebenenfalls das gleiche.

Der Datenverkehr mit dem Internet wird an der FritzBox gefiltert. Im Fall von IPv4 macht diese ohnehin NAT, also müssen Netzwerkports explizit an Hosts weitergeleitet werden, wenn sie öffentlich erreichbar sein sollen. Im Fall von IPv6 haben wir global direkt erreichbare Adressen ohne NAT, die FritzBox kommt aber sinnvollerweise mit einer eigenen Firewall, die alles wegwirft, was nicht ausdrücklich durchgelassen werden soll.

Umsetzung auf dem Host

Die Installation von Proxmox (Debian GNU/Linux) auf dem Server nenne ich ab sofort Host.

Auf dem Host muss entsprechende Vorbereitung gemacht werden, um die Netzwerke so einzurichten. Bisher verwenden wir DHCP auf einem der beiden physikalischen Netzwerkinterfaces, was dem Host Internetzugang verschafft. Jetzt neu erstellte VMs würden dieses Interface als Netzwerkbrücke verwenden und daher ebenfalls von der FritzBox per DHCP ihre IP-Adressen im 192.168.178.0/24 bekommen. Das ist mitunter praktisch, unser Plan sieht aber etwas anderes vor.

Die notwendigen Änderungen an der Netzwerkkonfiguration des Hosts sind nicht auf dessen Weboberfläche möglich, also machen wir es auf der Shell und bearbeiten im Texteditor unseres Vertrauens (natürlich vim) die Datei /etc/network/interfaces:

# Loopback, hier wird nichts geändert!
auto lo
iface lo inet loopback

# Die physikalischen Netzwerkinterfaces heißen bei mir so, muss nicht überall so sein!
# Durch die folgenden Anweisungen werden die Interfaces NICHT konfiguriert.
iface enp2s0f0 inet manual
iface enp2s0f1 inet manual

# Um von Proxmox genutzt werden zu können, müssen die Interfaces zum einen Brücken sein und zum anderen richtig benannt sein, also folgende Konfiguration mit ipv4:
auto vmbr0
iface vmbr0 inet static
	address 192.168.178.2 # Frei wählbar, sofern noch frei
	netmask 255.255.255.0
	gateway 192.168.178.1 # die FritzBox
	bridge_ports enp2s0f0 # das Interface, was mit Kabel an die FritzBox angeschlossen wird
	bridge_stp off # kompliziertere Netzwerkstrukturen brauchen das ggf. auf on
	bridge_fd 0
iface vmbr0 inet6 auto # IPv6 machen wir vollautomatisch.

# Wir erstellen ein virtuelles Netzwerkinterface für die VMs
iface dummy0 inet manual
iface vmbr1 inet static
	address 10.0.0.1 
	netmask 255.255.255.0
	bridge_ports dummy0
	bridge_fd 5
	bridge_stp off

# IPv6 brauchen wir hier nicht, das machen wir in der Konfiguration der Firewall.

Damit uns dummy0 zur Verfügung steht, müssen wir beim Boot ein Kernel-Modul laden lassen:

echo 'dummy' >> /etc/modules

Auch wenn man diese Änderung auf der Kommandozeile mit den richtigen Befehlen live schalten könnte, kommt das Webinterface von Proxmox dabei nicht mit. Daher ist an dieser Stelle ein Reboot das sinnvollste. Beim Neu-Verbinden aber die geänderte IP-Adresse nicht vergessen!

Hat man alles richtig gemacht, gibt es in der Sektion Networks in der Weboberfläche keine Überraschungen:

network interfaces in proxmox

pfSense als Firewall

Auf dem Server gibt es jetzt also zwei Netzwerkkarten, die jeweils an einem eigenen Netz angeschlossen sind:

  • Die physikalisch tatsächlich vorhandene, die das FritzBox-Netzwerk bereitstellt.
  • Die nur virtuell vorhandene (dummy0), die das Netzwerk der VMs bereitstellt.

Um zwischen den Beiden Netzwerken zu routen und mit einer Firewall den Verkehr zu kontrollieren verwenden wir die erste VM, nämlich pfsense. Dabei handelt es sich um eine Softwaresammlung auf Grundlage von OpenBSD, die mit einem Web-Frontend zur Konfiguration und der weiteren notwendigen Software daher kommt. Das könnte man auch alles auf einer Linux-VM oder direkt auf dem Host selbst machen, zum einen ist eine klare Teilung der Zuständigkeiten nicht das schlechteste für so ein Vorhaben und zum anderen ist das Einrichten einer Firewall ein gelöstes Problem, bei dem man auf erprobte und getestete Lösungen wie pfsense zurückgreifen und nicht alle Fehler selber nochmal machen sollte, die bei pfsense schon gelöst sind.

Einrichtung der VM

Der Download von pfsense wird mittlerweile nur noch in 64bit angeboten. Wir nehmen davon den CD Image (ISO) installer. Ist der Download abgeschlossen, kann das ISO-Abbild in den Datenbestand von Proxmox hochgeladen werden.

In der Web-Oberfläche von Proxmox findet man als Untereinheit des Hosts verschiedene Storage-Einheiten. Einmal local für Templates, Backups, ISOs, etc und local-lvm für die Datenträger der virtuellen Maschinen und Container. Wir klicken auf ersteres und dort auf den Button Upload, um das heruntergeladene ISO auf den Host hochzuladen.

Ist dieser Vorgang abgeschlossen, kann man rechts oben auf den Create VM-Knopf drücken und die VM einrichten. Einige sinnvolle Standardeinstellungen:

  • Name: firewall (frei wählbar)
  • CD/DVD: unter ISO image das pfsense ISO auswählen
  • OS: Other OS types (pfsense verwendet OpenBSD)
  • Hard Disk: Bus sata, Disk size sollte mit 8 GB ausreichen
  • CPU: eine CPU reicht, der type sollte dringend auf default (kvm64() gelassen werden. Ich wollte erst host nehmen, damit die AES-NI-Sachen für IPSec/OpenVPN verwendet werden können, dann bootet aber das System nicht.
  • Memory: Zum Betrieb reichen angeblich auch 512 MB, die Installation klappt dann aber zumindest nicht. Wenigstens währenddessen muss also 1024 MB gewählt werden.
  • Network: Bei bridge wird vmbr0 gewählt, um die Verbindung zur FritzBox herzustellen. Das zweite Interface konfigurieren wir im Anschluss. Als Model wählen wir virtio - später sind für optimalen Durchsatz aber noch Einstellungen notwendig!

Bevor man die VM direkt startet, sind noch weitere Einstellungen notwendig, alle unter Hardware:

  • Display: Spice. Das ist nicht notwendig aber komfortabler als VNC, wenn man auf dem Desktop einen Spice-Client hat.
  • Add, Network device, wie oben, diesmal mit vmbr1, um die Verbindung zum VM-Netzwerk herzustellen.

Sind diese Einstellungen auch gemacht, kann die VM mit Klick auf Start in Betrieb genommen werden. Man sieht davon erst mal gar nichts; dazu muss man erst Verbindung zur Konsole aufnehmen. Hat man einen Spice-Client installiert (unter Linux etwa virt-viewer), kann man im Popup Console auch Spice wählen, ansonsten tut’s auch VNC.

Die VM bootet von der virtuell eingelegten DVD und startet das Installationsprogramm von pfsense. Die Standardeinstellungen sollten genügen. Spannend wird es nach dem Reboot erst wieder, wenn die Netzwerkkonfiguration beginnt.

Netzwerkkonfiguration

Um zwischen den Netzwerken vermitteln zu können, muss die Firewall erstmal selbst Teil der Netze werden. Dazu bietet die automatisch startende Konfiguration von pfsense direkt das passende Modell an: Zuerst wird man nach dem Interface WAN gefragt. Wir wählen hier das erste aus der Liste und konfigurieren es statisch. DHCP ginge natürlich auch, bei kritischer Infrastruktur wie der Firewall vergebe ich das aber gern manuell in einem eigenen Adressbereich. Ich wähle daher die folgenden Einstellungen, nachdem ich die Einrichtung von VLANs abgelehnt habe:

WAN-Interface

  • Adresse: 192.168.178.3 (also nach FritzBox und Proxmox-Host)
  • Prefix: /24, das entspricht einer Netzmaske von 255.255.255.0
  • Gateway: 192.168.178.1 (die FritzBox)
  • DNS: 192.168.178.1 (auch die FritzBox, später kommt noch mehr)
  • IPv6 lasse ich per DHCP machen

LAN-Interface

  • Adresse: 10.0.0.2 (.1 hat schon der Proxmox-Host)
  • Prefix: /24
  • Gateway: keines
  • IPv6: bleibt erstmal unkonfiguriert, später folgen komplexere Einstellungen.

FritzBox

Zurück zur FritzBox! Damit die Kommunikation im Netzwerk der FritzBox, also auch zwischen meinem Desktop und den VMs möglich ist, muss den Geräten die Route ins 10.0.0.0/24-Netz mitgeteilt werden. Das ist in der FritzBox unter Heimnetz, Netzwerkeinstellungen, IPv4-Routen einstellbar, man fügt eine Neue IPv4-Route hinzu:

static route in fritzbox gui

Die Änderung wird bei der nächsten DHCP-Aktualisierung auch auf den Clients gültig. Bis dahin kann es sein, dass man das Netzwerk der VMs nicht erreicht! Wer es eilig hat, kann entweder einen DHCP-Request schicken oder mit ip route add 10.0.0.0/24 via 192.168.178.3 unter Linux selbst die Route statisch zu seinem Desktop hinzufügen.

Nochmal Netzwerkkonfiguration

Die Netzwerkinterfaces müssen nochmal konfiguriert werden, diesmal mit ein paar mehr Einstellungen. Bei der Anmeldung im Interfaces des pfsense-Routers werden wir gleich dazu aufgefordert. Das Interface wartet unter https://10.0.0.2. Theoretisch wäre es auch auf der Adresse aus dem Netz der FritzBox erreichbar, nachdem das aber für die Firewall als WAN gilt, blockiert sie dort den Zugriff erstmal für alle.

Hat man sich auf dem Interface eingeloggt, kann man nochmals die gleiche Netzwerkkonfiguration wie oben wiederholen. Die weiteren Einstellungen machen wir im Detail:

System - General Setup

Wir machen hier hauptsächlich Änderungen am DNS:

  • Hostname: firewall
  • Domain: domain.tld (ich habe eine Domain eingetragen, die ich besitze)
  • DNS-Servers:
    • 192.168.178.1 / none - die FritzBox
    • 8.8.8.8 / GW_WAN 192.168.178.1 - Google’s DNS Dienst, über IPv4 ansprechen
    • 8.8.4.4 / GW_WAN 192.168.178.1
    • 2001:4860:4860:8888 / FRITZBOX_DHCP6 - wan fe80:... - Über IPv6 ansprechen
    • 2001:4860:4860:8844 / FRITZBOX_DHCP6 - wan fe80:...

Damit diese statischen DNS-Einstellungen nicht wieder verschwinden, habe ich den Haken bei DNS Server Override entfernt.

Bei Timeservers habe ich noch 0.de.pool.ntp.org 1.de.pool.ntp.org 2.de.pool.ntp.org eingetragen.

System - Advanced

Admin Access

In diesem Menupunkt machen wir nicht viele Änderungen, wir deaktivieren nur den DNS Rebind Check für nachher. Damit wird normalerweise verhindert, dass jemand über die Erstellung passender DNS-Namen Nutzer auf interne Netzwerke umleitet, in denen sie eigentlich gar nicht landen wollten. Da wir aber als Clients der Firewall nur VMs haben und uns immer ordentlich aus dem Interface der Firewall ausloggen, kann man dieses Risiko hinnehmen.

Sinn der Änderung ist, dass später auch VMs mit privaten IPv4-Adressen über DNS erreichbar sind.

Networking – kritisch!

Unter Network Interfaces muss unbedingt Hardware Checksum Offloading deaktiviert werden, damit nicht die Bandbreite über das virtuelle Interface (also für alle VMs) einbricht, wenn man die eine virtio-Netzwerkkarte konfiguriert hat.

Interfaces - WAN

Die Einstellungen hier können größtenteils so gelassen werden, IPv4 bleibt statisch, IPv6 kommt über DHCP. Weiter unten wird der Haken bei Only request an IPv6 prefix, do not request an IPv6 address gemacht. Das ist in Ordnung, da die FritzBox auf selbständige Zuordnung der IP-Adressen (SLAAC) eingestellt ist.

Die DHCPv6 Prefix Delegation Size wird auf 64 gestellt. Das ist die kleinste erhältliche Größe eines Netzwerks, die wir für unsere VMs anfordern - immernoch 18446744073709551616 IPs. Den Haken Send IPv6 prefix hint brauchen wir auch.

Der Haken bei Block private networks and loopback addresses ist zu entfernen. Eigentlich ist das eine sinnvolle Sache, aber nur wenn pfsense direkt am Internetmodem hängt. Nachdem unsere ihr WAN-Interface in einem privaten Netzwerk der FritzBox hat, müssen wir diesen zusätzlichen Schutz deaktivieren.

Interfaces - LAN

Hier nehmen wir hauptsächlich die Konfiguration von IPv6 vor: Unter IPv6 Configuration Type wählen wir Track Interface und weiter unten bei IPv6 Interface dann WAN. Dadurch beobachtet das LAN-Interface, welche Einstellungen für das WAN-Interface gelten (die kommen dort per DHCP an) und passt sich entsprechend an. Das ist vor allem für die Prefix delegation relevant, damit wir bei der Konfiguration von DHCPv6 später das richtige Präfix an die VMs bekanntgeben.

Speichern und anwenden!

Firewall - Rules

An dieser Stelle nehmen wir erste Firewall-Einstellungen vor. Nachdem das WAN in unserem Fall ein Heimnetzwerk ist und einigermaßen vertrauenswürdig, können wir etwa eine neue Regel einrichten, die ICMP für PING und solche Befehle durchlässt. Dazu müssen wir auf den Tab wechseln, auf dessen Interface der Datenverkehr reinkommt, also WAN. Außerdem erlauben wir DNS-Anfragen aus dem WAN an die Firewall.

ICMP aus dem WAN

Diese Regel sieht wie folgt aus:

  • Action: Pass
  • Interface: WAN
  • Address family: IPv4+IPv6
  • Protocol: ICMP
  • Source: WAN net
  • Destination: any
  • Description: Eingehendes ICMP

DNS aus dem WAN an die Firewall

  • Action: Pass
  • Interface: WAN
  • Address family: IPv4+IPv6
  • Protocol: UDP
  • Source: WAN net
  • Destination: This firewall (self)
  • Destination Port Range From: DNS
  • **Description: ** DNS-Anfragen

Abspeichern und Anwenden!

Services - DHCP

Im Tab LAN können wir die nötigen Einstellungen für das interne Netzwerk hinterlegen. Das Meiste davon kann man so lassen, wie man möchte. Ich habe bei Range noch hinterlegt, dass die vom DHCP vergebenen Adressen bei 100 starten, und bei Domain Name und Domain search list noch eine Domain eingetragen, die ich besitze. Dadurch erhalten alle VMs einen FQDN von hostname.domainname.tld und der DNS-Server der Firewall wird Anfragen nach diesem Host mit den Einträgen aus DHCP beantworten. Das ist allerdings optional.

Services - DHCPv6 Server & RA

Damit die VMs eine IPv6-Adresse bekommen, muss der DHCPv6-Server im LAN aktiviert sein. Bei Domain Name und Domain search list habe ich wieder meine Domain eingetragen. Den Rest kann man so lassen

Services - DNS Resolver

Belässt man es bei der Standardeinstellung des aktivierten DNS-Resolver, wird unbound verwendet. Das ist nett, der kann nämlich DNSSEC für bessere DNS-Sicherheit. Ich habe bei den Network Interfaces ALL eingestellt gelassen, da ich auch DNS-Anfragen aus dem WAN (Erinnerung: FritzBox-Netzwerk) beantwortet haben möchte.

Außerdem habe ich die folgenden Haken gesetzt:

  • DNSSEC
  • DNS Query Forwarding
  • DHCP Registration
  • Static DHCP

Bei den Host overrides habe ich noch firewall.domain.tld eingetragen mit IP 10.0.0.2, da 192.168.178.3 auch richtig wäre, dort aber die Firewall den Zugriff auf die Weboberfläche verhindert.

Unter Access Lists sollte noch ein Eintrag hinzugefügt werden, der die Berechtigung für das WAN einführt, DNS-Anfragen zu stellen:

  • Access List Name: WAN
  • Action: Allow
  • Networks: 192.168.178.0/24 Description: FritzBox

Abspeichern und Anwenden!

Fertig

Damit ist die Konfiguration der Firewall abgeschlossen. Wer es ausprobieren möchte, kann eine neue VM erstellen und ihrer Netzwerkkarte das Interface vmbr1 zuweisen. Stellt die VM eine Anfrage über DHCP, sollte sie eine IPv4-Adresse aus dem Bereich 10.0.0.0/24 und eine IPv6-Adresse aus dem delegierten Präfix (erkennt man 2001 am Anfang, fe80 ist link-local, also keine global verfügbare Adresse) bekommen haben. Internet-Zugang von den VMs aus sollte möglich sein, ebenso das An-Pingen einer VM. Stellt man eine DNS-Anfrage an die Firewall über hostnameEinerVM.domain.tld bekommt man auch die entsprechenden IPs zurück.