Mit FreeBSD einen WLAN-Accesspoint und kleinen Switch bauen

Meine IT kommt in die Jahre. Ich habe vor Jahren einen Netgear WLAN-Accesspoint mit ddwrt geflasht und als Endpunkt für Mobiltelefone, Tablets Blueray-Player verwendet. Dies hat ausgereicht, aber ist mit seinem Funktionsumfang etwas überdimensioniert. Das Risiko, anfällig für Bugs zu sein, ist erlativ hoch. Aber jetzt war Schluss. Eine eigen Lösung, die ich besser kontrollieren kann, muss her.

Mein erster Gedanke war ein Raspberry Pi, da er klein ist und wenig verbraucht. Da ich aber außerdem bemerkt habe, dass ich für AV-Receiver und Fernseher zusätzlich noch einen 4 Port Switch am Laufen hatte, dachte ich mir das muss doch noch einfacher gehen. Da ich bereits ein Alix-Board von PC-Engines am Laufen habe, sollte die Lösung ein weiteres Alix-Board sein, und nur das Nötigste installiert haben. Für meine Anforderung war es maßgeschneidert.

  • 3 Gigabit Ports
  • ein WLAN Module, dass nachträglich mit 2 großen Antennen ausgestattet wird
  • geringer Stromverbrauch

Mein Device hat einen Micro-SD mit 16 GB, das mehr als genug ist. Da aber diese Karten eigentlich nicht so optimal für OS Einsatz sind, sollte es schon passen. FreeBSD ist ja schon gesetzt. Da ich keine Setups eigentlich sehr einfach halten möchte, will ich auf dem Accesspoint keinen DHCP-Server haben, denn dieser ist in meinem Netzwerk bereits vorhanden. Firewall kann noch installiert werden, aber da ich das WLAN mit einem Passwort versehen, sollte dies als Grundausstattung reichen. Wer mag, kann es dann ja erweitern. Wichtig ist aber auch, dass die 2 freien Gigabit Ports für meine Media-Player und Fernseher angeschlossen werden und auch funktionieren sollen. Ein Bridge Setup muss her.

Damit das WLAN Module richtig funktioniert, sollte man genau suchen und ein Modul besorgen, das auf alle Fälle von FreeBSD unterstützt wird, damit man nachher weniger Ärger hat. Ich verwende ein Compex wle200nx Module, dass einen ath Chipsatz verbaut hat. Mehr dazu findet man bei google.

FreeBSD wird mit dem aktuellsten Image über USB-Stick und serieller Konsole installiert.

Ein Null-Modem Kabel muss dann mit dem Alix-Board und dem eigenen Rechner verbunden werden. Es gib hier aber einen kleinen, aber wichtigen Punkt zu beachten. Die Images vonf FreeBSD sind für eine „normale“ Installationa n einem Rechner mit bildschirm gedacht. Das Alix-Board hat aber keinen vga-Ausgang. Damitz die Installation trotzdem klappt, muss man nachdem das Images erfolgreich auf einen USB-Stick gespielt wurde die Datei /boot/loader.conf auf dem USB-Stick anpassen und folgende Code eintragen.

# Ausgabe auf der Console
console=“comconsole“

Tut man das nicht, gibt es auf der seriellen Console keine Ausgabe. und der USB-Stick bootet nicht weiter. 🙁

Um sich dann mit dem Board zu verbinden, ist zu beachten, dass die richtigen Parameter für die Verbindung gewählt werden. Entweder man nimmt screen

screen /Dev/ttyU0 9600

oder cu

cu -l /dev/ttyU0 -s 9600

Die Installation selber ist eine normale Installation. Ich habe einen eigenen Benutzer für den SSH-Login hinzugefügt. Auch sollte es möglich sein, von diesem Benutzer zu root zu wechseln.

Bevor man die Installation beendet, sollte man in das frisch installierte System gehen und folgende Daten in der Datei /boot/loader.conf eintragen.

#start verkuerzen
autoboot_delay=2

# Ausgabe auf der Console
console=“comconsole“

# Paketfilter
pf_load=“yes“
pflog_load=“yes“

# bridge
if_bridge_load=“yes“
#if_bridgestp_load=“yes“

Da das ALIX-Board keinen vga-Ausgang hat, muss man hier die Ausgang auf die serielle Schnittstelle umstellen.

Das WLAN-Module wird bereits im Kernel geladen, deshalb muss man dies hier nicht explizit angeben. Neben dem WLAN Modul wird auch noch das Bridge-Modul geladen, da wird alle Interfaces mit einer Bridge verbunden werden.

Damit alles beim Booten richtig passt, müssen in der Datei /etc/rc.conf die Interfaces und die Services sshd und hostapd, der für das WLAN zuständig ist, eingerichtet werden.

# Settings
hostname=“wlanaccesspoint“
keymap=de
clear_tmp_enable=“YES“

#————————————————————-#
# Netzwerk
ifconfig_re0=“inet <lan-ip> netmask 255.255.255.0″
ifconfig_re1=“up“
ifconfig_re2=“up“
defaultrouter=“<router-ip>“

# wlan
wlans_ath0=“wlan0″
create_args_wlan0=“wlanmode hostap“
hostapd_enable=“yes“
ifconfig_wlan0=“ssid <name des wlan> country DE mode 11ng“

# bridge
cloned_interfaces=“bridge0″
ifconfig_bridge0=“addm re0 addm re1 addm re2 addm wlan0 up“

#————————————————————-#
# Paketfilter
pf_enable=“no“
pf_rules=“/etc/pf.conf“ # rules definition file for pf
pf_flags=““ # additional flags for pfctl start up
pflog_enable=“no“ # start pflogd(8)
pflog_logfile=“/var/log/pflog“ # where pflogd should store the logfile
pflog_flags=““ # additional flags for pflogd start up

# Routing
gateway_enable=“yes“ # als Router muss das aktiviert werden.

#————————————————————-#
#Services
sshd_enable=“YES“
syslogd_flags=“-ss“

# ntp
openntpd_enable=“yes“

# Sendmail ausschalten
sendmail_enable=“NONE“
sendmail_submit_enable=“NO“
sendmail_outbound_enable=“NO“
sendmail_msp_queue_enable=“NO“

#————————————————————-#

<lan-ip>, <router-ip> und <name des wlan> muss an die eigenen gegebenheiten angepasst werden.

Damit die Interfaceses 2 und 3 auch funktionieren, muss man diese explizit auf „up“ setzen, dann sind sie eingeschaltet und können mit der Bridge verbunden werden.

<name des wlan>, <wlan-passwort> und alles weitere kann man in der Datei /etc/hostapd.conf einrichten. Bei der Channel Wahl muss man selber experimentieren, welcher der passende ist. Wichtig sollte aber der Parameter country_code sein, bei dem man seinen passenden Country-Code eingeben sollte. In meinem Fall war dies DE.

ssid=<name des wlan>
wpa_passphrase=<wlan-passwort>
#channel=1
interface=wlan0
hw_mode=g
#ieee80211n=1
ieee80211d=1
wmm_enabled=1
auth_algs=3
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
rsn_pairwise=CCMP
beacon_int=1000
dtim_period=2
max_num_sta=255
rts_threshold=2347
fragm_threshold=2346
logger_syslog=-1
logger_syslog_level=2
debug=1
ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel
country_code=DE

Was macht dieses Setup nun so genial? Nun ja, da die 3 Gigabit Ports mit dem WLAN Port über eine Bridge verbunden sind, braucht man nur für das ausgehende Interface, hier bei mir re0 die IP-Adresse, Netzwerkmaske und Gateway einrichten. Alles, was über die anderen Interfaces kommt wird an das ausgehende Interface 1:1 weitergereicht. Man könnte sagen, dass so ein kleiner 3-Port-wlan-Switch eingerichtet wurde.

Die Konfiguration der Gigabit-Interfaces sieht so aus.

re0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=82099<RXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC,LINKSTATE>
ether xx:xx:xx:xx:xx:xx
hwaddr xx:xx:xx:xx:xx:xx
inet <lan-ip> netmask 0xffffff00 broadcast xx.xx.xx.255
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
re1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=82099<RXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC,LINKSTATE>
ether xx:xx:xx:xx:xx:xx
hwaddr xx:xx:xx:xx:xx:xx
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
re2: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=82099<RXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC,LINKSTATE>
ether xx:xx:xx:xx:xx:xx
hwaddr xx:xx:xx:xx:xx:xx
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active

Die Einrichtung der WLAN-Karte sieht bei mir folgendermaßen aus.

wlan0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether xx:xx:xx:xx:xx:xx
hwaddr xx:xx:xx:xx:xx:xx
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: IEEE 802.11 Wireless Ethernet autoselect mode 11b <hostap>
status: running
ssid <name des wlan> channel 1 (2412 MHz 11b) bssid xx:xx:xx:xx:xx:xx
regdomain ETSI country DE ecm authmode WPA2/802.11i privacy MIXED
deftxkey 2 AES-CCM 2:128-bit txpower 30 scanvalid 60 wme burst
dtimperiod 1 -dfs
groups: wlan

Die Bridge sieht so aus.

bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether xx:xx:xx:xx:xx:xx
nd6 options=9<PERFORMNUD,IFDISABLED>
groups: bridge
id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200
root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
member: wlan0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 6 priority 128 path cost 33333
member: re2 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 3 priority 128 path cost 55
member: re1 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 2 priority 128 path cost 55
member: re0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 1 priority 128 path cost 55

Die Daten sind anonymisiert, d.h. MAC-Adresse, IP-Adresse und ssid sowie Passwort sind entfernt. 😉

Da man in der Grundausstattung nicht mehr braucht, kann man nun neu starten und das WLAN sollte funktionieren.

Was kann man nun noch anpassen? Ich muss nicht immer das WLAN aktiv haben. Mit 2 Zeilen in der Datei /etc/crontab kann man z.B. einstellen, dass das WLAN um Mitternacht aus und um 07:00 wieder angeht. So kann man etwas Strom sparen und auch die Sicherheit etwas erhöhen.

#————————————————————————#
# wlan on/off

0 0 * * * root service hostapd stop; ifconfig wlan0 down
0 7 * * * root ifconfig wlan0 up; service hostapd start

Eine Konfiguration des pf sollte, nachdem es sich hier um eine Standard-Installation handelt, kein Problem sein und sollte auch eingerichtet werden.

Viel Spass mit den neuen WLAN-Accesspoint.

Gruß

Robert

Robert Friemer

Robert Friemer, mittlerweile 49, arbeitet mit Windows seit Version 3.11, mit Linux seit Version 2.0 und mit FreeBSD seit Version 3.8. Er hat schon so einige Irrungen und Wirrungen in der IT mit erlebt und ist seit einigen Jahren (fast) Windows-los. Dank Pinguin und vor allem dank Beastie.

More Posts - Website