Virtualisierter Server - Netzwerkeinteilung
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:
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 mit8 GB
ausreichen - CPU: eine CPU reicht, der type sollte dringend auf
default (kvm64()
gelassen werden. Ich wollte ersthost
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 also1024 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 wirvirtio
- 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 von255.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:
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 FritzBox8.8.8.8
/GW_WAN 192.168.178.1
- Google’s DNS Dienst, über IPv4 ansprechen8.8.4.4
/GW_WAN 192.168.178.1
2001:4860:4860:8888
/FRITZBOX_DHCP6 - wan fe80:...
- Über IPv6 ansprechen2001: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.