Нещодавно я писав про те, як зробити крім приватної ще й гостьову Wi-Fi мережу (Hotspot) для сусідів чи клієнтів.
Система працює добре, але бракує інтерактивності, "зворотнього зв’язку":
-
хочеться щоб клієнт явно знав про те хто надає йому інтернет
-
добре щоб можна було прорекламувати свої послуги, веб-сайт
-
бажано мати інформацію про те як багато людей користуються інтернетом, коли саме, з яких пристроїв
Існують спеціальні системи, які ще називають "Captive Portal". Це технологія що показує клієнту спеціальну веб-сторінку, перед тим як розпочати повноцінну роботу з інтернетом. Часто такі системи мають функції біллінгу, щоб пускати в інтернет по персональному паролю (який видається при поселенні в готель, чи при купівлі товару), чи надавати доступ лише на певний час тощо.
Captive-потрали, як правило, вимагають спеціального програмного забезпечення, яке встановлене в локальній (власна система) чи глобальній мережі (орендована). Деякі виробники випускають точки доступу Wi-Fi які мають відповідні біллінгові програми вже вбудованими в прошивку, тому можна обійтися без додаткових комп’ютерів.
В моєму випадку інтернет мав бути безкоштовний та для усіх (відвідувачів бару). Тому я реалізовував відносно просту систему, тз. зв. вітальну сторінку (Splash page), коли при першому вході на якийсь сайт клієнту показується веб-сторінка з інформацією про те, хто надає інтернет, кнопка "Увімкнути Інтернет" і "Відвідати сайт закладу", витяг з меню бару.
Деколи, на таких сторінках розташовують попередження про відповідальність за використання інтернету чи просять погодитися з певними умовами (не спамити, не вірусити, не матюкатись тощо).
Функція "Splash page" зустрічається в багатьох прошивках DD-WRT, що дозволяє використовувати з цією метою дешеві "побутові" роутери. В термінології DD-WRT це називається NoCatSplash.
Коротко, як працює
-
Клієнт конектиться по Wi-Fi до точки доступу.
-
При першому зверненні до якогось сайту клієнт бачить не його а спеціальну сторінку, на якій потрібно натиснути кнопку.
-
Після натиснення кнопки для конкретно цього клієнта активовується інтернет (можливо на певний час), веб-оглядач переадресовує клієнта на сторінку що пробував відкривати клієнт, або на сторінку що вказав адміністратор точки доступу.
-
Паралельно ведеться статистика звернень та "включень" за допомогою "Google Аналітики".
Передумови
Роутер, що підтримує прошивку DD-WRT. Версія DD-WRT, що підтримує функцію "Splash page" (краще взнати про це на офіційному сайті проекту, на форумі чи в описах прошивки до конкретного роутера).
Вітальна сторінка, що відображається клієнту може розташовуватись в самому роутері, або завантажуватись з віддаленої адреси в інтернеті.
Якщо розташовувати сторінку безпосередньо в роутері, потрібно щоб він мав трохи вільної пам’яті та підтримував JFFS (доступна для запису внутрішня пам’ять чи USB-флешка) чи CIFS (Samba, Windows-диск).
Я підтягував сторінку з віддаленого сайту. Так було легше її редагувати та відлагоджувати. В цьому випадку, можливо і не потрібно внутрішньої пам’яті. На жаль, я не перевіряв. Мій роутер, Asus RT-N16, мав внутрішню пам’ять, хоч я її напряму і не використовував.
Налаштування NoCatSplash
Підготуйте внутрішню пам’ять (JFFS або CIFS). Якщо роутер має вільну пам’ять то CIFS включається у Administration -> Management -> JFFS2 Support****:
Зайдіть на роутер через telnet чи SSH та:
mkdir /jffs/nocat
cd /jffs/nocat
cp -R /www/* /jffs/nocat/
Це створить файл /jffs/nocat/splash.html що міститиме "стандартну" вітальну сторінку. Якщо використовуватиме сторінку безпосередньо з роутера то редагувати треба саме її.
Я, повторюся, брав сторінку що створена на віддаленому веб-сайті (про це — пізніше) і роутер "підтягує" її переодично та кудись собі зберігає. Файл splash.html при цьому залишається стандартним. Така поведінка залишилась для мене за́гадкою.
Services -> Hotspot. NoCatSplash -> Enable.
Параметри:
[NoCatSplash] "Enable" щоб включити
[Gateway IP Addr] Локальна IP-адреса роутера
[GatewayName] Просто назва сторінки (закладу тощо)
[Interface] Інтерфейс на якому працюють клієнти. залиште стандартним. змінюйте лише якщо система явно не працює.
[Home Page] Сторінка, на яку переадресовувати клієнтів після включення інтернету. Це не сторінка-вітання, це адреса сайту який примусово показувати клієнтам (функція вмикається окремо).
[Homepage Redirection] Примусова переадресація клієнта на нашу домашню сторінку (замість тої, що хотів клієнт), після включення інтернету.
[Allowed Web Hosts] Перелік адрес, доступ до яких відкрито завжди. без жодних "http://". Це DNS-імена які будуть дозволені в фаєрволі. Тут повинна бути домашня сторінка, вітальна сторінка (якщо вона зовнішня) та, наприклад сервери Google аналітики, якщо ми хочемо щоб доступ до них був можливий ще до "включення клієнта". В даному випадку це:
example.com www.google-analytics.com google-analytics.com ssl.google-analytics.com
[Document Root] Шлях до вітальної сторінки в локальній системі. Для зовнішніх джерел воно ніби не використовується.
[Splash URL] Адреса зовнішнього сайту з вітальною сторінкою. система періодично завантажує її в якийсь локальний файл.
[Exclude Ports] Заблоковані порти TCP(UDP?). Наприклад порт 25 блокуватиме розсилку пошти (спаму).
[MAC White List] Перелік MAC-адрес, для яких доступ повинен бути відкритий завжди (адміністратори, працівники закладу тощо).
[Login Timeout] Час, на який відкривати інтернет користувачеві. Потім — знову показується вітальна сторінка.
[Verbosity] Рівень для логування подій. корисно лише для відлагодження. Події заносяться в системний лог роутера. /tmp/nocat.log, при цьогому завжди порожній (теж за́гадка).
[Route Only] Залиште Disabled. Це стандартний режим роботи роутера.
Вітальна сторінка
Отже, як вже і було сказано декілька разів, вітальна сторінка може лежати локально, а може розташовуватися віддалено.
У будь-якому випадку це проста HTML-сторінка з HTML-формою, що містить певні змінні.
Оформіть сторінку як завгодно, головне щоб вона містила таку форму:
<form method="POST" action="$action">
<input type="hidden" name="mode_login">
<input type="hidden" name="redirect" value="$redirect">
<input type="hidden" name="accept_terms" value="yes">
<input type="submit" value="Погоджуюся з усіма умовами">
</form>
Усі змінні роутер заповнить сам.
Я зробив дві форми та додаткову інформацію.
В загальному, вийшло щось таке (сторінку оптимізовано під мобілки):
Відслідковування статистики
В сторінку просто вставлено код Google Аналітики. Але щоб бачити не лише спроби (оновлення сторінки), але й конкретно включення інтернету, до кнопки прив’язано подію, що реєструє дані в аналітиці:
<input type="submit" onClick="_gaq.push(['_trackEvent', 'Wi-Fi Client', 'Activation', '']);" value="Погоджуюся з усіма умовами">
Детальніше про фіксування подій читайте у довідці Google Аналітики.
В результаті маємо таку статистику:
Як саме вмикали (чи відвідували сторінку закладу):
Яким пристроєм користувались:
!GA[](/images/old-wp/2012/08/Google-Analytics-2.png)
Та інше...
Проблеми та їх діагностика
На халяву і оцет солодкий, тому треба бути готовим до проблем. В загальному все працює нормально. Але для розуміння системи прийшлося трохи подосліджувати. ;)
Рідко, але траплялося що на сторінці статусу DD-WRT видно Wi-Fi-клієнтів, хоча статистика Google Аналітики показує що подій не відбувалося.
Виявляється система переставала працювати. Благо що в такому випадку клієнти просто отримують доступ до інтернету, тобто ситуація не дуже критична.
Про вся випадок я налаштував автоматичне перевантаження роутера щоночі. Читав, що люди пишуть скрипти що перезапускають NocatSplash, якщо той працює неправильно.
Перевірити роботу системи можна так:
Чи запущено сам процес splashd
root@DD-WRT:~# ps | grep splashd
2610 root 1304 S splashd
Чи створюється файл з переліком активних клієнтів /tmp/nocat.leases
root@DD-WRT:/# ls -l /tmp/nocat.leases
-rw------- 1 root root 248 Aug 31 11:08 /tmp/nocat.leases
До речі, якщо обнулити цей файл то система "забуде" усіх клієнтів що вмикали собі Інтернет.
І, найважливіше — чи створились відповідні правила фаєрволу iptables
root@DD-WRT:/# iptables -nL
...
Chain NoCat (1 references)
target prot opt source destination
NoCat_Upload 0 -- 0.0.0.0/0 0.0.0.0/0
NoCat_Download 0 -- 0.0.0.0/0 0.0.0.0/0
NoCat_Ports 0 -- 0.0.0.0/0 0.0.0.0/0
NoCat_Inbound 0 -- 0.0.0.0/0 0.0.0.0/0
lan2wan 0 -- 192.168.2.0/24 0.0.0.0/0 MARK match 0x1
ACCEPT 0 -- 192.168.2.0/24 0.0.0.0/0 MARK match 0x1
lan2wan 0 -- 192.168.2.0/24 0.0.0.0/0 MARK match 0x2
ACCEPT 0 -- 192.168.2.0/24 0.0.0.0/0 MARK match 0x2
lan2wan 0 -- 192.168.2.0/24 0.0.0.0/0 MARK match 0x3
ACCEPT 0 -- 192.168.2.0/24 0.0.0.0/0 MARK match 0x3
ACCEPT tcp -- 192.168.2.0/24 192.168.0.1 tcp dpt:80
ACCEPT tcp -- 192.168.2.0/24 192.168.0.1 tcp dpt:443
ACCEPT tcp -- 192.168.2.0/24 176.9.192.1 tcp dpt:80
ACCEPT tcp -- 192.168.2.0/24 176.9.192.1 tcp dpt:443
ACCEPT tcp -- 192.168.2.0/24 173.194.39.135 tcp dpt:80
...
Активних клієнтів буде видно за рядками
...
Chain NoCat_Download (1 references)
target prot opt source destination
RETURN 0 -- 0.0.0.0/0 192.168.2.68
RETURN 0 -- 0.0.0.0/0 192.168.2.186
Chain NoCat_Inbound (1 references)
target prot opt source destination
ACCEPT 0 -- 0.0.0.0/0 192.168.2.68 state RELATED,ESTABLISHED
ACCEPT 0 -- 0.0.0.0/0 192.168.2.186 state RELATED,ESTABLISHED
...
Також, можна увімкнути системний лог роутера, куди NocatSplash зливає свій стан
root@DD-WRT:/# tail -f /tmp/var/log/messages
...
Aug 31 11:08:20 DD-WRT daemon.notice NoCat[2610]: accept_peer: adding 192.168.2.68
...
Параметр [Verbosity] на сторінці налаштувань NoCatSplash задає рівень логування. Високий рівень показує навіть спроби стягнути віддалену вітальну сторінку та процес переадресації клієнта.
За моїми спостереженнями система працює стабільно, але деколи, при запущеному демоні, зникали правила фаєрволу. Тому раджу звертати увагу, в першу чергу, саме на них.
Епілог
Такі системи мають право на життя, завдяки фінансовій дешевизні рішення. Використання недорогих роутерів та безкоштовних прошивок є значною перевагою.
Проте, це вимагає певної маханини і результат не завжди прогнозований, бо сильно залежить від версій прошивок та моделей роутера (десь внутрішня пам’ять є, десь нема; трапляються прошивки з глючною функцією NoCatSplash).
Деякі виробники пропонують вже готові рішення, які не надто дорожчі або рівні за ціною, наприклад той самий Unifi від Ubiquiti (сам не пробував).
Лірика
Планував написати коротеньку статтю. Затягнулося на два дні, з "простирадлом" тексту.
Ставлячи себе на місце читача намагаюся пояснювати деякі ньюанси, які можуть бути не всім відомі чи зрозумілі.
Можливо краще коротко зосередитись на технічній стороні, орієнтуючись на "підготовлених" людей?
Кому не важко, скажіть як краще читати саме Вам. ;)