Hotspot lub Sieć gościnna - na openwrt

Rozwiązanie przetestowano na OpenWrt Attitude Adjustment 12.09 w standardowej konfiguracji routera.
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=110
# uci set dhcp.guest.leasetime=1h
# uci set dhcp.guest.interface=guest

Czas dzierżawy adresu - 1 godziny, maksymalna ilość przypisanych adresów - 10. Wszystko możemy skonfigurować pod własne potrzeby.
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

Sieć jest otwarta - jeżeli chcemy zrobić jakiekolwiek kodowanie można ustawić np. na wpa2/aes z odpowiednim hasłem, choć z założenia hotspot jest otwartą siecią.
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 - Sieć gościnna
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 itd, użytkownik musi potwierdzić to w jeden z możliwych sposobów i może kontynuować przeglądanie internetu.
Instalacja:

# opkg update
# opkg nodogsplash

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

GatewayInterface 

Ustawiamy na br-guest (w tym przykładnie jest to fizyczny interfejs sieci gościnnej). Wartość konieczna do ustawienia.

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ć.

AuthenticateImmediately

Ustawiamy na yes jeżeli chcemy aby użytkownik został natychmiast zautoryzowany. Jeżeli dodatkowo została ustawiona opcja RedirectURL zostanie on przekierowany na tą podaną stronę, w przeciwnym przypadku zostanie wczytana pierwotna strona żądana przez użytkownika.
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. Nodogsplash wyposażony jest także w mechanizmy kontroli pasma oparte o moduł IMQ. Niestety nie jest on dostępny w Attitude Adjustment i Trunku, 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.
Na potrzeby tego poradnika przyjęto następującą zawartość pliku konfiguracyjnego:

GatewayInterface br-guest
    FirewallRuleSet authenticated-users {
    FirewallRule block to 192.168.0.0/16
    FirewallRule block to 10.0.0.0/8
    FirewallRule allow tcp port 53      
    FirewallRule allow udp port 53      
    FirewallRule allow tcp port 80
    FirewallRule allow tcp port 443
    FirewallRule allow tcp port 22
}
    FirewallRuleSet preauthenticated-users {
    FirewallRule allow tcp port 53      
    FirewallRule allow udp port 53
}
FirewallRuleSet users-to-router {
    FirewallRule allow udp port 53      
    FirewallRule allow tcp port 53      
    FirewallRule allow udp port 67
    FirewallRule allow tcp port 22
    FirewallRule allow tcp port 80
    FirewallRule allow tcp port 443
}
GatewayName Hotspot

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:

 PasswordAuthentication no
 UsernameAuthentication no

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

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

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

<head>
    <title>$gatewayname Entry</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='Kliknij aby kontynuować'>
    </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

 PasswordAuthentication yes
 Password alama13kotow

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

<head>
    <title>$gatewayname Entry</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'>
        Password: <input type='password' name='nodogpass' value='' size=12 maxlength=10>
        <br>
        <input type='submit' value='OK'>
    </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:

PasswordAuthentication yes
Password kot
UsernameAuthentication yes
Username ala

Zawartość strony startowej:

<head>
    <title>$gatewayname Entry</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'>
        Username: <input type='text' name='nodoguser' value='' size=12 maxlength=12>
        <br>
        Password: <input type='password' name='nodogpass' value='' size=12 maxlength=10> 
        <br>
        <input type='submit' value='OK'>
    </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 start
# /etc/init.d/nodogsplash enable

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
Możliwość usunięcie autoryzacji danego adresu MAC lub IP:
# ndsctl deauth IP|MAC
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:

root@OpenWrt:# ndsctl status
==================
NoDogSplash Status
====
Version: 0.9_beta9.9.6
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

Źródło: eko.one.pl - autor Cezary Jackiewicz