BananaPi Dualstack WiFi Access Point IPv6 über VPN

Ich bin wohl wahrscheinlich der erste in den großen weiten des Internets, der an seinem Pi einen IPv6 Hotspot aufgesetzt hat.

Heimnetzwerk. Was tun mit den DAUs? In Quarantäne stecken geht schlecht, und wer schult schon seine DAUs privat? Oder es kommt mal Besuch, dem man natürlich den Zugang auf’s heimische WLAN nicht vorenthalten möchte.

Egal ob Spyware-Windows 10, Botnetz-Teilnehmer, infiziert, dumm, wissentlich oder unwissentlich: In Deutschland sollten Privatleute generell keinen Internetzugang haben. Keine IP. Stichwort Störerhaftung, Abmahnindustrie, Vorratsdatenspeicherung, offene WLANs, DNS-Hijacking der Telekom …

DAUs, die dümmsten anzunehmenden Benutzer, dürfen, was technische Belange angeht, dumm sein. Es sind ja schließlich nur User. Nun kann man seine User schulen, sensibilisieren für sichere Internetnutzung, das am Besten wöchtentlich; oder aber man holt sich ein Abo bei einem der zahlreichen anonymisierenden VPN Anbieter und routet allen Traffic schön außer Land.

Ich habe mich für letztere Lösung entschieden.

So gibt es bei mir daheim nun zwei Router, zwei WLAN-APs: Den Telekom Speedport Plastikrouter, mit seinem DualStack und ULA (IPv6) ein annehmbares Gerät. Zur Rechten sitzt der Bananapi, am Telekom Router angeschlossen. Dieser teilt eine Open-VPN Clientverbindung über einen Wifi-Dongle.

Dieser zentrale Ansatz macht die Verwaltung und Absicherung besonders einfach: Möchte ich “anonym” surfen, wechsle ich einfach den WLAN-AP zum Gäste-Wlan. So sind auch die Androiden einwandfrei abgesichert. Links das normale WLAN, rechts das Gäste-WLAN. Auf den Clients muss nichts geändert werden, diese verbinden sich lediglich mit dem Gäste-WLAN-Access-Point.

Hardware

Zur Hardware: Ein EDIMAX EW7811Un WLAN-Stick, kosten ca. 10€, BananaPi mit 1 GB Ram, kosten ca 30-40€ (LEGACY, besser einen RaspberryPi 3 kaufen, dieser hat integriertes WiFi, ob es geht, IDK).

root@bananapi ~ # cat /proc/cpuinfo | egrep -i "(hardware|name)" | uniq
model name	: ARMv7 Processor rev 4 (v7l)
Hardware	: Allwinner sun7i (A20) Family

Eine ARMer Prozessor, dafür im Stromverbrauch unschlagbar, man könnte das Board sogar über USB direkt am Speedport Router anschließen.

root@bananapi ~ # sysbench --test=cpu --cpu-max-prime=10000 --num-threads=$(nproc) run 
sysbench 0.4.12:  multi-threaded system evaluation benchmark

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

Doing CPU performance benchmark

Threads started!
Done.

Maximum prime number checked in CPU test: 10000


Test execution summary:
    total time:                          146.0286s
    total number of events:              10000
    total time taken by event execution: 292.0164
    per-request statistics:
         min:                                 29.01ms
         avg:                                 29.20ms
         max:                                 59.10ms
         approx.  95 percentile:              29.65ms

Threads fairness:
    events (avg/stddev):           5000.0000/15.00
    execution time (avg/stddev):   146.0082/0.01

Es sind ca. 10 Mbit/s drin. Stromverbrauch ist alles, 20 Watt Dauerbetrieb würden schon mit mehr als 50€ jährlich zu Buche schlagen. Wer von der 100 Mbit/s Verbindung mehr möchte, der bekommt Linux installiert. 😘 OpenVPN-Client läuft, wenn ich es richtig beobachtet habe, single-threaded. Fehlende AES-NI Unterstützung macht es auch nicht wirklich besser:

root@bananapi ~ # cryptsetup benchmark                                                     :(
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1        84020 iterations per second
PBKDF2-sha256      58514 iterations per second
PBKDF2-sha512      27080 iterations per second
PBKDF2-ripemd160   79921 iterations per second
PBKDF2-whirlpool    6566 iterations per second
#  Algorithm | Key |  Encryption |  Decryption
     aes-cbc   128b    25.8 MiB/s    26.3 MiB/s
 serpent-cbc   128b    11.4 MiB/s    12.8 MiB/s
 twofish-cbc   128b    18.0 MiB/s    20.3 MiB/s
     aes-cbc   256b    26.0 MiB/s    26.1 MiB/s
 serpent-cbc   256b    11.6 MiB/s    12.8 MiB/s
 twofish-cbc   256b    18.5 MiB/s    20.4 MiB/s
     aes-xts   256b    16.3 MiB/s    16.3 MiB/s
 serpent-xts   256b    12.0 MiB/s    12.6 MiB/s
 twofish-xts   256b    19.3 MiB/s    19.7 MiB/s
     aes-xts   512b    12.7 MiB/s    12.6 MiB/s
 serpent-xts   512b    11.9 MiB/s    12.5 MiB/s
 twofish-xts   512b    19.5 MiB/s    19.7 MiB/s

Der EDIMAX hat einen Chip von Realtek:

Bus 001 Device 002: ID 7392:7811 Edimax Technology Co., Ltd EW-7811Un 802.11n Wireless Adapter [Realtek RTL8188CUS]

Ein sehr guter Stick, funktioniert alles Plug & Pluy, im Clientmodus, auch mit 3.x Kernel. Für AP Modus braucht man den 4er Kernel, (s.u.)

Software

Linux 4.4.34-bananian #2 SMP Fri Nov 25 14:31:28 UTC 2016 armv7l GNU/Linux
ip6tables v1.4.21
hostapd v2.4

hostapd aus Debian Stretch, Rest Jessie.

Der 4er Kernel und aktuelle hostapd sind extrem wichtig. Im 3er gab’s beispielsweise noch keine eigenen Module für den Chip, man musste eine gepatchte hostapd Version nehmen …

root@bananapi ~ # lsmod | grep rtl
rtl8192cu              57996  0 
rtl_usb                 8646  1 rtl8192cu
rtl8192c_common        33913  1 rtl8192cu
rtlwifi                49398  3 rtl_usb,rtl8192c_common,rtl8192cu
mac80211              493333  3 rtl_usb,rtlwifi,rtl8192cu
cfg80211              400967  2 mac80211,rtlwifi

Access Point Konfiguration

Ich mache nichts mehr mit Routingtabellen, beim letzten Mal gab es mit Dante immer mal wieder “Connection Reset” auf Webseiten, es hatte noch nicht zu 100% richtig funktioniert. OpenVPN selektiv #4: IPv6 Ergo läuft der BananaPi als dedizierter OpenVPN-Server sozusagen.

allow-hotplug wlan0  
iface wlan0 inet static  
    address 192.168.10.1
    netmask 255.255.255.0
    network 192.168.10.0
    broadcast 192.168.10.255

Static wlan0 Interface IPv4 setzen. IPv6 kommt später per Script hinzu.

dnsmasq Konfig, was nachher DHCPv4 macht:

root@bananapi ~ # cat /etc/dnsmasq.conf
interface=wlan0      # Use interface wlan0  
listen-address=192.168.10.1 # Explicitly specify the address to listen on  
bind-interfaces      # Bind to the interface to make sure we aren't sending things elsewhere  
server=8.8.8.8       # Forward DNS requests to Google DNS  
domain-needed        # Don't forward short names  
bogus-priv           # Never forward addresses in the non-routed address spaces.  
dhcp-range=192.168.10.2,192.168.10.99,48h # assign ip addresses between range, lease time 

Für die dynamische, automatische IPv6 Addressvergabe ist der Router Advertisement Daemon, kurz radvd zuständig:

Eine Unique-Local-Addresse nach RFC 4193 kann man sich hier generieren: Unique Local IPv6 Generator bspw.: fdf0:4454:37fe::/48

WICHTIG: 1 IPv6 /64 = 1 IPv4 Addresse.

Man darf ein /64 nicht weiter aufsplitten (RFC 5375), andernfalls geht SLAAC (Stateless Autoconfiguration) / radvd / DHCPv6 / ND Neighbour Discovery / uvm. nicht mehr.

root@bananapi ~ # cat /etc/radvd.conf
interface wlan0
{
 AdvSendAdvert on;
 AdvManagedFlag off;
 AdvOtherConfigFlag off;

prefix fdf0:4454:37fe::/64
{
		AdvOnLink on;
		AdvAutonomous on;
		AdvRouterAddr off;
};

};

Die Hostapd Konfig:

root@bananapi ~ # cat /etc/hostapd/hostapd.conf
#change wlan0 to your wireless device
interface=wlan0
driver=nl80211
ssid=AP_NAME_HERE
channel=1

# WPA SETTINGS
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

# CHANGE THE PASSPHRASE
wpa_passphrase=YOUR_PASSWORD_HERE

IPTables Script & IPv6

#!/bin/bash
set -x

echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

# ONLY VERY BASIC RULES TO MAKE IT WORK !! NO SECURITY !!

iptables -A FORWARD -i wlan0 -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

ip6tables -A FORWARD -i wlan0 -o tun0 -j ACCEPT
ip6tables -A FORWARD -i tun0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

ip -6 addr add fdf0:4454:37fe::1/64 dev wlan0
ip -6 route add fdf0:4454:37fe::/64 dev wlan0

service radvd restart

OMG! IPv6 mit NAT. Das sollte man eigentlich nicht mehr tun. Geht auch erst ab Kernel 3.7+. Vom VPN bekomme ich ein privates /64 auf tun0 zugewiesen, das kann ich nicht mehr kleiner splitten. Das gleiche Subnet auf wlan0 zuzuweisen brachte auch nichts, mit Routen alleine lässt sich dieses Problem nicht lösen. Hätte man ein öffentliches Netz > /64, z.B. ein /62 Prefix, würde das für vier weitere /64er Teilnetze ausreichen.

Immerhin wird kein Killswitch o.ä. benötigt, bricht die OpenVPN-Verbindung ab, ist das Tunnelinterface schlicht weg, NAT geht nicht mehr.

Schlusswort

Ganz offen, ohne Passwort, traue ich mich noch nicht, den Access-Point zu betreiben. Von den Firewallregeln fehlt hier noch die Abschottung des Hauptnetzes vom Gastnetz. Am Ende des Tages darf man auch nicht vergessen, dass ich nicht CISCO-zertifiziert bin… 😂