Warning: Memcache::addserver() expects parameter 2 to be long, string given in /usr/home/rpc/domains/rpc.one.pl/public_html/libraries/joomla/cache/storage/memcache.php on line 84 MAC filter w routerze WR1043ND z OpenWrt
 
 
MAC filter w routerze WR1043ND z OpenWrt Drukuj Email
Wpisany przez rpc   
poniedziałek, 30 sierpnia 2010 22:06

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:

  • maclist
  • macfilter

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:

  • maclist
  • macfilter

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:
Poprawiony: poniedziałek, 14 lutego 2011 21:53