English · Ελληνικά
Η branded σελίδα «αποδέξου τους όρους και συνδέσου» που περιμένει κάθε επισκέπτης — και που μας ζητά κάθε ιδιοκτήτης ξενοδοχείου. Αυτό είναι το hotspot του MikroTik σωστά φτιαγμένο: μια σελίδα login στην οποία μπορείς να βάλεις λογότυπο, κωδικούς voucher στη ρεσεψιόν, προαιρετικό RADIUS, ένα walled garden ώστε το ίδιο το login να φορτώνει πάντα, bandwidth ανά επισκέπτη, και την πραγματικότητα HTTPS-redirect που κανείς δεν σε προειδοποιεί.
Ένα captive portal είναι ένα μικρό, δοκιμασμένο κόλπο: ο router τρέχει έναν μικροσκοπικό web server, και μέχρι να κάνει authenticate μια συσκευή, κάθε αίτημα HTTP που κάνει ανακατευθύνεται στη σελίδα login. Αποδέξου τους όρους (ή βάλε ένα voucher), ο router γυρνά το MAC εκείνης της συσκευής σε «εξουσιοδοτημένο», και η κίνηση ρέει κανονικά. Τα τηλέφωνα αναγνωρίζουν το pattern και ανοίγουν τη σελίδα αυτόματα — αυτό είναι το φύλλο «Sign in to Wi-Fi» που έχει δει κάθε επισκέπτης.
Στο MikroTik αυτό είναι το feature hotspot, και είναι πραγματικά καλό — ένας οδηγός πέντε λεπτών σου δίνει ένα λειτουργικό portal, και η σελίδα login είναι απλώς επεξεργάσιμο HTML που μπορείς να κάνεις branded. Αυτό το post το πάει από εκείνον τον οδηγό σε κάτι που θα έδινες πραγματικά σε ένα ξενοδοχείο: μια σελίδα αποδοχής όρων, κωδικούς voucher τυπωμένους στη ρεσεψιόν μέσω User Manager, ένα προαιρετικό backend RADIUS, το walled garden που κρατά το ίδιο το portal προσβάσιμο, και όρια ταχύτητας ανά επισκέπτη. Είναι η μπροστινή πόρτα των επισκεπτών προς το segmented δίκτυο από το lab ξενοδοχείου.
01
Η εντολή setup συνδέει όλο το πράγμα — ένα IP pool, DHCP, έναν κανόνα NAT, τον server του portal, και ένα default profile — πάνω σε ένα interface. Τρέξ' την στο interface επισκεπτών, ποτέ στο WAN.
# Δείξ' το στο interface επισκεπτών (ένα VLAN interface ή ένα bridge επισκεπτών). # Ο οδηγός κάνει μια χούφτα ερωτήσεις — δέξου τα λογικά defaults. [admin@GW] > /ip hotspot setup hotspot interface: vlan20-guest local address of network: 10.10.20.1/24 (auto) masquerade network: yes address pool: 10.10.20.10-10.10.20.254 select certificate: none ip address of smtp server: 0.0.0.0 dns servers: 10.10.20.1 dns name: wifi.hotel.local name of local user: (skip — we use vouchers) # Τι δημιούργησε, σε ένα σημείο: [admin@GW] > /ip hotspot print 0 name="hotspot1" interface=vlan20-guest address-pool=hs-pool-guest profile=hsprof1 idle-timeout=5m keepalive-timeout=none
.local-ish
Το dns name (εδώ wifi.hotel.local) είναι το hostname στο οποίο απαντά το portal — οι επισκέπτες ανακατευθύνονται στο http://wifi.hotel.local/login. Διάλεξε κάτι που ξεκάθαρα δεν είναι πραγματικό δημόσιο domain, και ποτέ μη χρησιμοποιήσεις το όνομα του πραγματικού σου website (το portal θα το επισκίαζε για κάθε συνδεδεμένο επισκέπτη). Πρέπει επίσης να γίνεται resolve μόνο μέσα στο hotspot — το built-in DNS του οδηγού το χειρίζεται αυτό. Αν αργότερα προσθέσεις HTTPS στο portal, αυτό το όνομα πρέπει να ταιριάζει με το πιστοποιητικό (δες την παγίδα HTTPS στο section 06).
02
Το πιο απλό portal ξενοδοχείου δεν είναι κουτί username — είναι ένα λογότυπο, ένα checkbox «Αποδέχομαι τους όρους», και ένα κουμπί Connect. Αυτό είναι μια αλλαγή δύο γραμμών στο profile login συν ένα branded αρχείο HTML.
# Το login «trial» αφήνει έναν επισκέπτη μέσα για καθορισμένο χρόνο χωρίς credentials — # τέλειο για accept-and-connect. Δώσε σε όλους την ίδια κοινή πρόσβαση χωρίς voucher. [admin@GW] > /ip hotspot user profile set [find name=default] \ shared-users=1 rate-limit=10M/40M session-timeout=1d idle-timeout=15m [admin@GW] > /ip hotspot profile set [find name=hsprof1] \ login-by=cookie,http-chap trial-uptime-limit=1d trial-uptime-reset=1d # Το login cookie θυμάται τη συσκευή ενός επιστρέφοντα επισκέπτη για τη μέρα ώστε # να μην ξανααποδέχεται σε κάθε reconnect (το MAC-cookie στο section 06).
Το HTML του portal ζει στο flash του router, στον φάκελο hotspot/ — login.html, alogin.html (η σελίδα «είσαι συνδεδεμένος»), logout.html, και μερικά includes. Τράβηξέ τα με το Files browser του WinBox ή SFTP, επεξεργάσου τα, και ξαναβάλ' τα πίσω. Για μια σελίδα accept-and-connect κρατάς τη φόρμα login του MikroTik αλλά αντικαθιστάς τα inputs username/password με ένα μόνο checkbox και ένα κρυφό trial submit:
<img src="logo.png" alt="Hotel">
<h1>Καλωσήρθατε — δωρεάν Wi-Fi επισκεπτών</h1>
<form name="login" action="$(link-login-only)" method="post">
<input type="hidden" name="dst" value="$(link-orig)">
<input type="hidden" name="popup" value="true">
<label><input type="checkbox" required>
Αποδέχομαι τους <a href="/terms.html">όρους χρήσης</a></label>
<!-- το "trial" δίνει το δωρεάν χρονομετρημένο session· δεν χρειάζεται username -->
<input type="submit" name="" value="Connect">
</form>
<!-- Το MikroTik αντικαθιστά τα macros $(...) server-side πριν σερβίρει τη σελίδα -->
Ο επισκέπτης δεν είναι ακόμα online όταν βλέπει αυτή τη σελίδα, οπότε κάθε asset που αναφέρει πρέπει να είναι στον router: το λογότυπο, το CSS, οι γραμματοσειρές, οποιαδήποτε εικόνα. Σύνδεσε μια Google Font ή ένα λογότυπο CDN και εμφανίζεται σπασμένη, γιατί ο επισκέπτης δεν μπορεί να φτάσει το internet μέχρι αφού κάνει submit. Βάλε logo.png και ένα μικρό style.css στον ίδιο φάκελο hotspot/ και αναφέρσου σε αυτά σχετικά. Αυτός είναι ο πιο συχνός λόγος που ένα «custom portal» φαίνεται σπασμένο στο τηλέφωνο του επισκέπτη.
03
Όταν το «δωρεάν για όλους» δεν είναι το μοντέλο — πληρωμένο Wi-Fi, κωδικοί ανά δωμάτιο, κωδικός τυπωμένος στην απόδειξη check-out — χρειάζεσαι vouchers. Το User Manager είναι ο built-in RADIUS server του MikroTik που τα παράγει και τα παρακολουθεί.
# Το RouterOS 7 έρχεται με User Manager v5 ως πακέτο — ενεργοποίησέ το μία φορά. [admin@GW] > /user-manager set enabled=yes # Κατέγραψε τον ίδιο τον router ως RADIUS client του δικού του User Manager [admin@GW] > /user-manager router add name=local address=127.0.0.1 shared-secret=hotspot-secret # Πες στο hotspot να κάνει authenticate έναντι RADIUS αντί για τοπικούς χρήστες [admin@GW] > /ip hotspot profile set [find name=hsprof1] use-radius=yes [admin@GW] > /radius add service=hotspot address=127.0.0.1 secret=hotspot-secret # Ένα profile που διαμορφώνει κάθε χρήστη voucher, μετά μια παρτίδα 50 κωδικών [admin@GW] > /user-manager profile add name=guest-1day validity=1d [admin@GW] > /user-manager user create-and-activate-profile=guest-1day \ count=50 name-length=6 shared-users=1 # Τύπωσε την παρτίδα για να τη δώσεις στη ρεσεψιόν: [admin@GW] > /user-manager user print where profile=guest-1day # NAME PASSWORD PROFILE 0 a7f3k9 a7f3k9 guest-1day 1 m2x8qp m2x8qp guest-1day …
Ένας συχνός panic: «έφτιαξα 50 μονοήμερους κωδικούς τον περασμένο μήνα, έχουν λήξει όλοι;» Όχι — με το User Manager v5, η αντίστροφη μέτρηση validity ενός voucher ξεκινά τη στιγμή που χρησιμοποιείται πρώτη φορά, όχι όταν παράγεται. Οπότε μια στοίβα αχρησιμοποίητων κωδικών στη ρεσεψιόν παραμένει καλή επ' αόριστον· μόνο οι δοσμένοι ξεκινούν το ρολόι. Επιβεβαίωσε τη σκοπούμενη συμπεριφορά με έναν δοκιμαστικό κωδικό πριν από ένα φορτωμένο σαββατοκύριακο — η διαφορά ανάμεσα σε «validity» και «session-timeout» ρίχνει τον κόσμο την πρώτη φορά, και το να την κάνεις λάθος σημαίνει είτε κωδικούς που πεθαίνουν στο ράφι είτε κωδικούς που δεν λήγουν ποτέ.
04
Κάποια κίνηση πρέπει να περάσει πριν το login: τα ίδια assets του portal, ένας πάροχος πληρωμών αν πουλάς πρόσβαση, URLs ανίχνευσης captive-portal ώστε τα τηλέφωνα να ανοίγουν αυτόματα τη σελίδα. Αυτή η allow-list είναι το walled garden.
# Payment gateway (αν οι επισκέπτες πληρώνουν με κάρτα για πρόσβαση) [admin@GW] > /ip hotspot walled-garden add dst-host=*.stripe.com action=allow # Endpoints ανίχνευσης captive-portal — ώστε iOS/Android να ανοίγουν αξιόπιστα αυτόματα # το φύλλο login αντί να αποφασίζουν σιωπηλά «no internet» [admin@GW] > /ip hotspot walled-garden add dst-host=captive.apple.com action=allow [admin@GW] > /ip hotspot walled-garden add dst-host=connectivitycheck.gstatic.com action=allow [admin@GW] > /ip hotspot walled-garden add dst-host=www.msftconnecttest.com action=allow # Για ακατέργαστα IP / μη-HTTP, χρησιμοποίησε αντ' αυτού το IP walled garden [admin@GW] > /ip hotspot walled-garden ip add dst-address=1.1.1.1 action=accept
Κάθε εγγραφή walled-garden είναι δωρεάν, χωρίς authentication internet για όποιον είναι σε εμβέλεια Wi-Fi — οπότε κράτησέ το σε URLs ανίχνευσης και (αν χρησιμοποιείται) τον host πληρωμών. Έχουμε κάνει audit hotspots «δωρεάν Wi-Fi» των οποίων το walled garden είχε μεγαλώσει να περιλαμβάνει social media και streaming «ώστε οι επισκέπτες να μπορούν να δουν» — που είναι απλώς ανοιχτό Wi-Fi με επιπλέον βήματα, και σε μια γραμμή με μέτρηση ή cap, ένας λογαριασμός. Ο κήπος είναι σύντομη λίστα· αν είναι μακρύς, κάτι δεν πάει καλά με το μοντέλο.
05
Το hotspot έχει το δικό του rate-limit που συνθέτει με — και πρέπει να υποχωρεί στη — δικαιοσύνη PCQ από το post του QoS. Βάλε εδώ ένα cap ανά session· άφησε το PCQ να μοιράσει το pool.
# rate-limit στο profile χρήστη: rx/tx από την οπτική του ΕΠΙΣΚΕΠΤΗ. # 10M down / 5M up ανά συσκευή είναι αρκετό για έναν επισκέπτη ξενοδοχείου. [admin@GW] > /ip hotspot user profile set [find name=default] rate-limit=5M/10M # Το advanced syntax του rate-limit υποστηρίζει επίσης burst — γενναιόδωρο για μερικά # δευτερόλεπτα (γρήγορη φόρτωση σελίδων) μετά κατεβαίνει στο σταθερό cap: # rate-limit=5M/10M 8M/16M 6M/12M 8 8 8 (rx/tx burst threshold time) # Μετά άφησε το PCQ (από το post του QoS) να μοιράσει δίκαια το συνολικό pool επισκεπτών # πάνω από το cap ανά συσκευή — τα δύο επίπεδα στοιβάζονται: [admin@GW] > /queue simple add name=guest-pool target=10.10.20.0/24 \ max-limit=300M/300M queue=pcq-up/pcq-down
Η ίδια παγίδα με το post του firewall: αν ένας κανόνας FastTrack ταιριάζει κίνηση επισκεπτών, η διαμόρφωση του hotspot (και οι ουρές PCQ σου) δεν βλέπουν ποτέ τα πακέτα, και κάθε «όριο» σιωπηλά δεν κάνει τίποτα. Σε ένα box που τρέχει hotspot επισκεπτών, περιόρισε το FastTrack να εξαιρεί το subnet επισκεπτών, ή μην κάνεις καθόλου FastTrack. Σύμπτωμα: βάζεις 10M ανά επισκέπτη, ένας επισκέπτης τραβάει 400M, και οι μετρητές ουράς δείχνουν μηδέν. Τα πακέτα περνάνε fast-pathed γύρω από τον shaper.
06
Τα captive portals σχεδιάστηκαν για έναν web κόσμο plaintext-HTTP. Ο μοντέρνος all-HTTPS web σπάει το κλασικό κόλπο «ανακατεύθυνε οποιαδήποτε σελίδα» — να τι πραγματικά συμβαίνει στο τηλέφωνο ενός επισκέπτη, και πώς να το κάνεις ομαλό.
Ένα hotspot δουλεύει παρεμβαίνοντας σε ένα αίτημα HTTP και απαντώντας με ανακατεύθυνση. Αλλά οι browsers τώρα κάνουν default σε HTTPS, και ο router δεν μπορεί να παρέμβει διάφανα σε αίτημα HTTPS — το να το κάνει θα ήταν σφάλμα πιστοποιητικού, που είναι ακριβώς αυτό που υπάρχει το HTTPS για να αποτρέψει. Οπότε αν η πρώτη ενέργεια ενός επισκέπτη είναι να ανοίξει https://…, παίρνει αποτυχία σύνδεσης, όχι το portal σου.
Αυτό που σε σώζει είναι το captive-portal detection: κάθε μοντέρνο τηλέφωνο, μόλις μπει στο Wi-Fi, τραβάει ήσυχα ένα γνωστό plaintext URL (το captive.apple.com της Apple, το connectivitycheck.gstatic.com του Android). Αν πάρει την ανακατεύθυνσή σου αντί για την αναμενόμενη απάντηση, ανοίγει αυτόματα το φύλλο login. Οπότε η διόρθωση δεν είναι να παλέψεις με το HTTPS — είναι να βεβαιωθείς ότι εκείνα τα URLs ανίχνευσης χειρίζονται και δεν επιτρέπονται κατά λάθος μέσα από το walled garden (επίτρεψέ τα προς το portal, μην τα αφήσεις να το παρακάμψουν).
| Συμπτωμα στο πεδιο | Αιτια & διορθωση |
|---|---|
| «No internet» αλλά καμία σελίδα login | URL ανίχνευσης μπλοκαρισμένο ή λάθος χειρισμένο — βεβαιώσου ότι το walled garden επιτρέπει τους hosts ανίχνευσης προς το portal, όχι γύρω του. |
| Η σελίδα login φορτώνει σπασμένη / χωρίς λογότυπο | Assets του portal αναφερόμενα από CDN — βάλε logo/CSS στον router (section 02). |
| Ο επισκέπτης ξανααποδέχεται σε κάθε reconnect | Ενεργοποίησε login-by=cookie ώστε το MAC της συσκευής να θυμάται για το session (section 02). |
| Το portal πετάει προειδοποίηση cert | Ενεργοποίησες login HTTPS χωρίς cert του οποίου το CN ταιριάζει με το dns name. Είτε χρησιμοποίησε plain HTTP για το portal (εντάξει σε απομονωμένο VLAN επισκεπτών) είτε εγκατέστησε ταιριαστό cert. |
| Κάποιες συσκευές δεν βλέπουν ποτέ το portal | Άνοιξαν πρώτα μια σελίδα HTTPS και την έκαναν cache. Κλείσε/άνοιξε το Wi-Fi, ή άνοιξε http://neverssl.com — το κόλπο της ρεσεψιόν. |
Για τα περισσότερα μικρά ακίνητα: ένα portal accept-and-connect σε plain HTTP (το VLAN επισκεπτών είναι ήδη απομονωμένο, οπότε δεν υπάρχει credential να κλαπεί), login cookie ώστε οι επιστρέφοντες επισκέπτες να παρακάμπτουν τη σελίδα, ένα walled garden δύο γραμμών, και ένα cap ανά επισκέπτη κάτω από PCQ. Vouchers μόνο όπου ο ιδιοκτήτης θέλει πληρωμένη ή ανά-δωμάτιο πρόσβαση. Κρατάμε το HTML του portal στο backup config ώστε ένα reflash να επαναφέρει και το branding — το λογότυπο σε εκείνη τη σελίδα είναι συχνά το μόνο πράγμα που ελέγχει προσωπικά ο ιδιοκτήτης αφού παραδώσουμε.
07
Το αντίστοιχο της Cisco ζει στον wireless controller, όχι στον router — αξίζει να το ξέρεις αν ένα site είναι μεικτό.
| MikroTik / RouterOS | Cisco |
|---|---|
| /ip hotspot (built into the router) | WLC guest anchor + web-auth policy (στον controller) |
| Επεξεργάσιμο login.html στο flash | Custom web-auth bundle uploaded στο WLC |
| User Manager vouchers | ISE guest sponsor portal / τοπικοί λογαριασμοί web-auth |
| Walled garden | Pre-auth ACL στο WLAN επισκεπτών |
| use-radius=yes → User Manager | RADIUS προς ISE / NAC |
| rate-limit στο profile χρήστη | QoS profile / rate limit ανά WLAN |
Βασικα Συμπερασματα
/ip hotspot setup χτίζει όλο το stack πάνω σε ένα interface επισκεπτών.Χτίζω captive portals με το branding σου, όποια ροή όρων ή voucher χρειάζεσαι, κρατημένα πλήρως απομονωμένα από το πραγματικό σου δίκτυο, και ρυθμισμένα να μένουν δίκαια ακόμα και όταν το ακίνητο είναι πλήρως γεμάτο — τεσταρισμένα σε πραγματικό τηλέφωνο, όχι μόνο σε ένα laptop στον πάγκο.
Κλεισε μια Discovery Call →