|
MAC filter w routerze WR1043ND z OpenWrt
Może zdarzyć się tak, iż będziemy chcieli ograniczyć dostęp do routera już w fazie logowania opierając się o adresy MAC jako dodatkowe zabezpieczenie. Niestety sterownik ath9 (atheros) nie wspiera tak jak w chipsecie broadcom sprzętowego ograniczenia po MAC adresach. Trzeba kombinować z iptables. W dokumencie tym przedstawię możliwość ograniczenia logowania do routera opierając się o wbudowaną właściwość hostapd (wpad). Domyślnie w OpenWrt nie jest to zdefiniowane. Poniżej przedstawię odpowiednie zmiany w systemie, które doprowadzą do uzyskania tejże funkcjonalności.
Cała konfiguracja testowana była na routerze WR1043ND. Jednakże winna poprawnie działać na wszystkich routerach używających sterownika ath9/ath5 (mac80211) - tu trzeba samemu sprawdzić.
Całą konfigurację przeprowadziłem w dwóch wersjach:
- zmiany w pliku mac80211.sh czyli konfiguracja jest identyczna jak w broadcom
- zmiany w pliku hostapd.sh czyli konfiguracja przesunięta jest z wifi-device do wifi-iface przez co zwiększamy funkcjonalność o to, że każdy AP nawet wirtualny może mieć własną listę MAC
Ja proponuje korzystać z wersji drugiej jako bardziej rozbudowanej.
WERSJA 1:
Instalacja:
cp /lib/wifi/mac80211.sh /root rm /lib/wifi/mac80211.sh wget http://rpc.one.pl/pliki/openwrt/backfire/10.03.x/atheros/hostapd/mac80211.sh -O /lib/wifi/mac80211.sh
I to w zasadzie wszystko jeśli chodzi o instalację.
Plik mac80211.sh możesz pobrać również ręcznie z mojego repozytorium.
Konfiguracja:
Plik /etc/config/wireless może wyglądać następująco:
config 'wifi-device' 'radio0' option 'type' 'mac80211' option 'channel' '5' option 'macaddr' '00:23:ce:31:b4:ba' option 'hwmode' '11ng' option 'htmode' 'HT20' option 'ht_capab' 'HT40- HT40+ SHORT-GI-40 DSSS_CCK-40' option 'disabled' '0' option 'country' 'PL' option 'maclist' '00:16:ea:49:23:fa 00:1c:bf:9e:d8:60' option 'macfilter' 'allow'
config 'wifi-iface' option 'device' 'radio0' option 'network' 'lan' option 'ssid' 'moje_ssid' option 'mode' 'ap' option 'encryption' 'psk2' option 'key' 'xxxxxxxx'
Doszły dwie nowe opcje:
w zasadzie to te opcje są opisane na wiki OpenWrt ale dotyczą tylko broadcom. Dostosowałem te opcje tak aby użycie ich wyglądało identycznie.
W opcji maclist definiujemy adresy MAC oddzielone spacją.
W opcji macfilter mamy trzy opcje:
- allow , 2 - mogą logować się tylko komputery z adresami MAC wymienionymi w parametrze maclist
- deny , 1 - mogą logować się wszystkie komputery z wyjątkiem tych, których adresy MAC wymienione są w parametrze maclist
- disable, 0 - wyłącza opcję MACFILTER (brak opcji macfilter oznacza domyślnie disable)
Oczywiście wszystko co powyżej można przedstawić za pomocą komend UCI:
root@OpenWrt:/tmp/run# uci show wireless wireless.radio0=wifi-device wireless.radio0.type=mac80211 wireless.radio0.channel=5 wireless.radio0.macaddr=00:23:ce:31:b4:ba wireless.radio0.hwmode=11ng wireless.radio0.htmode=HT20 wireless.radio0.ht_capab=HT40- HT40+ SHORT-GI-40 DSSS_CCK-40 wireless.radio0.disabled=0 wireless.radio0.country=PL wireless.radio0.maclist=00:16:ea:49:23:fa 00:1c:bf:9e:d8:60 wireless.radio0.macfilter=allow wireless.@wifi-iface[0]=wifi-iface wireless.@wifi-iface[0].device=radio0 wireless.@wifi-iface[0].network=lan wireless.@wifi-iface[0].ssid=moje_ssid wireless.@wifi-iface[0].mode=ap wireless.@wifi-iface[0].encryption=psk2 wireless.@wifi-iface[0].key=xxxxxxxx
co oznacza że możemy dodawać poprzez uci nasze opcje:
uci set wireless.radio0.maclist="00:16:ea:49:23:fa 00:1c:bf:9e:d8:60" uci set wireless.radio0.macfilter=allow
W wyniku w/w operacji w katalogu /var/run w zależności od tego czy jest wybrana opcja allow czy deny powstanie któryś z plików:
- /var/run/hostapd-phy0-mac.allow
- /var/run/hostapd-phy0-mac.deny
zawartością których będą nasze adresy MAC.
Co zostało zrobione:
Został zmodyfikowany plik /lib/wifi/mac80211.sh następująco:
Index: package/mac80211/files/lib/wifi/mac80211.sh =================================================================== --- package/mac80211/files/lib/wifi/mac80211.sh (wersja 22844) +++ package/mac80211/files/lib/wifi/mac80211.sh (kopia robocza) @@ -30,6 +30,26 @@ [ -n "$ht_capab" ] && append base_cfg "ht_capab=$ht_capab" "$N" } } + local macfile="/var/run/hostapd-${phy}-mac" + config_get macfilter "$device" macfilter + config_get maclist "$device" maclist + test -e $macfile.* && rm -f $macfile.* + case "$macfilter" in + allow|2) + append base_cfg "macaddr_acl=1" "$N" + for mac in $maclist; do + echo "$mac" >> $macfile.allow + done + append base_cfg "accept_mac_file=$macfile.allow" "$N" + ;; + deny|1) + append base_cfg "macaddr_acl=0" "$N" + for mac in $maclist; do + echo "$mac" >> $macfile.deny + done + append base_cfg "deny_mac_file=$macfile.deny" "$N" + ;; + esac cat > "$cfgfile" <<EOF ctrl_interface=/var/run/hostapd-$phy driver=nl80211
odpowiedni patch pobierzesz tutaj: mac80211.diff
Zmiany dodają do pliku konfiguracyjnego /var/run/hostapd-phy0.conf następujące opcje:
macaddr_acl=1 accept_mac_file=/var/run/hostapd-phy0-mac.allow
bądź
macaddr_acl=0 deny_mac_file=/var/run/hostapd-phy0-mac.deny
WERSJA 2:
Instalacja:
cp /lib/wifi/hostapd.sh /root rm /lib/wifi/hostapd.sh wget http://rpc.one.pl/pliki/openwrt/backfire/10.03.x/atheros/hostapd/hostapd.sh -O /lib/wifi/hostapd.sh
I to w zasadzie wszystko jeśli chodzi o instalację.
Plik hostapd.sh możesz pobrać również ręcznie z mojego repozytorium.
Konfiguracja:
Plik /etc/config/wireless może wyglądać następująco:
root@OpenWrt:/lib/wifi# cat /etc/config/wireless
config 'wifi-device' 'radio0' option 'type' 'mac80211' option 'channel' '5' option 'macaddr' '00:23:cd:36:b4:ba' option 'hwmode' '11ng' option 'htmode' 'HT20' list 'ht_capab' 'HT40-' list 'ht_capab' 'HT40+' list 'ht_capab' 'SHORT-GI-40' list 'ht_capab' 'DSSS_CCK-40' option 'disabled' '0' option 'country' 'PL'
config 'wifi-iface' option 'device' 'radio0' option 'network' 'lan' option 'ssid' 'siec_ssid1' option 'mode' 'ap' option 'encryption' 'psk2' option 'key' 'xxxxxxxx' option 'maclist' '00:16:eb:48:13:fe 00:2c:af:9e:dd:60' option 'macfilter' 'allow'
config 'wifi-iface' option 'device' 'radio0' option 'network' 'lan' option 'ssid' 'siec_ssid2' option 'mode' 'ap' option 'encryption' 'psk2' option 'key' 'xxxxxxxx' option 'maclist' '00:16:eb:48:13:fe 00:2c:af:9e:dd:60 00:12:34:ab:12:11' option 'macfilter' 'allow'
Doszły dwie nowe opcje w sekcji wifi-iface:
w zasadzie to te opcje są opisane na wiki OpenWrt ale dotyczą tylko broadcom. Dostosowałem te opcje tak aby użycie ich wyglądało identycznie i przesunąłem do sekcji wifi-iface.
W opcji maclist definiujemy adresy MAC oddzielone spacją.
W opcji macfilter mamy trzy opcje:
- allow , 2 - mogą logować się tylko komputery z adresami MAC wymienionymi w parametrze maclist
- deny , 1 - mogą logować się wszystkie komputery z wyjątkiem tych, których adresy MAC wymienione są w parametrze maclist
- disable, 0 - wyłącza opcję MACFILTER (brak opcji macfilter oznacza domyślnie disable)
- radius, 3 - do autoryzacji MAC korzysta z serwera radius
Oczywiście wszystko co powyżej można przedstawić za pomocą komend UCI:
root@OpenWrt:/lib/wifi# uci show wireless wireless.radio0=wifi-device wireless.radio0.type=mac80211 wireless.radio0.channel=5 wireless.radio0.macaddr=00:23:cd:36:b4:ba wireless.radio0.hwmode=11ng wireless.radio0.htmode=HT20 wireless.radio0.ht_capab=HT40- HT40+ SHORT-GI-40 DSSS_CCK-40 wireless.radio0.disabled=0 wireless.radio0.country=PL wireless.@wifi-iface[0]=wifi-iface wireless.@wifi-iface[0].device=radio0 wireless.@wifi-iface[0].network=lan wireless.@wifi-iface[0].ssid=siec_ssid1 wireless.@wifi-iface[0].mode=ap wireless.@wifi-iface[0].encryption=psk2 wireless.@wifi-iface[0].key=xxxxxxxx wireless.@wifi-iface[0].maclist=00:16:eb:48:13:fe 00:2c:af:9e:dd:60 wireless.@wifi-iface[0].macfilter=allow wireless.@wifi-iface[1]=wifi-iface wireless.@wifi-iface[1].device=radio0 wireless.@wifi-iface[1].network=lan wireless.@wifi-iface[1].ssid=siec_ssid2 wireless.@wifi-iface[1].mode=ap wireless.@wifi-iface[1].encryption=psk2 wireless.@wifi-iface[1].key=xxxxxxxx wireless.@wifi-iface[1].maclist=00:16:eb:48:13:fe 00:2c:af:9e:dd:60 00:12:34:ab:12:11 wireless.@wifi-iface[1].macfilter=allow
co oznacza że możemy dodawać poprzez uci nasze opcje:
uci set wireless.@wifi-iface[0].maclist="00:16:eb:48:13:fe 00:2c:af:9e:dd:60" uci set wireless.@wifi-iface[0].macfilter=allow uci set wireless.@wifi-iface[1].maclist="00:16:eb:48:13:fe 00:2c:af:9e:dd:60 00:12:34:ab:12:11" uci set wireless.@wifi-iface[1].macfilter=allow
W wyniku w/w operacji w katalogu /var/run w zależności od tego czy jest wybrana opcja allow czy deny powstanie któryś z plików:
- /var/run/hostapd-phy0-wlan0-mac.allow
- /var/run/hostapd-phy0-wlan1-mac.deny
zawartością których będą nasze adresy MAC.
Co zostało zrobione:
Został zmodyfikowany plik /lib/wifi/hostapd.sh następująco:
Index: package/hostapd/files/hostapd.sh =================================================================== --- package/hostapd/files/hostapd.sh (wersja 22871) +++ package/hostapd/files/hostapd.sh (kopia robocza) @@ -14,6 +14,31 @@ append "$var" "ap_isolate=$ap_isolate" "$N" fi + config_get ifname "$vif" ifname + local macfile="/var/run/hostapd-${phy}-${ifname}-mac" + config_get macfilter "$vif" macfilter + config_get maclist "$vif" maclist + test -e $macfile.* && rm -f $macfile.* + case "$macfilter" in + allow|2) + append "$var" "macaddr_acl=1" "$N" + for mac in $maclist; do + echo "$mac" >> $macfile.allow + done + append "$var" "accept_mac_file=$macfile.allow" "$N" + ;; + deny|1) + append "$var" "macaddr_acl=0" "$N" + for mac in $maclist; do + echo "$mac" >> $macfile.deny + done + append "$var" "deny_mac_file=$macfile.deny" "$N" + ;; + radius|3) + append "$var" "macaddr_acl=3" "$N" + ;; + esac + # Examples: # psk-mixed/tkip => WPA1+2 PSK, TKIP # wpa-psk2/tkip+aes => WPA2 PSK, CCMP+TKIP
odpowiedni patch pobierzesz tutaj: hostapd.diff
Zmiany dodają do pliku konfiguracyjnego /var/run/hostapd-phy0.conf następujące opcje:
macaddr_acl=1 accept_mac_file=/var/run/hostapd-phy0-wlan0-mac.allow
bądź
macaddr_acl=0 deny_mac_file=/var/run/hostapd-phy0-wlan1-mac.deny
Ps. hostapd umożliwia przeładowanie list mac. Możemy np. zmodyfikować pliki ręcznie w czasie pracy i wysłać sygnał do hostapd aby załadował od nowa pliki z adresami MAC bez restartu samoego hostapd. Możemy wykonać to następującymi poleceniami:
killall -SIGHUP hostapd
lub
kill -SIGHUP `pidof hostapd`
Podziel się tą informacja z innymi:
|