Hotspot - sieć gościnna
Ostatnia zmiana: 2016-06-13 22:02

Opisany Hotspot - strona powitalna sieci mimo prostej implementacji spełnia dostatecznie swoją funkcję, jednakże nie ma zbytniej możliwości nadzorowania etapu autoryzacji użytkowników. Istnieje wiele projektów realizujących funkcję hotspota - chilli, coova-chilli, wifidog czy nodogsplash który zostanie tu omówiony.

Rozwiązanie przetestowano na OpenWrt Chaos Calmer 15.05 w standardowej konfiguracji routera.

Dodatkowa sieć WLAN

W standardowych modelach routerów mamy do czynienia z siecią bezprzewodową oraz kilku portowym przełącznikiem (switchem), które są połączone ze sobą w logiczną całość (tzw. bridge) i pełnią rolę interfejsu lan. W zależności od potrzeb takie połączenie można przekształcić - oddzielić interfejs radiowy od przewodowego, utworzyć dodatkowy interfejs radiowy (VAP) czy rozdzielić switch na poszczególne porty i przypisać je do innych podsieci. Na potrzeby tego poradnika założono utworzenie tylko dodatkowej sieci radiowej, podobnie jak to było we wspomnianym już opisie sieci gościnnej.

Interfejs sieciowy

Tworzymy nową podsieć, o innej adresacji niż nasza domyślna:


    # uci set network.guest=interface
    # uci set network.guest.proto=static
    # uci set network.guest.ipaddr=10.20.30.1
    # uci set network.guest.netmask=255.255.255.0
    # uci set network.guest.type=bridge

Warto zauważyć że robimy tu bridge, dzięki czemu można także do tej sieci włączyć np. jeden z fizycznych portów Ethernet.

DHCP

Dla ułatwienia, adresy dla gości zrobimy przydzielane z dhcp


    # uci set dhcp.guest=dhcp
    # uci set dhcp.guest.start=100
    # uci set dhcp.guest.limit=150
    # uci set dhcp.guest.leasetime=2h
    # uci set dhcp.guest.interface=guest

Czas dzierżawy adresu - 2 godziny, maksymalna ilość przypisanych adresów - 150.

Interfejs radiowy

Tworzymy VAP dołączając konfigurację do istniejącej konfiguracji Wi-Fi


    # uci set wireless.guest=wifi-iface
    # uci set wireless.guest.device=radio0
    # uci set wireless.guest.mode=ap
    # uci set wireless.guest.network=guest
    # uci set wireless.guest.ssid=Hotspot
    # uci set wireless.guest.encryption=none

Jeżeli interfejs radiowy był wyłączony to trzeba go włączyć:


    # uci set wireless.radio0.disabled=0

Sieć jest otwarta - jeżeli chcemy zrobić jakiekolwiek kodowanie można ustawić np. na wpa2/aes z odpowiednim hasłem.

Firewall



    # uci add firewall zone
    # uci set firewall.@zone[-1].name=guest
    # uci set firewall.@zone[-1].network=guest
    # uci set firewall.@zone[-1].input=REJECT
    # uci set firewall.@zone[-1].output=ACCEPT
    # uci set firewall.@zone[-1].forward=REJECT

    # uci add firewall forwarding
    # uci set firewall.@forwarding[-1].src=guest
    # uci set firewall.@forwarding[-1].dest=wan
    
    # uci add firewall rule
    # uci set firewall.@rule[-1].src=guest
    # uci set firewall.@rule[-1].proto=udp
    # uci set firewall.@rule[-1].src_port=67-68
    # uci set firewall.@rule[-1].dest_port=67-68
    # uci set firewall.@rule[-1].target=ACCEPT
    # uci set firewall.@rule[-1].family=ipv4

    # uci add firewall rule
    # uci set firewall.@rule[-1].src=guest
    # uci set firewall.@rule[-1].dest_port=53
    # uci set firewall.@rule[-1].target=ACCEPT
    # uci set firewall.@rule[-1].family=ipv4
    # uci set firewall.@rule[-1].proto=tcpudp

Konfiguracja nie pozwala na dostęp z sieci gościnnej do sieci lan, tylko i wyłączenie do internetu.

Zapisujemy zmiany i restartujemy router.


    # uci commit
    # reboot

Hotspot

Użytkownik może dołączyć się do tak utworzonej sieci, ale najpierw powinien dostać "stronę startową". Można tam wyświetlić regulamin sieci, reklamy, bieżące informacje itd, użytkownik musi potwierdzić to w jeden z możliwych sposobów i może kontynuować przeglądanie internetu.

Instalacja



    # opkg update
    # opkg install nodogsplash

Konfiguracja

Konfiguracja zawarta jest w pliku /etc/config/nodogsplash. Jest dobrze opisana i nie powinno sprawić większych problemów. Opcje które należy przestawić to:

  • enabled
Należy włączyć cały proces, czyli ustawić opcję na "1"

  • network
Ustawiamy na guest (w tym przykładzie tak nazwaliśmy sieć na której chcemy mieć hotspota).

  • gatewayname
Nazwa naszego hotspota. Nie ma znaczenia w konfiguracji, choć jest przekazywana do strony logowania, więc może być wyświetlana.

  • redirecturl
Adres URL do którego użytkownik zostanie przekierowany po autoryzacji. Dzięki temu można przekierować użytkownika np. do strony informacyjnej czy strony firmowej za pierwszym razem niezależnie od tego jaką stronę chciał uzyskać.

Oprócz tych opcji możliwe jest także ustawienie ilości klientów, czasów trwania sesji, określenie dostępu do portów urządzenia itd, należy przejrzeć oryginalny plik konfiguracyjny projektu (nodogsplash.conf) lub przejrzeć skrypt startowy. Nodogsplash wyposażony jest także w mechanizmy kontroli pasma oparty o moduł IMQ. Niestety nie jest on dostępny od wydania Attitude Adjustment, więc nie będzie on działać; powinien za to działać w Gargoyle. Ponieważ interfejs dla hotspota jest wydzielony, można samodzielnie napisać skrypt qos limitujący pasmo do określonego poziomu lub wykorzystać jeden z istniejących - np. The Wonder Shapera.

Podstawowa konfiguracja jest w miarę dobra, można ustawić więc tylko to co niezbędne:


    # uci set nodogsplash.@instance[0].enabled=1
    # uci set nodogsplash.@instance[0].network=guest
    # uci commit nodogsplash

Kolejnym elementem który powinno się zmodyfikować jest strona startowa (spashpage), która zawarta jest w pliku /etc/nodogsplash/htdocs/splash.html. Jej zawartość zależy od konfiguracji nodogsplash.
Dla celów prezentacji mechanizmów strony w tym poradniku zrezygnowano ze wszystkich ozdobników (css, kolory itd) na rzecz czystego HTML. Oczywiście strona powinna zostać dostosowana do własnych wymagań.

Strona startowa - bez autoryzacji

Konfiguracja musi być taka jak powyżej lub muszą być ustawione opcje


    # uci set nodogsplash.@instance[0].passwordauthentication=0
    # uci set nodogsplash.@instance[0].usernameauthentication=0
    # uci commit nodogsplash

na "0" (brak żądania użytkownika/hasła). Strona startowa może wtedy pozostać domyślna:


<html>
<head>
    <title>$gatewayname</title>
    <meta HTTP-EQUIV="Pragma" CONTENT="no-cache">
</head>
<body>
    <a href="$authtarget">
        <img src="$imagesdir/splash.jpg">
    </a>
</body>
</html>

(aby rozpocząć przeglądanie stron użytkownik musi kliknąć obrazek), lub


<html>
<head>
    <title>$gatewayname</title>
    <meta HTTP-EQUIV="Pragma" CONTENT="no-cache">
</head>
<body>
    <form method='GET' action='$authaction'>
        <input type='hidden' name='tok' value='$tok'>
        <input type='hidden' name='redir' value='$redir'>
        <input type='submit' value='Logowanie'>
    </form>
</body>
</html>

(aby rozpocząć przeglądanie stron użytkownik musi kliknąć przycisk)

Strona startowa - autoryzacja przez samo hasło (token)

Wymagane jest ustawienie w pliku konfiguracyjnym opcji


    # uci set nodogsplash.@instance[0].passwordauthentication=1
    # uci set nodogsplash.@instance[0].password=alama13kotow
    # uci commit nodogsplash

Strona startowa może wyglądać następująco:


<html>
<head>
    <title>$gatewayname</title>
    <meta HTTP-EQUIV="Pragma" CONTENT="no-cache">
</head>
<body>
    <form method='GET' action='$authaction'>
        <input type='hidden' name='tok' value='$tok'>
        <input type='hidden' name='redir' value='$redir'>
        Hasło: <input type='password' name='nodogpass' value='' size=12 maxlength=10>
        <br>
        <input type='submit' value='Logowanie'>
    </form>
</body>
</html

(aby rozpocząć przeglądanie stron użytkownik musi wpisać hasło/token - "alama13kotow" w tym przypadku)

Strona startowa - autoryzacja przez parę login/hasło

Wymagane jest ustawienie w pliku konfiguracyjnym opcji


    # uci set nodogsplash.@instance[0].passwordauthentication=1
    # uci set nodogsplash.@instance[0].password=kot
    # uci set nodogsplash.@instance[0].usernameauthentication=1
    # uci set nodogsplash.@instance[0].username=ala
    # uci commit nodogsplash

Zawartość strony startowej:


<html>
<head>
    <title>$gatewayname</title>
    <meta HTTP-EQUIV="Pragma" CONTENT="no-cache">
</head>
<body>
    <form method='GET' action='$authaction'>
        <input type='hidden' name='tok' value='$tok'>
        <input type='hidden' name='redir' value='$redir'>
        Nazwa: <input type='text' name='nodoguser' value='' size=12 maxlength=12>
        <br>
        Hasło: <input type='password' name='nodogpass' value='' size=12 maxlength=10> 
        <br>
        <input type='submit' value='Logowanie'>
    </form>
</body>
</html

(aby rozpocząć przeglądanie stron użytkownik musi wpisać parę login/hasło - ala/kot w tym przypadku)

Niestety nodogsplah nie ma możliwości wykorzystywania loginów z innego pliku niż konfiguracyjny.

Uruchomienie



    # /etc/init.d/nodogsplash enable
    # /etc/init.d/nodogsplash start

Kontrola

Wraz z pakietem nodogsplash dostarczany jest program ndsctl pozwalający na kontrolę procesu autoryzacji użytkowników a także pozwala na wyświetlenie statusu hotspota.

  • informacje o hotspocie


    # ndsctl status


  • lista podłączonych klientów


    # ndsctl clients


  • usunięcie autoryzacji klienta na podstawie danego adresu MAC lub IP


    # ndsctl deauth 11:22:33:44:55:66 # lub 10.20.30.119


  • wyłączenie hotspota


    # ndsctl stop

Program zawiera także możliwości blokowania adresów MAC, zmianę użytkownika/hasła czy poziomu logowania. Przykładowy status hotspota:


    # ndsctl status
==================
NoDogSplash Status
====
Version: 0.9_beta9.9.9
Uptime: 0d 0h 12m 12s
Gateway Name: Hotspot
Managed interface: br-guest
Managed IP range: 0.0.0.0/0
Server listening: 10.20.30.1:2050
Splashpage: /etc/nodogsplash/htdocs/splash.html
Gateway password: ala
Gateway username: kot
Traffic control: no
Total download: 0 kByte; avg: 0 kbit/s
Total upload: 0 kByte; avg: 0 kbit/s
====
Client authentications since start: 1
Httpd request threads created/current: 25/0
Current clients: 1

Client 0
        IP: 10.20.30.119 MAC: 11:22:33:44:55:66
        Added:   Sat Apr  6 08:08:06 2016
        Active:  Sat Apr  6 08:20:03 2016
        Active duration: 0d 0h 11m 57s
        Added duration:  0d 0h 11m 57s
        Token: 8a54824e
        State: Authenticated
        Download: 329 kByte; avg: 3.67589 kbit/s
        Upload:   151 kByte; avg: 1.69232 kbit/s

====
Blocked MAC addresses: none
Allowed MAC addresses: N/A
Trusted MAC addresses: none
========