Kleine "private" Cloud mit pfSense als Firewall
-
Aloha,
nach einem Gespräch mit meinem Studenten, der sich eine kleine Cloud zu Hause bauen wollte und den letzten Themen mit @Bob-Dig und @mike69 hatte ich eine verspukte Idee im Kopf, wusste aber nicht ob die realisierbar ist.
Was: Webserver in der Hetzner Cloud (KVM Container Server zu günstigem Preis #noad) mit vorgeschalteter "echter" Firewall
Warum: Normalerweise bekommt man keine ordentliche Firewall vor seinen Webserver und muss so die potentielle Angriffsfläche auf der VM direkt versuchen zu mitigieren. Da sich einige nicht ganz so doll mit Linux, Kernel, IPtables/NFtables und Co auskennen (plus Fail2Ban und Co) ist bei "nur VPS mit Webserver" natürlich die Angriffsfläche größer. SSH muss da sein, Webserver auch, etc. etc. IPtables für Firewall, ggf. noch nen Frontend dafür (UFW, Shorewall, whatever) und dann noch fail2ban, damit man SSH ordentlich absichert. Und so weiter, und so weiter.
Wäre mit Firewall davor und ordentlichem VPN alles viel einfacher? Jau!Wie: (alt) Konnte man bislang natürlich alles auch schon machen, Stichwort eigener Server mieten. Dann mietet man eben die Hardware und kann darauf virtualisieren. Dann gehts aber schon in Runde 2: Virtualisierung aufbauen, KnowHow benötigt, dann ordentlich Netzwerken in der Virt Umgebung, Firewall VM vorschalten, und wieder - usw. usw. usw.
Zusätzlich ist man für Backup selbst verantwortlich, kann den Server nicht mal eben wechseln und ein eigener Server schlägt dann schonmal mit 20-30€ im Monat zu Buche. Die kleinsten VPS Instanzen gerade mal mit ~3,30 mit integriertem Backup.Also: Wie also dann?
- Setup:
- Man braucht mind. 2 (ZWEI) kleine Hetzner Cloud Instanzen. Witzigerweise müssen sie durch das (etwas gewöhnungsbedürftige) Netzwerksetup von Hetzner nicht im gleichen RZ Standort sein (Nürnberg, Falkenstein oder Helsinki sind alle möglich).
- (1) Eine davon wird mit einem Random OS gebucht
- (2) Die andere installiert ihr mit dem System und Kram den ihr schützen wollt
- Via Cloud Dashboard erstellt ihr ein zusätzliches Netzwerk. Beispielhaft "xconnect" mit IP Range 172.16.16.0/24 (wird bei 2 Instanzen dann auf /29 runtergerechnet, einfach ignorieren :))
- In diesem Netz was erscheint, könnt ihr den beiden Instanzen jetzt jeweils eine IP zuweisen (.2 und .3). Somit haben die VMs jetzt ein Interface mit ihrer Public IP4/IP6 und ein "internes". Das Interne (xconnect) muss am Einfachsten via DHCP bezogen werden, ihr bekommt dann aber definitiv die IP die ihr im Dashboard eingestellt habt. Wichtig ist DHCP deshalb, weil eure Instanzen eine /32 IP und P2P konfiguriert werden, damit jeder Traffic über die .1 des angelegten Netzes geht (Hetzner interner VirtRouter). Das ist notwendig, damit die den Traffic auch mit den anderen Instanzstandorten vernetzen können. Darum nicht wundern über das etwas "schräge" Setup :)
- Installation:
- (1) Die erste VM wird ausgeschaltet und über das Dashboard konfiguriert. Bei Networking kann man nochmal checken, ob die private IP auch drauf gemappt ist (xconnect mit der .2 sollte hier auftauchen). Dann unter ISO-Images einfach das pfSense Image auswählen (2.4.5) und einhängen. Danach die VM starten.
- (1) Nach Start von VM1 jetzt die HTML Konsole (Symbol rechts oben) aktivieren und die pfSense via eingehängtem ISO einfach installieren. Sollte nicht schwer sein :) Nach Installation und DHCP auf WAN sowie DHCP auf LAN, solltet ihr die im Dashboard angezeigte IP4 auf dem WAN anliegen haben. Dann könnt ihr auf der HTML Konsole nach fertiger Installation und Boot mit (12) in die PHP-Shell und einmal
playback enableallowallwan
ausführen. Damit wird eine flotte allow any Rule auf dem WAN erzeugt, damit ihr von außen via eurer externen IP zugreifen könnt. Das sollte man natürlich nur kurzfristig machen und sich dann flotti galoppi einloggen, admin User ändern und am Besten den Zugriff nur auf seine IP freischalten (via DynDNS Alias oder statischer IP). - (1) Hat man VM1 soweit im Griff dass man nur noch selbst via GUI auf die Kiste kommt (und dann HTTPS und SSH Port noch umverlagert auf Alternativen wie 4422 und 4443 bspw.) und zudem noch SSH nur via Key erlaubt (oder key+pw), sollte man erstmal annehmbar safe sein und kann in Ruhe die Sense konfigurieren.
- (1) Hier kann man sich jetzt wie mans kennt austoben. VPN Einrichten, Zugriff einrichten, Advanced Setup etc. für AES-NI usw.
- (1) HAProxy installieren und einrichten
- (2) Auf der zweiten Kiste kann man jetzt bspw. sein Lieblings-Linux installieren und setzt sich seine Umgebung auf. Webserver, PHP, Python, etc.
- (2) Natürlich sollte man das angelegte interne Interface (xconnect) nicht vergessen noch einzurichten, wenn nicht schon erledigt. Das sollte als zweites Netzwerk auftauchen und die beiden VMs sollten sich da schon gegenseitig pingen können (bzw. die pfSense nach Freigabe der Regeln)
- (2) ist das soweit fertig und man käme jetzt über die andere Public IP des Webservers auf den Server drauf und bekommt seinen Webserver, klemmt man die externe IP bzw. das Interface vom Hetzner-WAN ab :) (HTML Konsole via Dashboard hilft)
- (2) Die zweite Kiste ist jetzt nicht mehr erreichbar von außen weil ihr WAN down ist. Oh my... ;)
- (2) Mittels HAproxy auf der ersten VM (1) legen wir jetzt einfach die (2) als Backend für den HAproxy an und erstellen ein passendes Frontend. Da wir 80/443 auf der Sense freigemacht haben von der UI (und den Redirect auf die UI abgeschaltet haben!) kann jetzt auch dort unser Webserver antworten, der dann einfach intern über das xconnect Netz verbunden ist und so antworten kann.
Das ist jetzt natprlich nur in gröberen Zügen beschrieben, aber "you get the drift", ihr versteht wo es hingeht. Im Notfall, sollte die 2. VM down gehen, kann man mit etwas Vorbereitung und Absicherung die 2. VM auch wieder direkt ans Netz hängen, muss dann natürlich aber die DNS Einträge anpassen. Oder man nutzt gleich noch zusätzlich das Feature der Floating IP (für nen Euro im Monat) und bucht sich eine IP die man flexibel von A nach B switchen kann im Dashboard dazu. Dann kann man sogar hergehen und sich eine zweite Firewall als Redundanz bspw. in anderer Location beschaffen wenn man Ausfallsicherheit will ;)
Natürlich kann man statt HAproxy auch weiter NATten aber das läuft dann wegen fehlendem Rückweg bzw. multiplen Routen nicht ganz so schön und braucht dann auf Seite (2) noch ein paar Zusatztweaks. Zudem hat man dann wieder häßlich NAT/PortForwarding, da läuft HAproxy besser :)
Alternativ kann man natürlich auch einen VPN Tunnel zur Sense aufbauen und dort damit dann quasi sein "LAN" bauen und routen. Das wird der nächste Test werden, die externe IP (bis auf SSH/GUI) quasi komplett durchzurouten per VPN :)
Cheers
\jens - Setup:
-
@jegr sehr interessant. Danke für den Gedankenanstoss zu einem neuen Bastelprojekt! Werde ich am Wochenende gleich mal vertiefen und meine pfSense zu Hause per ipsec anbinden. Das durchrouten der externen IP finde ich sehr spannend.
Für mich ist noch nicht ganz klar wie das Routing des LAN Interfaces funktioniert. Standardmäßig wird ja auf dem LAN Interface eine Regel angelegt, die alles aus dem "LAN Net" to "Any" über jedes Protokoll erlaubt. Allerdings kann ich nicht von der 2. Hetzner Maschine die pfSense anpingen. Erst wenn ich eine zusätzliche Firewall Regel anlege und als source das Hetzner LAN netz angebe und als ziel die LAN address nehme, funktioniert auch ein ping.
Von der pfSense zum 2. Hetzner Server, kann ich ohne Probleme pingen, auch ohne diese Zusatz Regel. Es scheint als wenn "LAN NET" nicht das ist, wofür ich es halte ;)
Hast du auch ipv6 eingerichtet auf der pfSense? Zumindest holt er sich via dhcp6 auf dem WAN Interface keine Adresse. Das liegt aber wohl daran, dass dem Hetzner Server ja nur ein 64er Präfix zugewiesen wird und die pfSense wahrscheinlich versucht ebenfalls ein 64er Präfix abzurufen.
-
Ich versuche mir mal die Antwort bzgl. Firewall Rule selber zu geben.
Durch das DHCP auf dem LAN Interface ist ja das Netz 10.38.10.2/32 und nicht /24. Demzufolge ist wohl "LAN net" ebenfalls nur /32, was erklären würde warum der zweite Hetzner Server mit der 10.38.10.3 die 10.38.10.2 nicht anpingen kann. Liege ich mit der Vermutung richtig @JeGr ?
Was mir aber noch nicht ganz schlüssig ist: Wenn ich die public IP vom zweiten Server wegnehmen würde, hätte dieser ja nur noch die 10.38.10.3 und als Gateway die 10.38.10.1 (Hetzner Gateway). Müsste ich da dem zweiten Hetzner Server nicht manuell den Gateway pfsense (10.38.10.2) eintragen? Dieses Konstrukt ist mir noch nicht ganz klar. -
@m0nji said in Kleine "private" Cloud mit pfSense als Firewall:
Ich versuche mir mal die Antwort bzgl. Firewall Rule selber zu geben.
Durch das DHCP auf dem LAN Interface ist ja das Netz 10.38.10.2/32 und nicht /24. Demzufolge ist wohl "LAN net" ebenfalls nur /32, was erklären würde warum der zweite Hetzner Server mit der 10.38.10.3 die 10.38.10.2 nicht anpingen kann. Liege ich mit der Vermutung richtig @JeGr ?Jup. Das "Netz" ist nur die einzelne IP wegen Routing durch die .1 damit die unterschiedlichen Standorte machbar sind.
Was mir aber noch nicht ganz schlüssig ist: Wenn ich die public IP vom zweiten Server wegnehmen würde, hätte dieser ja nur noch die 10.38.10.3 und als Gateway die 10.38.10.1 (Hetzner Gateway). Müsste ich da dem zweiten Hetzner Server nicht manuell den Gateway pfsense (10.38.10.2) eintragen? Dieses Konstrukt ist mir noch nicht ganz klar.
Inwiefern was eintragen? Soferns nicht schon gemacht ist/wurde, muss das interne Netz (10.38.10.2) natürlich auf das LAN GW (.1) eingetragen/geroutet werden. Das ist klar. Sonst kommen die Pakete ja nicht beim anderen Server an ohne übers GW zu gehen. :)
-
@jegr ich teste heute oder morgen Abend noch etwas und geb dann noch mal Feedback. Das Routing innerhalb des privaten Netzes klappt schon, dass ist nicht das Problem. Muss aber erstmal noch eine weitere virtuelle Server Instanz erstellen weil die jetzige zweite produktiv ist und er will ich nicht einfach die Public IP entziehen. Wie hast du diese überhaupt entzogen. Über die Cloud Console ist das ja scheinbar nicht möglich. Hast du einfach den Adapter auf der virtuellen Maschine deaktiviert?
-
Ok meine Tests waren soweit erfolgreich. Hatte jetzt zum Test noch eine zweite virtuelle Maschine installiert und habe auch noch mal das private Netz neu erstellt. Laut zweier Anleitungen sollte man das Netz gleich größer spannen /16 oder /8 und dann ein Subnetz erstellen mit den virtuellen Servern. Warum....hm das weiß wohl nur hetzner, denn in FAQ steht auch: "Im Moment ist die Funktion Subnets nicht sehr nützlich. Dies wird sich jedoch in Zukunft ändern, wenn wir weitere Funktionen hinzufügen." ;)
Anyways mein Ziel war es, den neuen virtuellen Server über die virtuelle pfSense ins Internet gehen zu lassen.- Netzwerk 10.38.0.0/16 angelegt und Subnet 10.38.10.0/24
- virtuelle pfSense und Test Maschine in das 10.38.10.0/24 Netz gepackt
- Route in Cloud Console erstellt 0.0.0.0/0 via 10.38.10.1 (pfSense)
- dhcp für die Public IP auf der virtuellen Test Maschine deaktiviert und default route hinzugefügt via 10.38.0.1 (Hetzner Gateway für das virtuelle Netzwerk)
- /etc/resolv.conf angepasst "nameserver=10.38.10.1"
- in pfSense Outbound NAT angelegt, DNS Resolver Access für das 10.38.10.0 Netz und Standard LAN to ANY Firewall Rule geändet von LAN Net auf Network 10.38.10.0, da LAN Net in diesem Fall nur bedeutet 10.38.10.1/32
Als nächstes würde ich dann mal einen VPN Tunnel zwischen der virtuellen pfSense und meiner pfSense daheim probieren. Da werde ich aber wohl noch 2 Wochen warten und es dann gleich mit wireguard testen.
Alles in allem ein klein wenig anderer Use Case als den du beschrieben hast Jens aber ich fand das Thema durchaus spannend und es ergeben sich dadurch gleich ein paar neue Anwendungsfälle :D
-
@m0nji Ist doch schön wenn es auch für was anderes gut ist :)
-
Hallo @m0nji, hallo @JeGr
ich verfolge gerade euren Ansatz für eine private cloud auf den Hetzner Cloud Servern mit pfsense.
Ich komme allerdings nicht weiter und wollte fragen, ob Ihr mir da ggf. in irgendeiner Form helfen könntet. Ich habe es nach den Schritten wie von euch beschrieben konfiguriert. Allerdings kommt der Client PC (Windows 10) nicht ins pfSense Netzwerk. Und in pfsense unter DHCP Releases wird dieser auch nicht angezeigt.
Der Windows Client erhält trotz Änderung des Standardgateways auf 10.38.0.1 (Hetzner Gateway für das vNetzwerk) und DNS Server 10.38.10.1 nach wie vor seine Public Hetzner IPv4 Adresse. Wenn ich DHCP auf dem Win 10 Client ausschalte und manuell in der Range 10.38.10.5 bspw vergebe, dann gibt es ebenfalls keinen Ping zwischen pfSense und Client.Das Ziel ist es, dass am Ende mehrere Clients nur noch über die pfSense ins Internet kommen und über die pfSense dann der Zugang via VPN Konfigurationen und Firewall Rules bereitgestellt wird.
Hier nochmal zur Übersicht mein bisheriger Aufbau
-
2 Hetzner Cloud Instanzen, davon 1 pfSense fertig eingerichtet für Zugriff von außen durch ge-whitelistete IP und 1 Windows 10 Instanz,
-
Netzwerk in Hetzner Cloud wie folgt (nach Vorlage von @m0nji)
10.38.0.0/16 Netz mit 10.38.0.0/24 Subnetz worin die beiden Instanzen pfSense (10.38.0.2) und Windows 10 (10.38.0.3) eingebunden sind, -
Route in Cloud Console erstellt 0.0.0.0/0 via 10.38.10.2 (pfSense)
-
DCHP für die Public IP auf dem Win10 Client ist noch aktiviert.
Das default gateway ist eingerichtet via 10.38.0.1 (Hetzner Gateway für das virtuelle Netzwerk), der DNS Server ist eingestellt als 10.38.10.1 (pfSense), -
in pfSense Outbound NAT angelegt, wie folgt:
-
DNS Resolver Access für das 10.38.10.0 Netz wie folgt:
-
Standard LAN to ANY Firewall Rule geändet von LAN Net auf Network 10.38.10.0, wie folgt:
Hätte jemand einen Ansatz der mir helfen würde?
-
-
@exuded
Naja ganz meine Vorlage hast du nicht genutzt ;)Ich versteh anhand deiner Beschreibung nicht ganz, warum deine pfsense Instanz 10.38.0.2, 10.38.10.1 und 10.38.10.2 hat?! Sie bekommt nur eine Adresse aus dem 10.38.10er Netz. Nicht zwei oder gar drei.
Du verbindest in der Cloud Console beide Instanzen mit dem 10er Netz, nicht mit dem 0er.
Die pfSense bekommt dadurch zusätzlich zur WAN IP auch noch eine LAN IP aus dem 10.38.10er Netz, dessen Gateway ebenfalls per DHCP gesetzt wird und die 10.38.0.1 (Hetzner Network Gateway) ist.Sieht in der pfSense dann so aus:
Dadurch, dass deine Instanzen immer auch eine Hetzner Public IP bekommen, musst du natürlich die default Route auf dem Client umbiegen und das Public IP Interface abschalten. So hatte ich das auch weiter oben geschrieben.
Outbound NAT ist i.O.
LAN to ANY Rule ist aber nicht korrekt. Du willst damit den LAN Clients (10.38.10.1-254) ermöglichen ins Internet zu kommen.
Daher muss die Rule lauten Source: 10.38.10.0/24 --> Destination: any. Warum nicht "LAN Net" verwenden anstatt des Subnets anzugeben, habe ich oben geschrieben: "Standard LAN to ANY Firewall Rule geändert von LAN Net auf Network 10.38.10.0, da LAN Net in diesem Fall nur bedeutet 10.38.10.1/32"@JeGr wie kann man eigentlich die Images verkleinern, so dass man drauf klickt und die Originalgröße erst dann sieht?! ;) Ich dächte das ging mal.
-
@m0nji Danke für deine ausführliche Erläuterung!
Ich habe meine Konfiguration entsprechend berichtigt.
Was ich jedoch noch nicht so ganz verstehe:
Wenn nun auch das LAN Interface in der pfSense auf DHCP läuft, wie kann ich dann Regeln für die Clients definieren? Im Heimnetz würde man ja eigentlich die Clients an die LAN Schnittstelle bringen, dort dann entsprechend von der Sense den DHCP Server laufen lassen und den Clients über das LAN Interface die Firewall Regeln vorschreiben. Nun ist das mit dem DHCP Server der Sense in der Hetzner Umgebung natürlich nicht gegeben, aufgrund der Hetzner Netzwerk-Struktur der Cloud Instanzen.Wenn ich nun jedoch dem Windows Client wie folgt das Gateway und den DNS Server vorgebe, dann kann dieser noch immer weder direkte IP Adressen noch domains singen bzw. erst garnicht auflösen.
EDIT: Ich habe das Problem gefunden. Ich vermutete ein Problem beim NAT Mapping und dem war auch so. Das Mapping war ausgegraut mit einem X davor. Als ich dann die Regel anwählte und nochmal auf "Hybrid Outbound NAT rule generation." stellte, ging es nach einem Klick auf save :) D.h. der Client ist nun online mit deaktiviertem public IP Interface unter dem Gateway 10.38.0.1
Nur bleibt die Frage nach der Regeldefinition in der pfSense. Bleibt es dann bei der "bekannten Logik", dass ich Firewall Regeln für das LAN Interface definiere, welche dann für alle Clients in dem Subnetz 10.38.10.0/24 gelten? :) -
wenn DNS nicht funktioniert, hast du vielleicht die Access List Einstellungen vergessen?!
Funktioniert eine Auflösung direkt über die pfSense unter Diagnostic --> DNS Lookup? -
@exuded said in Kleine "private" Cloud mit pfSense als Firewall:
Nur bleibt die Frage nach der Regeldefinition in der pfSense. Bleibt es dann bei der "bekannten Logik", dass ich Firewall Regeln für das LAN Interface definiere, welche dann für alle Clients in dem Subnetz 10.38.10.0/24 gelten? :)
Was möchtest du denn noch machen? Sobald die Clients das richtige Gateway nutzen, bleibt es natürlich dabei, dass die pfSense für die Regeln zuständig ist.
-
@m0nji
Der Anwendungsfall wäre:
Mehrere Clients hinter dem pfSense Gateway sollen mit verschiedenen OpenVPN Zugängen erreichbar gemacht werden. Jedoch nur auf bestimmten Ports. Zugleich soll der Nutzer mit einem OpenVPN Zugang für Client 1, nicht den Client 2 sehen können. -
Ja du kannst dann per Remote via OpenVPN zur pfsense connecten und über das OpenVPN Interface dann die Regeln setzen um in das LAN Netz zu springen (deine Clients). Ich mache das aktuell zwar nicht via OpenVPN sondern mit IPsec aber regeltechnisch das gleiche.
-
@m0nji Danke für den Hinweis :)
Gibt es dann in der Regelsetzung des OpenVPN Interfaces auch die Möglichkeit "OpenVPN Nutzer 1" nur auf Client 1 zuzulassen sowie "OpenVPN Nutzer 2" nur auf Client 2? Ein Sprung ins komplette LAN Netz wäre dann m.E. nicht so gut -
Kann Hetzner denn den Zugriff der Server untereinander blocken?
Denn sonst bringt die das nicht so viel.Dann verbindet sich halt Server A mit Server B direkt und richtet Unheil an.
-
Das stimmt. Sowas wäre natürlich unschön.
Ohne bei Hetzner nachgefragt zu haben gehe ich mal davon aus, dass Hetners Lösung dafür in den verschiedenen Subnetze besteht.
Nur kann ich in der pfSense weitere LAN Interfaces anlegen, sodass je Subnetz ein LAN Interface in der pfSense besteht? -
@exuded said in Kleine "private" Cloud mit pfSense als Firewall:
@m0nji Danke für den Hinweis :)
Gibt es dann in der Regelsetzung des OpenVPN Interfaces auch die Möglichkeit "OpenVPN Nutzer 1" nur auf Client 1 zuzulassen sowie "OpenVPN Nutzer 2" nur auf Client 2? Ein Sprung ins komplette LAN Netz wäre dann m.E. nicht so gutJein....so lange du bei OpenVPN ebenfalls auf DHCP setzt, wird das schwierig. Du müsstest sicherstellen, dass die Clients eben immer wieder die gleiche IP aus dem OpenVPN Netz bekommen. Ein kurzes googlen brachte das Ergebnis: https://wpcomputersolutions.com/pfsense-set-static-ip-specific-openvpn-client/
@nocling said in Kleine "private" Cloud mit pfSense als Firewall:
Kann Hetzner denn den Zugriff der Server untereinander blocken?
Denn sonst bringt die das nicht so viel.Dann verbindet sich halt Server A mit Server B direkt und richtet Unheil an.
Hetzner bietet zusätzlich eine Firewall an allerdings noch im Beta Status. Hier wird auch geschrieben, dass es noch nicht für die privaten Netze funktioniert: https://docs.hetzner.com/de/cloud/firewalls/faq/
Also ja, spätestens wenn du dich per RDP auf Client 1 verbunden hast, steht dir theoretisch der Weg zu Client 2 frei. Könnte man umgehen, wenn man die Subnetze kleiner macht und die Clients dann in unterschiedliche Subnetze packt.EDIT: man muss die Subnetze noch nicht mal kleiner machen. Man hat ja noch 253 weitere freie 24er Netz im 10.38.er Netz.
Wenn also Windows Client 1 im 10.38.20.0/24 ist und Windows Client 2 im 10.38.30.0/24 Netz ist, kannst du wiederum über die pfsense die Regeln setzen. Somit umgehst du auch gleich, dass du von den Windows Clients auch auf die pfSense kommst. 50 Clients möchte ich so aber nicht verwalten, da dies auch 50 zusätzliche Interfaces in der pfsense heißen würden. Aber das hat hier nichts mehr mit Hetzner zu tun. Innerhalb eines Subnetzes greift nie eine Firewall ein... -
@m0nji said in Kleine "private" Cloud mit pfSense als Firewall:
Könnte man umgehen, wenn man die Subnetze kleiner macht und die Clients dann in unterschiedliche Subnetze packt.
Wenn ich dann jeweils ein /32 Subnetz pro Client bei Hetzner anlegen würde, wie könnte ich dann jedes einzelne Subnetz als LAN Interface in die pfSense einbinden? Ich brauche maximal 4, wahrscheinlich aber nur 2 Clients bzw. 2 Subnetze mit jeweils 1 Client
-
@exuded
Noch mal zum Verständnis. Warum müssen die Windows Clients überhaupt voneinander isoliert werden? Der OpenVPN User hat doch sicher nur RDP Account für einen der 4 Server?