WDS, czyli konfiguracja mostów bezprzewodowych w OpenWRT

Tryb WDS (Wireless Distribution System) umożliwia stworzenie mostu bezprzewodowego, w którym to nadrzędny AP przekazuje pakiety do klientów WDS, a ci z kolei przesyłają go dalej do podrzędnych AP. Z reguły routery posiadają funkcję WDS i po jej aktywowaniu ten drugi AP będzie otrzymywał sygnał od pierwszego, po czym będzie go wzmacnia i rozsyła dalej w granicach swojego zasięgu. Tryb WDS nie jest jednak standardem i producenci firmware i sterowników implementują go inaczej, co przekłada się na problemy z kompatybilnością. Jeśli chcemy korzystać z opcji WDS, najlepiej posiadać dwa (lub więcej) takie same urządzenia i dobrze jest mieć na nich wgrany ten sam firmware.

W tym howto spróbujemy połączyć dwa routery TL-WR1043nd v2 oraz Archer C7 v2 w sposób opisany wyżej. Na obu tych urządzeniach jest zainstalowany OpenWRT BB. Archer będzie głównym AP, natomiast WR1043nd będzie klientem WDS i robił dodatkowo za AP w innej lokalizacji.

Poniższe informacje dotyczą jedynie chipsetów, które wspierają sterownik bezprzewodowy mac80211 -- np. układy Atheros. Jeśli nie wiemy czy nasz router potrafi obsługiwać ten sterownik, ani jaki układ mamy z routerze, możemy to sprawdzić przez plik /etc/config/wireless :

config wifi-device 'radio0'
	option type 'mac80211'
	...

Konfiguracja bezprzewodowego mostu sprowadza się do edycji 3 plików konfiguracyjnych na każdym z routerów. Są to /etc/config/network , /etc/config/dhcp oraz /etc/config/wireless . To w nich będziemy dokonywać wszystkich zmian.

Konfiguracja głównego routera

Na pierwszy ogień idzie router główny, czyli Archer C7. Najpierw edytujemy plik /etc/config/network . W nim będzie nas interesował jedynie blok od interfejsu LAN. Adres tego interfejsu musi być określony statycznie.

config interface 'lan'
...
	option proto 'static'
	option ipaddr '192.168.1.1'
	option netmask '255.255.255.0'
...

Dalej edytujemy plik /etc/config/dhcp i ustawiamy w nim konfigurację DHCP/DNS :

config dnsmasq
	option domainneeded '1'
	option boguspriv '1'
	option filterwin2k '0'
	option localise_queries '1'
	option rebind_protection '1'
	option rebind_localhost '1'
	option local '/lan/'
	option domain 'lan'
	option expandhosts '1'
	option nonegcache '1'
	option authoritative '1'
	option readethers '0'
	option leasefile '/tmp/dhcp.leases'
	option resolvfile '/tmp/resolv.conf.auto'
config dhcp 'lan'
	option interface 'lan'
	option start '100'
	option limit '150'
	option leasetime '12h'
	option dhcpv6 'server'
	option ra 'server'

Przechodzimy teraz do edycji ostatniego z plików, tj. /etc/config/wireless . Do konfiguracji naszej sieci WiFi, którą już mamy określoną, musimy dopisać jedynie ten poniższy parametr, wszystko inne zostawiamy w spokoju:

config wifi-iface
...
	option wds '1'

Konfiguracja klienta WDS

Z klientem WDS jest trochę więcej roboty. Zaczynamy podobnie jak w przypadku głównego routera -- od edycji pliku /etc/config/network :

config interface 'lan'
...
	option proto 'static'
	option ipaddr '192.168.1.2'
	option netmask '255.255.255.0'
...

Powyżej ustawiliśmy statyczny adres, z tym, że z tej samej klasy adresowej co w przypadku pierwszego routera -- różnią się tylko ostatnim oktetem, główny router ma 1, a ten 2. W takim przypadku będziemy mieli możliwość wbicia po ssh zarówno na główny router jak i tego klienta WDS.

W pliku /etc/config/dhcp musimy wyłączyć konfigurację dhcp:

config dhcp 'lan'
	...
	option ignore '1'

Nie musimy usuwać całego bloku odpowiedzialnego za przypisywanie adresów. Możemy tylko dopisać powyższą opcję i ten blok zostanie zignorowany. Można także wyłączyć dnsmasq z autostartu routera:

# /etc/init.d/dnsmasq disable

I efekt będzie podobny. Chodzi o to by adresy były przydzielane z głównego routera, a nie z klienta WDS.

I ostatni plik jaki nam pozostał do edycji, to /etc/config/wireless :

config wifi-device  radio0
	option type     mac80211
	option channel  11
	option hwmode   11g
	option path     'platform/qca955x_wmac'
	option htmode 'HT20'
	option noscan '0'
	option disabled '0'
	option country 'PL'
	option country_ie 'PL'
config wifi-iface
	option device 'radio0'
	option network 'lan'
	option mode 'sta'
	option ssid 'Ever_Vigilant'
	option encryption 'psk2+aes'
	option key '121ac9f99c166cfafed53612119226f41759eff0739a4064ebd1ef7f091c821a'
	option disabled '0'
	option hidden '0'
	option wds '1'
config wifi-iface
	option device 'radio0'
	option network 'lan'
	option mode 'ap'
	option ssid 'Ever_Vigilant'
	option encryption 'psk2+aes'
	option key '121ac9f99c166cfafed53612119226f41759eff0739a4064ebd1ef7f091c821a'
	option disabled '0'

Przede wszystkim konfiguracja radia musi być taka sama co w przypadku głównego routera, tj. ten sam kanał (channel) oraz jego szerokość (htmode) i ten sam tryb (hwmode). Jeśli chodzi zaś o konfigurację samej sieci, to nazwa sieci (ssid) oraz hasło (key) również muszą do siebie pasować. Powyżej mamy sprecyzowane dwa bloki config wifi-iface i różnią się one między sobą parametrem mode oraz w jednym z nich jest dopisana opcja wds. Ten blok, który zawiera opcję wds musi mieć opcję mode ustawioną na sta -- to jest nasz bezprzewodowy most. Natomiast blok zwierający mode 'ap' jest konfiguracją zwykłego punktu dostępowego -- takiego jak w przypadku posiadania w domu jednego routera. Nie wszystkie sterowniki jednak potrafią obsługiwać jednocześnie kilka i do tego różnych trybów pracy bezprzewodowego chipsetu -- trzeba o tym pamiętać przy stawianiu mostu, który poza łączeniem dwóch routerów bezprzewodowo, ma także za zadanie robić za wzmacniacz sygnału WiFi.

We wszystkich trzech przypadkach, konfiguracja sieci WiFi musi być taka sama. W ten sposób będziemy mieli dwa AP z tą samą siecią i most między nimi. Z kolei komputery będą się łączyć do tego AP, z którego będą mieć mocniejszy sygnał, chyba, że sprecyzujemy im inny BSSID w konfiguracji połączenia.

Testowanie WDS

Odłączamy kabelek od portu WAN na kliencie WDS i przechodzimy do testowania stworzonego mostu WDS. Najpierw podłączmy się do klienta WDS przewodowo. Konfigurację interfejsów na PC ustawiamy na DHCP i restartujemy połączenie sieciowe:

root:~# ifdown eth0
root:~# ifup eth0
Internet Systems Consortium DHCP Client 4.3.1
Copyright 2004-2014 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/eth0/3c:4a:92:00:4c:5b
Sending on   LPF/eth0/3c:4a:92:00:4c:5b
Sending on   Socket/fallback
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 6
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 8
DHCPREQUEST on eth0 to 255.255.255.255 port 67
DHCPOFFER from 192.168.1.1
DHCPACK from 192.168.1.1
bound to 192.168.1.150 -- renewal in 40945 seconds.

Jak widać powyżej, konfiguracja DHCP została przydzielony z adresu IP 192.168.1.1 , a nie 192.168.1.2, zatem otrzymaliśmy ją z głównego routera.

Sprawdźmy jeszcze połączenie z internetem:

root:~# ping wp.pl -c 3
PING wp.pl (212.77.100.101) 56(84) bytes of data.
64 bytes from www.wp.pl (212.77.100.101): icmp_seq=1 ttl=247 time=18.7 ms
64 bytes from www.wp.pl (212.77.100.101): icmp_seq=2 ttl=247 time=32.7 ms
64 bytes from www.wp.pl (212.77.100.101): icmp_seq=3 ttl=247 time=17.8 ms

wp.pl ping statistics 

3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 17.861/23.124/32.725/6.801 ms

Internet jest, zatem wszystko w porządku.
Zobaczmy jak wypadnie test WiFi via WDS. Podłączamy zatem karę WiFi do PC i skanujemy pasmo w poszukiwaniu punktów dostępowych:

root:~# wpa_cli
wpa_cli v2.3
Copyright (c) 2004-2014, Jouni Malinen <j@w1.fi> and contributors
This software may be distributed under the terms of the BSD license.
See README for more details.

Selected interface 'wlan1'
Interactive mode
> scan
OK
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
> scan_results
bssid / frequency / signal level / flags / ssid
ea:94:f6:68:79:f0       2462    -31     [WPA2-PSK-CCMP][ESS]    Ever_Vigilant
c4:6e:1f:95:ef:fd       2462    -40     [WPA2-PSK-CCMP][ESS]    Ever_Vigilant
...

I jak można było się spodziewać, mamy do wyboru jedną sieć z dwoma różnymi BSSID. Przy czym, sygnał z AP na kliencie WDS jest trochę lepszy niż ten pochodzący z głównego routera. Podłączamy się zatem do sieci:

root:~# ifup wlan1
Internet Systems Consortium DHCP Client 4.3.1
Copyright 2004-2014 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/wlan1/e8:94:f6:1e:15:e9
Sending on   LPF/wlan1/e8:94:f6:1e:15:e9
Sending on   Socket/fallback
DHCPDISCOVER on wlan1 to 255.255.255.255 port 67 interval 6
DHCPDISCOVER on wlan1 to 255.255.255.255 port 67 interval 15
DHCPREQUEST on wlan1 to 255.255.255.255 port 67
DHCPOFFER from 192.168.1.1
DHCPACK from 192.168.1.1
bound to 192.168.1.207 -- renewal in 36973 seconds.

Otrzymaliśmy adres z serwera DHCP.

Pozostał nam jeszcze test na połączenie z internetem:

root:~# ping wp.pl -c 3
PING wp.pl (212.77.100.101) 56(84) bytes of data.
64 bytes from www.wp.pl (212.77.100.101): icmp_seq=1 ttl=247 time=19.7 ms
64 bytes from www.wp.pl (212.77.100.101): icmp_seq=2 ttl=247 time=16.6 ms
64 bytes from www.wp.pl (212.77.100.101): icmp_seq=3 ttl=247 time=19.2 ms

wp.pl ping statistics 

3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 16.630/18.541/19.738/1.374 ms

Ja u siebie w logach mogę jeszcze dopatrzyć się poniższych linijek:

Oct 28 19:52:19 morfikownia kernel: [ 3376.037671] wlan1: authenticate with ea:94:f6:68:79:f0 
Oct 28 19:52:20 morfikownia kernel: [ 3376.420263] wlan1: send auth to ea:94:f6:68:79:f0 (try 1/3) 
Oct 28 19:52:20 morfikownia kernel: [ 3376.424248] wlan1: authenticated 
Oct 28 19:52:20 morfikownia kernel: [ 3376.424880] wlan1: associate with ea:94:f6:68:79:f0 (try 1/3) 
Oct 28 19:52:20 morfikownia kernel: [ 3376.428722] wlan1: RX AssocResp from ea:94:f6:68:79:f0 (capab=0x431 status=0 aid=1) 
Oct 28 19:52:20 morfikownia kernel: [ 3376.438231] wlan1: associated 

Adres MAC widoczny powyżej (ea:94:f6:68:79:f0), wskazuje, że mój PC podłączył się do AP klienta WDS, czego można było się spodziewać, bo ten dysponuje mocniejszym sygnałem. Zatem most działa jak należy.

Jeśli wbijemy na główny router po ssh i podejrzymy interfejsy via ifconfig, zobaczymy, że mamy tam jeden dodatkowy:

...
wlan1.sta1 Link encap:Ethernet  HWaddr C4:6E:1F:95:EF:FD
		  inet6 addr: fe80::c66e:1fff:fe95:effd/64 Scope:Link
		  UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
		  RX packets:19890 errors:0 dropped:0 overruns:0 frame:0
		  TX packets:33199 errors:0 dropped:0 overruns:0 carrier:0
		  collisions:0 txqueuelen:1000
		  RX bytes:3724057 (3.5 MiB)  TX bytes:43567082 (41.5 MiB)

Wszystko co jest zbierane przez wlan1.sta1 , pochodzi od klienta WDS.