pfsense 2.3 PCengines APU 1D4

Mit der PCengines APU 1D4 gibt es ein zuverlässiges Stück Hardware für pfSense, welches durch geringe Betriebskosten und Zuverlässigkeit glänzt. Die Installation verläuft ohne große Herausforderungen über ein Nullmodemkabel, aber sollten bei der Konfiguration Kleinigkeiten beachtet werden um die Lebensdauer zu erhöhen.

Die PCengines APU 1D4 ist ein auf den AMD Embedded G-Series Prozessoren basierender, passiv gekühlter, kostengünstiger Singleboardcomputer mit drei GB-Netzwerkschnittstellen, welcher mit Coreboot (siehe auch Wikipedia) ein freie unter der GPL stehende Firmware besitzt. Die APU ist der direkte Nachfolger der bekannten Alix– und WRAPboards aus schweizer Herstellung. Einen Namen haben sich die Singleboardcomputer durch Ihre Benutzung als Firewall- und Routersystem mit der Software m0n0wall, pfSense oder auch IPfire gemacht. Auch eine Nutzung als reiner AP mit OpenWRT wäre möglich, erfordert aber hier ein wenig Feinarbeit.

Da ich nach dem Singleboardcomputer WRAP, den Nachfolger Alix übersprungen hatte, konnte ich mir kein Bild zu den neuesten Hardwareversionen machen. Ich hatte zwar schon einmal die APU 1D4 im Auge, sah aber in Ihr keinen Bedarf. pfSense läuft bei mir auf einem passiv gekühltem Atom D2550 mit 4GB RAM und 2 GB NICs. Da ich nun im Besitz einer PCengines APU 1D4 gekommen bin, wollte ich den Singelboardcomputer natürlich auf Probe einmal in mein Netzwerk als Firewall mit pfSense einsetzten.

Ich war gespannt darauf zu Wissen wie die APU skaliert und ob sie in etwa mit den gleichen Aufgaben wie die jetzig eingesetzte Hardware fertig wird. Das dies schon alleine vom Hardwaredesign gesehen nicht einfach sein würde, dürfte sich hier von selbst erklären. Abstriche sind definitiv zu machen, aber ich gehe auch nicht davon aus, dass alle Dienste mit pfSense auf der APU genutzt werden, welche ich auf meiner Lösung mit dem D2550 nutze.

Ich wollte die grundlegenden Erfahrungen weitergeben. Hier können zukünftige Benutzer einer APU 1D4 einen Nutzen von ihnen haben kann.

pfSense

Die auf FreeBSD basierende Distribution ist schon lange ein Teil meines Sicherheitskonzeptes. pfSense lief in der Version 1.2 noch auf einem Pentium 3 mit 512MB RAM. Seit nun circa 3 Jahren leistet die Firewalldistribution Ihren Dienst auf einem D2550 mit 4GB RAM und 160GB HD. Mit einer festen IP, Squid incl clamd, SquidGuard, Snort, OpenVPN und weiteren Diensten ist die Hardware nicht wirklich ausgelastet. Die Hardware reicht aus um ein HomeOffice per Site-to-Site  bzw auch gleichzeitig ein Client-to-Site VPN zu verbinden und mein internes Netzwerk zu schützen. Das System besitzt noch ausreichend Reserven um weitere Benutzern und Diensten verarbeiten zu können. Im Moment wird es von 4 Usern parallel genutzt.

! Ich biete hier keine komplette Konfiguration der Firewall an, sondern nur die grundlegende Installation auf der PCengines APU 1D4 an. !

Technische Daten der PCengines APU 1D4

pfsense 2.3 PCengines APU 1CD4
Kleiner Rechner ganz groß. PCengines APU1D4 mit einer Kingston SSD
  • Prozessor: 1,0 GHz AMD Embedded G-Series T40E APU (Dual-Core, 64 Bit Unterstützung, 32 + 32 KByte L1 Cache, 2 x 512 KByte L2 Cache, SSE1,2,3, SSSE3 ISA, SSE4A, MMX, AMD-V)
  • 4 GByte DDR3-1066 DRAM Speicher (nicht erweiterbar)
  • 1 x SD-Anschluß (bootfähig; über USB angebunden)
  • 1 x SATA 6 GBit/s Anschluß
  • 1 x mSATA 6 GBit/s Anschluß
  • 3 x 10/100/1000 MBit/s (Realtek RTL8111E) Netzwerkschnittstellen
  • 1 x 9-polige serielle Schnittstelle (Konsolenanschluß)
  • 2 x USB 2.0 Ports
  • 2 x Mini PCIe Slots (z.B. für Wireless LAN, GSM/UMTS/LTE Module)
  • 1 x SIM Socket für GSM/UMTS Module
  • RTC Batterie, GPIO-Pins, LPC-Pins, COM2-Port (3,3V RxD/TxD), Onboard USB Stecker
  • 3 LEDs und 1 Pushbutton-Schalter auf der Vorderseite (frei programmierbar)
  • CoreBoot Open Source System BIOS mit Unterstützung für iPXE und USB Boot
  • Spannungsversorgung: +12V Gleichstrom über Hohlstecker (außen: 5,5mm, innen: 2,5mm, Pluspol auf der Innenseite)
  • Leistungsaufnahme: ca. 6-12W (ohne Erweiterungskarten)
  • Abmessungen: 152,4 x 152,4 mm

Technische Information CPU AMD PDF und CPU-World

Genutzte Hardware

  • PCengines APU1D4
  • Kingston SMS200S3/60G interne-SSD 60GB
  • Digitus USB auf Seriell DB9 Adapter
  • ASSMANN Null-Modem Kabel D-Sub9 Bu/Bu 3m
  • Thinkpad T420s mit Debian Jessie

 

Update des BIOS

Der Debianweg

Wer nicht mit sudo arbeiten möchte, muss den genutzen Useraccount unter Debian der Gruppe dialout hinzufügen.

sudo adduser $USERNAME dialout

Vorbereitung des Biosupdates, bitte das Device überprüfen, bei mir ist der USB-Stick das Laufwerk sdc :

root@triton:/home/cmg# apt-get install syslinux
root@triton:/home/cmg# dd if=/usr/lib/SYSLINUX/mbr.bin of=/dev/sdc
0+1 Datensätze ein
0+1 Datensätze aus
440 Bytes (440 B) kopiert, 0,00479074 s, 91,8 kB/s
root@triton:/home/cmg# syslinux --install /dev/sdc1

Die URL für die Datei api_tinycore.tar.bz2 ist unter http://www.pcengines.ch/tinycore.htm zu finden.

root@triton:/home/cmg# wget http://www.pcengines.ch/file/apu_tinycore.tar.bz2
# Das letzte ROM befindet sich immer in dem tinycorepaket <<<-----
root@triton:~# mount /dev/sdc1 /mnt/
root@triton:~# tar xjf apu_tinycore.tar.bz2 -C /mnt/
root@triton:~# ls /mnt/
apu140908.rom autostart.sh core.gz ldlinux.c32 ldlinux.sys syslinux.cfg takemehome.txt vmlinuz
root@triton:~# sync && umount /mnt

Der USB Stick wird in die nicht mit dem Netzstecker verbundenen APU gesteckt und per screen /dev/ttyUSB0 115200 bzw sudo screen /dev/ttyUSB0 115200 auf die Verbindung mit der APU gewartet, welche nun per Einstecken des Netzsteckers gestartet wird. Nach einem kurzen Bootvorgang befindet man sich im Tinycorelinux.

Achtung, als Beispielfunktion wird das ROM apu140405 angegeben, aktuell ist das ROM apu140908, welches sich auch schon auf den USB Stick befindet, siehe die Ausgabe des Listbefehls, ls:

Welcome to TinyCore running on APU
To update the BIOS type "flashrom -w apu140405.rom" <<<--- Falsche Angabe des ROMs
[+44.0 C][root@box:/mnt/sda1]$ ls
### Bitte den Namen des ROMs beachten und den richtigen Namen eingeben
apu140908.rom core.gz ldlinux.sys takemehome.txt
autostart.sh ldlinux.c32 syslinux.cfg vmlinuz
[+44.0 C][root@box:/mnt/sda1]$ flashrom -w apu140908.rom
Using default programmer "internal".
Calibrating delay loop... OK.
coreboot table found at 0xdffdf000.
Found chipset "AMD SB7x0/SB8x0/SB9x0". Enabling flash write... OK.
Found Macronix flash chip "MX25L1605A/MX25L1606E" (2048 kB, SPI) at physical address 0xffe00000.
Reading old flash chip contents... done.
Erasing and writing flash chip... ^Erase/write done
[+47.6 C][root@box:/mnt/sda1]$ reboot

 

Installation pfSense

Herunterladen des Images AMD64 für die serielle Installation . Dies ist Image für AMD 64Bit , Memstick Image with Installer, Serial und mittlerweile die Version 2.3.1 mit dem Dateinamen : pfSense-memstick-serial-2.3.1-RELEASE-amd64.img.gz . Ich verwende hier noch die bei dem Schreiben des Artikels aktuelle Version 2.2.6. Der Dateiname sollte entsprechend geändert werden.

Für die Überprüfung der Checksumme habe ich auch die Datei https://files.pfsense.org/hashes/pfSense-memstick-serial-2.2.6-RELEASE-amd64.img.gz.sha256 heruntergeladen.

sha256sum pfSense-memstick-serial-2.2.6-RELEASE-amd64.img.gz
 2ed39c71720968b8580145bd068f951583619bf413eb9b5816be7fde7bdf98fa  pfSense-memstick-serial-2.2.6-RELEASE-amd64.img.gz

cmg@triton:~/Downloads/pfSense$ gunzip pfSense-memstick-serial-2.2.6-RELEASE-amd64.img.gz
cmg@triton:~/Downloads/pfSense$ sudo dd if=./pfSense-memstick-serial-2.2.6-RELEASE-amd64.img of=/dev/sdc bs=16K

APU mit eingesteckten USB-Stick starten und Konsole öffnen

sudo screen -c /usr/share/doc/screen/examples/screenrc /dev/ttyUSB0 115200
Ab hier erfolgt nun die Ausgabe der APU 1D4 über das Nullmodemkabel


[59322.743121] scsi6 : usb-storage 3-1.2:1.0
 [59322.743255] usbcore: registered new interface driver usb-storage
 cmg@triton:~/Downloads/pfSense$ exit
 PC Engines APU BIOS build date: Sep  8 2014
 Total memory 4096 MB
 AMD G-T40E Processor
 CPU MHz=1000
 Press F10 key now for boot menu:

F10 drücken und dort den USBstick auswählen

Wenn pfSense geladen ist und die Auswahl es erfordert, I für den Installer drücken.
Automatische Installation für eine Erstinstallation wählen.

Kernel ist < Embedded kernel (no VGA console, keyboard > zu wählen.

Die Reihenfolge der Netzwerkkarten auf der APU 1D4

Ausgehend von dem seriellen Anschluß in Richtung zu den Anschlüssen für USB sind die Netzwerkkarten wie folgt angeordnet:

Seriell <–> re0 <–> re1 <–> re2 <–> USB

VLANs > Nein.

Meine Wahl

 Enter the WAN interface name or 'a' for auto-detection
 (re0 re1 re2 or a): re0

Enter the LAN interface name or 'a' for auto-detection
 NOTE: this enables full Firewalling/NAT mode.
 (re1 re2 a or nothing if finished): re2

Enter the Optional 1 interface name or 'a' for auto-detection
 (re1 a or nothing if finished): re1

re1 ist bei mir die DMZ.

The interfaces will be assigned as follows:

WAN  -> re0
 LAN  -> re2
 OPT1 -> re1

Do you want to proceed [y|n]? y

Writing configuration...done.
 Updating configuration...done.
 Cleaning backup cache...done.
 Setting up extended sysctls...done.
 Setting timezone...done.
 Configuring loopback interface...done.
 Starting syslog...done.
 Starting Secure Shell Services...done.
 Setting up polling defaults...done.
 Setting up interfaces microcode...done.
 Configuring loopback interface...done.
 Creating wireless clone interfaces...done.
 Configuring LAGG interfaces...done.
 Configuring VLAN interfaces...done.
 Configuring QinQ interfaces...done.
 Configuring WAN interface...done.
 Configuring LAN interface...Starting DNS Resolver...done.
 Starting DHCPv6 service...done.
 done.
 Configuring CARP settings...done.
 Syncing OpenVPN settings...done.
 Configuring firewall......done.
 Starting PFLOG...done.
 Setting up gateway monitors...done.
 Synchronizing user settings...done.
 Starting webConfigurator...done.
 Configuring CRON...done.
 Starting DNS Resolver...done.
 Starting NTP time client...done.
 Starting DHCP service...done.
 Starting DHCPv6 service...done.
 Configuring firewall......done.
 Generating RRD graphs...done.
 Starting syslog...done.
 Starting CRON... done.
 pfSense (pfSense) 2.2.6-RELEASE amd64 Tue Dec 22 16:37:36 CST 2015
 Bootup complete

FreeBSD/amd64 (pfSense.localdomain) (ttyu0)

*** Welcome to pfSense 2.2.6-RELEASE-pfSense (amd64) on pfSense ***

 WAN (wan)       -> re0        ->
 LAN (lan)       -> re2        -> v4: 192.168.1.1/24
 OPT1 (opt1)     -> re1        ->
 0) Logout (SSH only)                  9) pfTop
 1) Assign Interfaces                 10) Filter Logs
 2) Set interface(s) IP address       11) Restart webConfigurator
 3) Reset webConfigurator password    12) pfSense Developer Shell
 4) Reset to factory defaults         13) Upgrade from console
 5) Reboot system                     14) Enable Secure Shell (sshd)
 6) Halt system                       15) Restore recent configuration
 7) Ping host                         16) Restart PHP-FPM
 8) Shell

Nun kann per stationären Rechner / Laptop das System konfiguriert werden.

Einstellungen

Temperatur

Eingestellt werden muss unbedingt noch die Temperaturanzeige für den AMD  T40E, da sonst die Temperatur des Systems nicht in der Webübersicht unter System Information angezeigt wird. Hier werden die Temperatur für die Warnung und das Herunterfahren im Notfall eingestellt:
System: Advanced: Miscellaneous > Cryptographic & Thermal Hardware > AMD K8, K10 and K11 CPU on-die thermal sensor (amdtemp)

Temperaturen um die 50-70°C sind Normal, das System ist auf bis zu 90°C ausgelegt.

System: Advanced: Miscellaneous > Power Savings > PowerD aktivieren mit allen drei Punkten Hiadaptive

Die Temperatur für das automatische Herunterfahren bei Überhitzung muss über das Widget Thermal Sensors eingestellt werden:

Core Ciritical sollte nicht geändert werden. Mit dem Rest der Einstellungen kann man spielen
Core Ciritical sollte nicht geändert werden. Mit dem Rest der Einstellungen kann man spielen

SSHd

Nun noch SSH via Webgui starten: System: Advanced: Admin Access > Secure Shell Enable

SSD Trim

Um den Trimbefehl für die mSATA SSD einzuschalten ist ein wenig Handarbeit noch nötig. Die von mir verwendeten Kingston SSDNow mS200 mSATA SSD (PDF) unterstützt diesen Befehl.

Via SSH auf die Kommandzeilen einloggen, eine Übersicht der Parameter einholen:

root: tunefs -p /
 tunefs: POSIX.1e ACLs: (-a)                                disabled
 tunefs: NFSv4 ACLs: (-N)                                   disabled
 tunefs: MAC multilabel: (-l)                               disabled
 tunefs: soft updates: (-n)                                 enabled
 tunefs: soft update journaling: (-j)                       enabled
 tunefs: gjournal: (-J)                                     disabled
 tunefs: trim: (-t)                                         disabled
 tunefs: maximum blocks per file in a cylinder group: (-e)  4096
 tunefs: average file size: (-f)                            16384
 tunefs: average number of files in a directory: (-s)       64
 tunefs: minimum percentage of free space: (-m)             8%
 tunefs: space to hold for metadata blocks: (-k)            6408
 tunefs: optimization preference: (-o)                      time
 tunefs: volume label: (-L)

Zuerst müssen die fstablabel zu ufslabel konvertiert, das Kernelmodul ahci.ko automatisch immer bei dem Booten geladen und dann im Singleusermode der Trimbefehl aktiviert werden. Das konvertieren der fstablabel zu ufslabel ist seit pfSense 2.3.1 eigentlich nicht mehr notwendig, soll aber der Vollständigkeit halber hier nicht vernachlässigt werden.

root: /usr/local/sbin/ufslabels.sh
 Nothing to do, all filesystems and swap already use some form of device-independent labels

root: vi /boot/loader.conf.local
 ahci_load="YES" hinzufügen

cat /etc/fstab |grep ufsid
 /dev/ufsid/57039fdc63facb04 / ufs rw 1 1

pfSense wie bei der Installation via serielle Schnittstelle starten, aber im von pfSense angebotenen Startmenü die Firewall im Singleusermode neu starten.

Timecounter "TSC" frequency 1000022184 Hz quality 800
 Trying to mount root from ufs:/dev/ufsid/57039fdc63facb04 [rw]...
 Enter full pathname of shell or RETURN for /bin/sh:

Enter drücken und   /sbin/tunefs -t enable /dev/ufsid/57039fdc63facb04 eingeben. Wobei 56cec8a00a8c16c6 durch die eigene ID zu ersetzten ist
 # /sbin/tunefs -t enable /dev/ufsid/57039fdc63facb04
 tunefs: issue TRIM to the disk set
 #/sbin/reboot

Neustarten der firewall und per SSH via tunefs -p / überprüfen ob der Trimbefehl aktiviert ist.

/root: tunefs -p /
tunefs: POSIX.1e ACLs: (-a)                                disabled
tunefs: NFSv4 ACLs: (-N)                                   disabled
tunefs: MAC multilabel: (-l)                               disabled
tunefs: soft updates: (-n)                                 enabled
tunefs: soft update journaling: (-j)                       enabled
tunefs: gjournal: (-J)                                     disabled
tunefs: trim: (-t)                                         enabled
tunefs: maximum blocks per file in a cylinder group: (-e)  4096
tunefs: average file size: (-f)                            16384
tunefs: average number of files in a directory: (-s)       64
tunefs: minimum percentage of free space: (-m)             8%
tunefs: space to hold for metadata blocks: (-k)            6408
tunefs: optimization preference: (-o)                      time
tunefs: volume label: (-L)

 

Lokale Konfiguration der pfSense, Performance

Bei mir läuft nun seit einem Monat die PCengines APU 1D4 mit den Diensten OpenVPN, Squid, SquidGuard, DHCPd, unbound inkl DNSSEC, NTPd, und sshd. Die APU war bis jetzt performant genug unsere Leitung genau so zu bedienen wie es der Rechner mit dem Atomprozessor tat. Snort wurde hier nicht genutzt und auch die Konfiguration von Squid habe ich zugunsten der Haltbarkeit der SSD ein wenig abgeändert.

Für Squid habe ich mich entschieden den Local Cache für die Harddisk auf Null (null – does not use any storage. Ideal for Embedded/NanoBSD) zu setzen und die Squid Memory Cache Settings für das RAM auf 512MB mit einer Maximum Object Size von 256kb zu setzen. Als Memory Replacement Policy diente hier Heap GDSF ( Optimizes object-hit rate by keeping smaller, popular objects in cache). Sonst ist er als transparenter Proxy für das lokale, sowie das VPN gesetzt. Letzteres sichert das surfen als Roadwarrior ab.

SquidGuard selbst hat als Blacklist Shallalist und adv als Regelwerk gesetzt. Hier werde ich noch selbst Hand anlegen, da die mobile devices besser aus einer anderen Quelle gefüttert werden sollten. Hier taucht immer noch Werbung in der Verbindung auf, wenn man als Roadwarrior Squid via OpenVPN nutzt.

Für das SSL-Zertifikat wurde Let’s encrypt gewählt, siehe dazu den Artikel Let’s encrypt in pfsense in diesem Blog.

Ich habe einige Synchronisationen im Hintergrund während meinem Aufenthaltes in Frankreich laufen lassen, sowie das VPN sehr stark via Orange genutzt. Ich war selbst erstaunt wie performant doch die kleine Kiste ist und vorerst einmal meinen Atom in eine Pause geschickt. Der Moment der Wahrheit kommt, sobald der Sommer Einzug gehalten hat, denn dann kann es in der Wohnung schon einmal zu 40°C kommen und ich bin gespannt wie die passiv gekühlte APU darauf reagiert. Ich habe sie schon einmal der Vorsicht halber auf vier Legosteine gestellt.

Meine Leitung ist noch eine 200/20 mit festen IPs .

 

Apropos WLAN Accesspoint / Router und Captive Portal

WLAN wurde von meiner Seite aus nicht implementiert.

Ein wirklich sehr gute Karte für einen Accesspoint/WLANrouter mit pfSense wäre die Compex WLE600VX mit dem Chipset Qualcomm-Atheros QCA9882. Diese wird laut Supported Chipsets unter FreeBSD noch nicht unterstützt. Siehe hierzu auch den Stand vom 24.1.2016.
Falls hier eine Änderung eintritt freue ich mich auf ein Kommentar, es kann ja passieren, dass es aus meinem Radar fällt.

Eine funktionsfähige Karte wäre die Compex WLE200NX Atheros AR9280 Minipci-E 802.11A/B/G/N 300Mbps 2×2 Mimo Dualband, welche für ungefähr 25€ – 30€ zu haben wäre. Hier sollten die Antennen selbst und die Pigtails-Verbindungskabel nicht vergessen werden.

Nein, ich habe keinerlei Verbindung zu dem Onlineshop und die Links stehen nur Beispielhaft. Werbung wird bei mir markiert und ich nutze kein Affiliate. Ich lebe nur von Luft, Familie, Liebe und Projekten, sowie den Donatebuttons im Footer ;)