de en

DIY Firewall

Posted on So 26 Mai 2019 in Computer & Electronics

Eigentlich brauche ich garkeine neue Firewall – die in der Fritzbox reicht für meine Zwecke völlig aus. Aber Mangel an Notwendigkeit hat mich noch nie von einem Projekt abgehalten! Und so gehen wir heute den Bau einer Eigenbau-Firewall an.

Im Grunde braucht es dazu nicht viel:

  1. Ein schlankes Betriebssystem, das auf "X" endet
  2. Ein kleiner, stromsparender Computer, auf dem selbiges läuft
  3. Zwei oder mehr Ethernet Ports
  4. Etwas Geduld und Spucke, um das Ganze zu konfigurieren

Ein OS muss her...

Bei Punkt 1 dachte ich zunächst an Debian LINUX – das ist mein Standard-LINUX. Bei der Recherche zum Thema bin ich dann aber auf pfSense und OPNsense gestoßen. Beides sind spezialisierte FreeBSD Distributionen für Firewall devices. Das hat mich neugierig gemacht! Erstens wollte ich schon immer mal mit BSD spielen und zweitens bringen beide ein Web-GUI mit, um die Firewall zu administrieren. Das hat mich überzeugt. Entschieden habe ich mich für OPNsense – weil es komplett open source ist und weil pfSense wohl neuerdings angefangen hat bestimmte Hardware-Anforderungen zu stellen, die ich für meine Zwecke nicht wichtig finde (AES-NI). Auch stößt man im Netz schnell auf Reste einer Schlammschlacht Kampange von einigen pfSense Protagonisten, die ich unprofessionell und eher abstoßend fand.

... und eine Maschine

Heute ist bei kleinen Serverchen oder Devices der Reflex, einen Raspberry Pi zu verwenden, aber das fand ich nicht ideal, denn es ist etwas Aufwand, dem Törtchen genug Ethernet mit brauchbarem Durchsatz zu verpassen und ich muss dann ein Gehäuse suchen und als Speichermedium brauche ich dann eine USB-Disk oder SD-Karte und überhaupt. Kurz: das isses nicht.

Versteht mich nicht falsch – ich finde den Raspberry Pi super und verwende ihn gern, aber eher dort, wo er seine Stärken voll auspielt: z.B. wenn es sehr klein sein soll und v.a. wenn GPIO gefragt ist. Aber wenn ich am Ende eh sowas wie einen Mini-PC im Gehäuse brauche, verliert der Pi an Attraktivität.

Als nächstes habe ich dann Ebay, Alibaba und Co nach Spezialhardware durchforstet. Da gibt es diverse hübsche Geräte mit mehreren Ethernet Ports, Metallgehäuse, teils sogar für 19" Racks etc. Der Spaß kostet dann aber auch irgendwo zwischen 300 und 1200€, je nach Ausstattung. Das ist mir klar zuviel für eine Bastelei. Für den Preis bekommt man auch eine kommerzielle Firewall von Zyxel oder so.

Letztlich bin ich dann auf die perfekte Lösung gestoßen: Ein ThinClient! Die Teile sind kompakt und stromsparend, haben ein vernünftiges Gehäuse und jede Menge Anschlüsse. Auch ist nicht zu verachten, dass das letztlich stinknormale PCs mit einem normalen BIOS etc. sind, was die OS-Installation erleichtert.

Nach etwas Ebay-Surfen habe ich mich für einen HP t610-plus entschieden. Meiner hat diese Ausstattung:

  • CPU: AMD T56N 1.65GHz 64bit, dual-core
  • 4GB RAM
  • 16GB Flash drive
  • 1x Displayport
  • 2x DVI-I
  • 2x USB 3.0
  • 4x USB 2.0
  • 2x RS232
  • 1x Parallel
  • 1x Gigabit-Ethernet (Broadcom)
  • 2x PS2 (keyboard, Mouse)
  • 1x PCI-Express Slot
  • Windows Embedded Standard 7

Schönes Teil und mehr als genug Wumms für eine Firewall. Aber wie sagt Dave Jones immer? "Don't turn it on – take it apart!" Und das machen wir jetzt! Das Gehäuse lässt sich problemlos ohne jedes Werkzeug öffnen und wir stoßen auf das Innere:

Ursprünglich war da eine PCI Grafikkarte verbaut – die brauche ich nicht und sie musste weichen, um den PCI Slot frei zu machen. Auf dem Motherboard gibt es viel zu sehen – z.B.:

  • 2 SATA Anschlüsse, einer davon mit dem 16GB Flash Drive belegt.
  • Ein unbelegter Mini-PCI Slot – z.B. für eine WLAN-Karte
  • Ein unbelegter ATA-Anschluss
  • Auf der Unterseite liegen zwei Slots für DDR3-SODIMMs.

So gefällt mir das! Das Maschinchen hat wirklich alles, was das Bastlerherz begehrt.

SSD Upgrade

16GB Flash sind nicht irre viel, reichen aber durchaus, um z.B. ein LINUX ohne viel Schnickschnack zu installieren. Die OPNsense Seite empfiehlt jedoch als "recommended specification":

  • 1.5 GHz multi core cpu
  • 4 GB RAM
  • 120 GB SSD

Die ersten beiden Punkte erfüllt meine Box schon und so habe ich noch eine 120GB SSD besorgt. Sowas kostet heute fast nichts mehr. Sie passt auch wie eine Eins, nur kann man sie nicht festschrauben. Im Netz fand ich verschiedene kreative Lösungen vom Nylonfaden über Kabelbinder und dicken Kartonstreifen bis hin zu Blechstreifen. Die beste war ein 3D-Modell für eine Halterung, aber die kann man nur mit Support drucken und ich dachte mir, das geht auch simpler und so habe ich meine eigene Halterung entworfen:

Nun sitzt die SSD sicher im Slot:

Mehr Netz!

Mit Tricks kann man eine Firewall auf einem Ethernet Port einrichten, aber schön ist das nicht. Eigentlich braucht eine Firewall mindestens zwei Ethernet Ports: Einen für das große böse Internet und einen für das kuschelige sichere Heim- oder Firmennetz. Noch besser ist es, viel mehr Ports zu haben. So kann man verschiedene Subnetze definieren und mit unterschiedlichen Sicherheitsstufen oder -Regeln ausstatten.

Der t610-plus hat ja, wie oben gesehen, einen PCIe Slot, also steht dem Einbau einer richtigen Netzwerkkarte nichts im Wege. Auf Ebay fand ich dann eine schöne Server-Netzwerkkarte mit 4 Ports (Intel PRO/1000VT quad Port Gigabit Ethernet PCIe-Karte), so dass wir dann letztlich 5 Ports bekommen – 1x WAN und 4x LAN. Sehr gut. Und so sieht das Prachtstück aus:

Der Einbau verlief problemlos und nun ist der ThinClient schon recht voll:

Wer einen ThinClient ohne PCIe Slot hat könnte alternativ einen USB-3 Ethernetadapter verwenden. Andere Geräte haben den Slot, aber man muss kreativ werden, weil es an Platz für die Karte fehlt – z.B. beim kleinen Bruder meines Geräts, dem t610 (ohne "plus").

Aber erstmal alles wieder schön zusammenbauen und so sieht die frischgebackene Firewall nun aus:

Mal umschauen

Bevor das Firewall-System drauf kommt wollte ich mich erstmal von innen umschauen und habe dazu testweise ein Debian installiert und mir damit angeschaut, was ich so alles über das System lerne. Erstmal die CPU unter die Lupe nehmen:

> lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                2
On-line CPU(s) list:   0,1
Thread(s) per core:    1
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             AuthenticAMD
CPU family:            20
Model:                 2
Model name:            AMD G-T56N Processor
Stepping:              0
CPU MHz:               825.000
CPU max MHz:           1650.0000
CPU min MHz:           825.0000
BogoMIPS:              3293.25
Virtualization:        AMD-V
L1d cache:             32K
L1i cache:             32K
L2 cache:              512K
NUMA node0 CPU(s):     0,1
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
                       cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx 
                       mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good 
                       nopl nonstop_tsc extd_apicid aperfmperf pni monitor ssse3 
                       cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm 
                       sse4a misalignsse 3dnowprefetch ibs skinit wdt hw_pstate 
                       vmmcall arat npt lbrv svm_lock nrip_save pausefilter

Wie versprochen: 1.65GHz dual core CPU. Das sollte reichen. Nur AES-NI Unterstützung wäre evtl. noch gut gewesen. Z.B. für VPN, aber für den Heimgebrauch sollte das egal sein. Die Konfiguration, die ich hier habe reicht laut OPNsense Homepage für kleine und mittlere Firmen aus.

Als nächstes schauen wir mal, was so an Geräten am PCI Bus zu finden ist:

> lspci
00:00.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 14h Processor Root Complex
00:01.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Wrestler [Radeon HD 6320]
00:01.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Wrestler HDMI Audio
00:04.0 PCI bridge: Advanced Micro Devices, Inc. [AMD] Family 14h Processor Root Port
00:11.0 SATA controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 SATA Controller [IDE mode] (rev 40)
00:12.0 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
00:12.2 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB EHCI Controller
00:14.0 SMBus: Advanced Micro Devices, Inc. [AMD/ATI] SBx00 SMBus Controller (rev 42)
00:14.2 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] SBx00 Azalia (Intel HDA) (rev 40)
00:14.3 ISA bridge: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 LPC host controller (rev 40)
00:14.4 PCI bridge: Advanced Micro Devices, Inc. [AMD/ATI] SBx00 PCI to PCI Bridge (rev 40)
00:15.0 PCI bridge: Advanced Micro Devices, Inc. [AMD/ATI] SB700/SB800/SB900 PCI to PCI bridge (PCIE port 0)
00:15.2 PCI bridge: Advanced Micro Devices, Inc. [AMD/ATI] SB900 PCI to PCI bridge (PCIE port 2)
00:15.3 PCI bridge: Advanced Micro Devices, Inc. [AMD/ATI] SB900 PCI to PCI bridge (PCIE port 3)
00:18.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 12h/14h Processor Function 0 (rev 43)
00:18.1 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 12h/14h Processor Function 1
00:18.2 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 12h/14h Processor Function 2
00:18.3 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 12h/14h Processor Function 3
00:18.4 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 12h/14h Processor Function 4
00:18.5 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 12h/14h Processor Function 6
00:18.6 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 12h/14h Processor Function 5
00:18.7 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 12h/14h Processor Function 7
01:00.0 PCI bridge: Integrated Device Technology, Inc. [IDT] PES12N3A PCI Express Switch (rev 0e)
02:02.0 PCI bridge: Integrated Device Technology, Inc. [IDT] PES12N3A PCI Express Switch (rev 0e)
02:04.0 PCI bridge: Integrated Device Technology, Inc. [IDT] PES12N3A PCI Express Switch (rev 0e)
03:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
03:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
04:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
04:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
07:00.0 Ethernet controller: Broadcom Limited NetLink BCM57781 Gigabit Ethernet PCIe (rev 10)
08:00.0 USB controller: Texas Instruments TUSB73x0 SuperSpeed USB 3.0 xHCI Host Controller (rev 02)

Wie erwartet finden wir insgesamt fünf Gigabit Ethernet Controller – einen von Broadcom (on-board) und vier von Intel auf der 4-Port NIC. Auch fehlen USB 2 und 3, sowie SATA und VGA nicht. Audio gibt's auch, nur ist das für eine Firewall wohl eher nicht so die zentrale Anwendung. Aber so ein Thinclient macht sich auch gut als Media Server.

Speeeeeed

Schließlich hat mich noch interessiert, wie schnell das gute Stück so rechnet. PassMark bescheinigt ihm 793 Punkte, was für so in kleines Maschinchen respektabel ist.

Selber habe ich auch noch den CPU-Test von Sysbench laufen lassen:

> sysbench --test=cpu  run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Doing CPU performance benchmark

Threads started!
Done.

Maximum prime number checked in CPU test: 10000

Test execution summary:
    total time:                          57.5743s
    total number of events:              10000
    total time taken by event execution: 57.5703
    per-request statistics:
         min:                                  5.74ms
         avg:                                  5.76ms
         max:                                  8.69ms
         approx.  95 percentile:               5.76ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   57.5703/0.00

Und auch den Speicher wollen wir mal quälen:

>  sysbench --test=memory  run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Doing memory operations speed test
Memory block size: 1K

Memory transfer size: 102400M

Memory operations type: write
Memory scope type: global
Threads started!
Done.

Operations performed: 104857600 (1015721.70 ops/sec)

102400.00 MB transferred (991.92 MB/sec)


Test execution summary:
    total time:                          103.2346s
    total number of events:              104857600
    total time taken by event execution: 84.2791
    per-request statistics:
         min:                                  0.00ms
         avg:                                  0.00ms
         max:                                  0.25ms
         approx.  95 percentile:               0.00ms

Threads fairness:
    events (avg/stddev):           104857600.0000/0.00
    execution time (avg/stddev):   84.2791/0.00

Alles natürlich nicht so schnell, wie aktuelle Rechner, aber für den Zweck super.

OPNsense

Zuguterletzt habe ich dann das aktuelle OPNsense Image heruntergeladen und auf einen USB-Stick kopiert:

sudo dd if=OPNsense-19.1.4-OpenSSL-vga-amd64.img of=/dev/sdc bs=4k

Stick in den ThinClient stecken, Strom an, Boot-Reihenfolge im BIOS bearbeiten und schon bootet der OPNsense Installer. Die basale Installation war sehr einfach – nicht komplizierter als eine LINUX Installation.

Die eigentlich Konfiguration erfolgt dann über das Web-Interface von OPNsense. Darüber schreibe ich dann mal einen eigenen Post.

Kosten

Und habe ich nun am Ende Geld gespart gegenüber der Spezial-Hardware? Auf jeden Fall! Alles zusammen hat keine 100€ gekostet:

  • 46,00€ HP t610-plus ThinClient, gebraucht
  • 23,45€ Intenso SSD, 120GB
  • 28,40€ Intel PRO/1000VT quad port Gigabit Ethernet PCIe-Karte

Also insgesamt 97,85€. Da kann man nicht meckern.

Für den Heimgebrauch hätte man auch auf die SSD verzichten können und statt der 4-Port Ethernetkarte eine mit zwei oder nur einem Port nehmen können – sowas ist für ≈18 bzw. ab 10 Euro zu haben.

Zum Vergleich fand ich es spannend, mal zu recherchieren, was eine aktuelle Fritzbox eigentlich an Hardware mitbringt. Das aktuelle Topmodell (7590) hat diese Specs:

  • AnyWAN GRX550 dual core CPU mit 1GHz
  • 2x USB 3.0
  • 512MB RAM
  • 512MB Flash
  • 4x GBit LAN
  • 1x Gbit WAN
  • WLAN
  • DECT
  • Fon, analog
  • ISDN
  • VDSL

D.h. die Fritzbox hat vergleichsweise wenig in Sachen RAM, Flash oder CPU zu bieten, dafür gibt es jede Menge Spezialhardware für Telfonie und DSL. Im Professionellen Umfeld nimmt man eher eine separate Telefonanlage und ein externes DSL-Modem, das dann die Firewall bzw. den Router bedient.

Aber wie Eingangs gesagt, ging es mir hier nicht um Notwendigkeit, sondern um das Projekt. Und so wird die Firewall hinter der Fritzbox ihren Dienst tun und die Fritz-Wall deaktiviert bzw. auf ein Minimum gestutzt.

Credits

Ich bin natürlich keineswegs der Erste, der sowas macht. Sucht mal nach "pfsense thinclient", "OPNsense Thinclient" oder so und Ihr findet jede Menge Blogs und Videos von Leuten, die das so, oder so ähnlich vor mir gemacht haben. Eine besonders wichtige Seite möchte ich aber unbedingt noch nennen: Die Thin Client Seite von David Parkinson (Repurposing ThinClients) ist eine unglaubliche Fundgrube für ThinClient Enthusiasten und ich kann sie Euch nur dringend ans Herz legen.