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.
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:
Należy włączyć cały proces, czyli ustawić opcję na "1"
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).
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.
- lista podłączonych klientów
- usunięcie autoryzacji klienta na podstawie danego adresu MAC lub IP
# ndsctl deauth 11:22:33:44:55:66 # lub 10.20.30.119
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
========