Hotspot - sieć gościnna
Ostatnia zmiana: 2021-10-22 22:51

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 18.06 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.
Konfiguracja dla obrazów OpenWrt wydanych do 29 maja 2021r (do wersji 21.02-rc1 włącznie):


    # 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

Konfiguracja dla obrazów OpenWrt wydanych po 29 maja 2021r (od wersji 21.02-rc2 i późniejsze wydania):


    # 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.device=br-guest
    # uci add network device
    # uci set network.@device[-1].name='br-guest'
    # uci set network.@device[-1].type='bridge'
    # uci set network.@device[-1].bridge_empty='1'

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"

  • gatewayinterface
Ustawiamy na br-guest (w tym przykładzie nazwaliśmy sieć na której chcemy mieć hotspota guest, zaś interfejsem tej sieci jest bridge o nazwie br-guest).

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

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, autoryzacja przez zewnętrzny serwis itd, należy przejrzeć oryginalny plik konfiguracyjny projektu (nodogsplash.conf) lub przejrzeć skrypt startowy. Nodogsplash wyposażony jest także w mechanizmy kontroli pasma wykorzystując pakiet sqm-scripts. Nogdogsplah nie przechwytuje ruchu HTTPS.

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


    # uci set nodogsplash.@nodogsplash[0].enabled=1
    # uci set nodogsplash.@nodogsplash[0].gatewayinterface=br-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 sposobu autoryzacji użytkowników.
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

Domyślna strona zawarta w /etc/nodogsplash/htdocs/splash.html posiada właśnie taką konfigurację. Jeżeli ktoś chce pokusić się o własną modyfikację to może ją wykorzystać jako szablon lub zastosować ten przestawiony poniżej:


<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 binauth która wskazuje na plik wykorzystywany do autoryzacji:


    # uci set nodogsplash.@nodogsplash[0].binauth='/bin/auth.sh'
    # 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='password' 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)
Oczywiście należy utworzyć także wspomniany skrypt:


    # touch /bin/auth.sh
    # chmod 755 /bin/auth.sh

Oraz wpisać do niego poniższą zawartość:


    #!/bin/sh

    METHOD="$1"
    MAC="$2"

    case "$METHOD" in
        auth_client)
            USERNAME="$3"
            PASSWORD="$4"
            if [ "$PASSWORD" = "alama13kotow" ]; then
                # Zezwolenie na 1 godzinę
                echo 3600 0 0
                exit 0
            else
                # Blokada dostępu
                exit 1
            fi
            ;;
        client_auth|client_deauth|idle_deauth|timeout_deauth|ndsctl_auth|ndsctl_deauth|shutdown_deauth)
            INGOING_BYTES="$3"
            OUTGOING_BYTES="$4"
            SESSION_START="$5"
            SESSION_END="$6"
            ;;
    esac

Skrypt ten odgrywa kluczową rolę w autoryzacji klientów, wywoływany jest przy każdej operacji związanej z klientem - logowanie, wylogowanie itd. Oczywiście skrypt można zmodyfikować i zamiast zwykłego sprawdzania hasła można korzystać z bazy danych, plików tekstowych itd. Więcej informacji o budowie skryptu i zdarzeniach można znaleźć na stronie dokumentacji projektu.

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

Wymagane jest ustawienie w pliku konfiguracyjnym opcji binauth która wskazuje na plik wykorzystywany do autoryzacji:


    # uci set nodogsplash.@nodogsplash[0].binauth='/bin/auth.sh'
    # 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='username' value='' size=12 maxlength=12>
        <br>
        Hasło: <input type='password' name='password' 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)
Podobnie jak w poprzednim przykładzie należy utworzyć skrypt /bin/auth.sh:


    # touch /bin/auth.sh
    # chmod 755 /bin/auth.sh

O następującej zawartości:


    #!/bin/sh

    METHOD="$1"
    MAC="$2"

    case "$METHOD" in
        auth_client)
            USERNAME="$3"
            PASSWORD="$4"
            if [ "$USERNAME" = "ala" -a "$PASSWORD" = "kot" ]; then
                echo 3600 0 0
                exit 0
            else
                exit 1
            fi
            ;;
        client_auth|client_deauth|idle_deauth|timeout_deauth|ndsctl_auth|ndsctl_deauth|shutdown_deauth)
            INGOING_BYTES="$3"
            OUTGOING_BYTES="$4"
            SESSION_START="$5"
            SESSION_END="$6"
            ;;
    esac

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: 3.2.1
Uptime: 4m 33s
Gateway Name: OpenWrt Nodogsplash
Managed interface: br-guest
Managed IP range: 0.0.0.0/0
Server listening: 10.20.30.1:2050
Binauth: Disabled
FAS: Disabled
Client Check Interval: 600s
Preauth Idle Timeout: 30m
Auth Idle Timeout: 120m
Traffic control: no
Total download: 20 kByte; avg: 0.61 kbit/s
Total upload: 20 kByte; avg: 0.60 kbit/s
====
Client authentications since start: 1
Current clients: 1

Client 0
        IP: 10.20.30.119 MAC: 11:22:33:44:55:66
        Last Activity: Tue Jun 04 07:32:22 2019 (0s ago)
        Session Start: Tue Jun 04 07:31:23 2019 (59s ago)
        Session End: Wed Jun 05 03:31:23 2019 (19h 59m 1s left)
        Token: 8698a67f
        State: Authenticated
        Download: 5 kByte; avg: 0.81 kbit/s
        Upload: 9 kByte; avg: 1.25 kbit/s

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