FreeBSD und multiple WLAN APs

Nachdem ich ewig gebraucht habe herauszufinden wie ich meinen Gateway dazu bringe multible SSIDs über eine Karte aufzuspannen, will ich meine (erfolgreiche) Konfiguration mit Euch teilen.

Wie immer ist der erste Anlaufpunkt das FreeBSD Handbook. Unter findet man zunächst grundlegende Hilfe. Wir werden aber im Verlauf sehen, dass es hier an einer Stelle extrem an Dokumentation fehlt….

Eines vorweg: Erspart Euch Stress, und seht zu, dass Ihr einen vernünftigen Adapter habt. Ja, Intel ist war super wenn es um Ethernet-Adapter geht, im Wireless Bereich, baut lieber auf einen Atheros ( ath(4) ) Chipsatz. Die sind bei weitem am besten unterstützt…

Hintergrund

Nun, ich will neben meinem bestehenden WLAN auch noch ein Gäste Netz aufspannen. Und was mit meiner beschissenen Fritz!Box geht, muss doch auch mit meinem FreeBSD Gateway gehen…

Ausgangslage

  • Als Betriebssystem läuft bei mir FreeBSD 10.4-RELEASE
  • Und als Karte habe ich verbaut eine Qualcomm Atheros AR9565
ath0: <Qualcomm Atheros AR9565> mem 0x91300000-0x9137ffff irq 22 at device 0.0 on pci1
ath0: RX status length: 48
ath0: RX buffer size: 4096
ath0: TX descriptor length: 128
ath0: TX status length: 36
ath0: TX buffers per descriptor: 4
ath0: ath_edma_setup_rxfifo: type=0, FIFO depth = 16 entries
ath0: ath_edma_setup_rxfifo: type=1, FIFO depth = 128 entries
ath0: [HT] enabling HT modes
ath0: [HT] enabling short-GI in 20MHz mode
ath0: [HT] 1 stream STBC receive enabled
ath0: [HT] 1 RX streams; 1 TX streams
ath0: AR9565 mac 704.1 RF5110 phy 1638.6
ath0: 2GHz radio: 0x0000; 5GHz radio: 0x0000

Wichtig ist, dass der Adapter zum einen HOSTAP „sprechen“ kann, und zum anderen auch mehrere davon aufspannen kann. Ich hatte hier eine recht neue Intel Karte. Die konnte zwar ersteres, aber nur eben nur einen… Klar: Einen passenden Verschlüsselung-Algorithmus sollte sie auch noch unterstützen. Wir überprüfen das mal eben:

# ifconfig wlan0 create wlandev ath0
# ifconfig wlan0 list caps
drivercaps=4f85ed01<STA,IBSS,HOSTAP,AHDEMO,TXPMGT,SHSLOT,SHPREAMBLE,MONITOR,MBSS,WPA1,WPA2,BURST,WME,WDS,TXFRAG>
cryptocaps=1f<WEP,TKIP,AES,AES_CCM,TKIPMIC>
htcaps=7016e<CHWIDTH40,SHORTGI20,SHORTGI40

Das schaut also schon nicht schlecht aus….

Achso: Fast vergessen. Natürlich sollte der Support für die Karte da sein… Ich baue eigentlich immer nen custom kernel…

Kernel etc.

Im GENERIC Kernel sind die meisten Adapter eh drin. Bei mir sieht es so aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Wireless NIC cards
device          wlan                    # 802.11 support
options         IEEE80211_DEBUG         # enable debug msgs
options         IEEE80211_AMPDU_AGE     # age frames in AMPDU reorder q's
options         IEEE80211_SUPPORT_MESH  # enable 802.11s draft support
device          wlan_wep                # 802.11 WEP support
device          wlan_ccmp               # 802.11 CCMP support
device          wlan_tkip               # 802.11 TKIP support

# Atheros
device          ath                     # Atheros NICs
device          ath_pci                 # Atheros pci/cardbus glue
device          ath_hal                 # pci/cardbus chip support
options         AH_SUPPORT_AR5416       # enable AR5416 tx/rx descriptors
options         AH_AR5416_INTERRUPT_MITIGATION # AR5416 interrupt mitigation
options         ATH_ENABLE_11N          # Enable 802.11n support for AR5416 and later
device          ath_rate_sample         # SampleRate tx rate control for ath

In Wirklichkeit hab ich natürlich noch einige Optionen für PF und VPN drin. Das aber an anderer Stelle….

Die Config

Nun kommen wir aber endlich zum interessanten Part. Wir wollen nun also zwei wlan(4) devices die jeweils mit hostapd(8) ihre Netzte aufspannen. Und hier kommen wir zu den zwei Problemen. Zum einen brauchen wir zwei unterschiedliche BSSIDs (eigentlich die MAC Adresse des Adapters) und zum anderen müssen wir hostapd(8) zwei Mal starten (irgendwie). Die Lösung ist eigentlich recht einfach. Wir schreiben folgendes in unsere /etc/rc.conf:

1
2
3
4
5
wlans_ath0="wlan0 wlan1"
create_args_wlan0="wlanmode hostap bssid"
create_args_wlan1="wlanmode hostap bssid"
ifconfig_wlan0="inet 192.168.0.1/24 up HOSTAP"
ifconfig_wlan1="inet 192.168.1.1/24 up HOSTAP"

Die zwei wichtigen Dinge sind das „bssid“ als create args. Das sorgt dafür, dass die zwei wlan(4) devices eigene bssids bekommen. Und das „HOSTAP“ in den ifconfig Zeilen startet jetzt für jedes Interface einen eignen hostapd(8) Prozess.

ACHTUNG: Dies ist alles was wir brauchen… Ja: Kein hostapd_enable=“YES“ setzten…

Und nun noch ein letzter undokumentierter Hinweis. hostapd(8) sucht nun nicht nach einem file /etc/hostapd.conf, sondern nach zwei Dateien die /etc/hostapd-wlan0.conf und /etc/hostapd-wlan1.conf heißen. Die schauen etwa so aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# /etc/hostapd-wlan0.conf

ssid=FreeBSD Accesspoint
wpa_passphrase=Was ein schoenes Passwort!
channel=6
interface=wlan0
hw_mode=g
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
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0

und:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# /etc/hostapd-wlan1.conf

ssid=FreeBSD Gaestezugang
wpa_passphrase=Noch ein schoenes Passwort!
channel=6
interface=wlan1
hw_mode=g
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
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0

 

Das war’s. Mit:service netif restart
starten wir mal eben alles noch, et voilà…. Es läuft…

Ich lasse jetzt mal eben aus, das die Kiste so natürlich nichts routet und die Clients keine IP Adressen bekommen. Das steht auf einem anderen Blatt Papier und wird evtl. ein weiterer Artikel…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.