OPNsense Logo

Wer in AWS nach einer Lösung für Firewall, Web Application Firewall oder VPN sucht, wird schnell auf die jeweiligen managed Services, die per Knopfdruck aktiviert werden können stoßen. Manchmal sind diese Lösungen jedoch nicht flexibel oder schlicht kosteneffizient genug wenn es beispielsweise um Systeme geht, die nicht unbedingt hoch skalierbar und hochverfügbar sein müssen (wobei OPNsense auch HA kann). Abgesehen davon bin ich persönlich einfach kein Fan von proprietären Lösungen welche mich in der Konfiguration einschränken und vom Anbieter abhängig machen.

Da ich von der Arbeit her die OPNsense schon kannte, wenn auch nicht in AWS, dachte ich mir das wäre auch die perfekte Lösung für eines meiner Projekte in dem gerade die Kosteneffizienz und Flexibilität im Vordergrund standen.

Da ich selbst bei der Suche nach Tipps oder Anleitungen zur Inbetriebnahme der OPNsense in AWS nicht wirklich viel brauchbares finden konnte, wollte ich hier einmal meine persönliche Anleitung niederschreiben, mitsamt ein paar Erkenntnisse über Feinheiten die ich gerne früher gehabt hätte 😅.

Zu Anfang müssen wir natürlich erstmal die Firewall installieren, hierzu können wir einfach der folgenden Anleitung direkt aus der OPNsense Doc folgen: Installing OPNsense AWS image.

Nochmal das TL;DR für die, die das Prozedere zur Installation einer EC2 Instanz schon kennen:

  • Das OPNsense AMI abonnieren
  • Instanz konfigurieren
  • Im gewünschten Subnetz starten
  • root Login aus dem System Log auslesen

Damit endet die offizielle Anleitung auch schon. Ich zumindest hatte dann noch ein paar Fragezeichen im Kopf, nämlich:

  • Wie greife ich jetzt auf die Weboberfläche zu?
  • Wie muss ich zusätzliche Interfaces konfigurieren?
  • Wie leite ich eingehenden und ausgehenden Internet Traffic meines VPC durch die Firewall?

Das sind alles Fragen, die natürlich in der OPNsense Doc beantwortet werden, aber eben nicht für eine Cloud Umgebung wie AWS. Hier funktionieren verschiedene Dinge nämlich etwas anders. So können Interfaces beliebig ausgetauscht werden und verfügen nie über eine öffentliche IP Adresse am Interface, sondern bekommen immer eine IP Adresse die vom AWS Netzwerkinterface geNATed wird. Das bedeutet, das WAN Interface in der OPNsense kennt nur die im VPC Subnetz vergebene IP des Interfaces, nicht die öffentlich routbare. Deswegen sollte um eventuelle Probleme zu vermeiden die Checkbox Block private networks auf dem WAN Interface nicht gesetzt werden (Das schon mal als Tipp vorweg).

Wie greife ich jetzt auf die Weboberfläche zu?

Ich habe meine Instanz im Beispiel mit nur einem Interface gestartet, falls mehrere Interfaces konfiguriert sind lassen sich die Zuordnungen innerhalb der Firewall aber auch aus dem System Log auslesen. Da ich nur ein Interface angehängt habe wird dieses als WAN Interface eingerichtet.

>>> Invoking start script 'aws'
**********************************************************************************************************
*** set initial ec2-user password to : pxWsXjfg6AaLGUE3SABcpaVp4NAZfoA4uuWyArSm5lVWk7XcS2
*** !!! remember to change this immediately
*** openssh-key provided, set to ec2-user
*** set initial root password to : WbFpfYYeHGXeFW3JgDtgSsiiFMEd5ixJlZUNQAXSmcUH4KKFEv
*** remember to change this immediately
**********************************************************************************************************
>>> Invoking start script 'newwanip'
Reconfiguring IPv4 on xn0: OK
Reconfiguring routes: OK
>>> Invoking start script 'freebsd'
>>> Invoking start script 'syslog-ng'
Stopping syslog_ng.
Waiting for PIDS: 38322.
Starting syslog_ng.
>>> Invoking start script 'carp'
>>> Invoking start script 'cron'
Starting Cron: OK
>>> Invoking start script 'beep'
Root file system: /dev/gpt/rootfs
Sat Apr 23 15:10:40 UTC 2022

*** OPNsense.localdomain: OPNsense 21.7.7 (amd64/OpenSSL) ***

 WAN (xn0)       -> v4/DHCP4: 10.0.11.212/20

 HTTPS: SHA256 51 7C 57 2A 47 FD FD CB 52 05 46 C8 F1 78 F9 61
               FF 96 8B A1 0F F9 8E E4 3F D5 B4 5E AB 4D CA 13
 SSH:   SHA256 9AxRm2g3/vD2TC9h77V7DgTuBUmDA+9j/qENjzPHZlA (ECDSA)
 SSH:   SHA256 9UgfN3uJ8ZUpnazdzONTq0XowjTzUAQs/jldQpxSt9w (ED25519)
 SSH:   SHA256 bKtGwJ0c5WjKKbAPMF1dQsS76M1P/NC1QwBfkwqXl5w (RSA)

FreeBSD/amd64 (OPNsense.localdomain) (ttyu0)

login: 

Wie schon zuvor erwähnt bekommt das Interface eine private IP. Um jetzt auf die Weboberfläche zugreifen zu können müssen wir folgendes tun:

  • Der Instanz eine Security Group zuweisen und den eingehenden Port 443 freigeben
  • Dem WAN Interface der Instanz eine Elastic IP zuweisen
  • Über die Elastic IP auf die Weboberfläche zugreifen

Die Security Group stellt im Prinzip die Firewall vor der Firewall dar, kann also im Prinzip allen eingehenden und ausgehenden Traffic erlauben, da wir ja gerade selbst eine Firewall in Betrieb nehmen. Zusätzlich können natürlich auch Ports per Security Group geblockt werden, ich tendiere aber eher dazu alle Firewall Regeln in der OPNsense zu konfigurieren und die Security Group allen Traffic durchleiten zu lassen, da in der OPNsense feinere Regeln erstellt werden können.

Eingehende Regel der Security Group

Jetzt noch eine Elastic IP allozieren und dem WAN Interface zuordnen und wir können auf die Weboberfläche der Firewall zugreifen. Damit das funktioniert muss das WAN Interface der Instanz sich im public Subnetz (also dem mit Internet Gateway) des VPCs befinden. Für die Dauer der ersten Einrichtung empfiehlt es sich außerdem, vorübergehend den Zugriff per Security Group auf die eigene IP einzuschränken. Nach der Einrichtung sollte dann natürlich ein VPN benutzt werden um auf die Weboberfläche zuzugreifen.

Weboberfläche der Firewall

Da wir die Firewall frisch einrichten, sollte natürlich bevor es weiter geht auf die aktuelle Version der Firmware geupdatet werden.

Wie muss ich zusätzliche Interfaces konfigurieren?

Nachdem die Firewall auf dem neuesten Stand ist wollen wir auch noch ein LAN Interface hinzufügen, damit wir die Firewall auch als solche verwenden können. Dazu muss ein neues Netzwerkinterface in der AWS Konsole angelegt werden, das Interface sollte dann im gewünschten LAN Netz platziert und der EC2 Instanz zugeordnet werden. Die Firewall muss hierfür nicht neu gestartet werden. Das Interface sollte direkt nach der Zuordnung über die AWS Konsole in der OPNsense Weboberfläche auswählbar sein.

Zuordnung des LAN Interface

Danach kann das LAN Interface konfiguriert werden, folgende Einstellungen sind vorzunehmen:

  • Aktivieren des Interfaces
  • Block bogon networks aktivieren
  • IPv4 Konfiguration auf statisch setzen
  • IPv4 Subnetz eintragen

Im WAN Interface kann IPv6 Configuration Type auf None gesetzt werden sofern kein IPv6 verwendet wird, die IPv4 Konfiguration sollte jedoch auf DHCP gestellt bleiben, außerdem sollte die eingangs erwähnte Checkbox Block private networks deaktiviert werden.

Konfiguration des LAN Interface

Wie leite ich eingehenden und ausgehenden Traffic meines VPC durch die Firewall?

Nun haben wir also die Firewall eingerichtet und das LAN Netz konfiguriert, nachdem nun die ersten Firewall Regeln geschrieben und eventuelle andere Konfigurationen wie das Einrichten eines OpenVPN Servers abgeschlossen sind, soll nun nur noch durch die Firewall auf Systeme hinter der Firewall zugegriffen werden. Gleichzeitig sollen die Systeme selbst nicht mehr durch ein NAT Gateway, sondern ebenfalls durch die Firewall auf das Internet zugreifen. Hierdurch wird nicht nur der eingehende sondern auch der ausgehende Traffic überwacht, das ist besonders interessant wenn IDS/IPS aktiviert werden soll.

Damit die Firewall auch Traffic routen kann der nicht von ihr selbst kommt oder sie selbst als Ziel hat (also z.B. aller Traffic der von Systemen im LAN ins Internet geht), muss in allen Netzwerkinterfaces der Firewall in der AWS Konsole der Source/destination check deaktiviert werden.

Um jetzt den Internet Traffic der anderen EC2 Instanzen im VPC durch die Firewall zu leiten, müssen die Routing Tabellen des VPC über die AWS Konsole angepasst werden. Genauer müssen alle Routing Tabellen der privaten Netze die vorher eine Route nach 0.0.0.0/0 über das NAT Gateway hatten angepasst werden, damit der Traffic für 0.0.0.0/0 nicht mehr an das NAT Gateway, sondern an das LAN Interface der Firewall geleitet wird.

Somit wird aller Traffic der VPC Subnetze über AWS geroutet und der externe Traffic durch die Firewall geleitet.

Routing Tabelle für privates Subnetz

Damit das ganze richtig funktioniert müssen natürlich die Firewall Regeln entsprechend konfiguriert sein damit z.B. das LAN Interface eingehenden Traffic der Systeme hinter der Firewall erlaubt. Abschließend sei noch angemerkt, dass bei Port Forwarding Regeln die private IP Adresse des WAN Interfaces als Destination angegeben werden muss, da sich das Interface hinter dem NAT des AWS Netzwerks befindet.