АНДРЕЙ ПЛАТОНОВ
HOTSPOT – это просто!
(на правах рекламы)
С ростом популярности беспроводных сетей 802.11 a/b/g, объединённых общим названием Wi-Fi, всё быстрее развивается новое направление на рынке организации услуг доступа в Интернет – создание публичных зон доступа, или HOTSPOT. HOTSPOT – это место, где имеется доступ к беспроводной сети. И если с беспроводной составляющей HOTSPOT (имеются в виду точки доступа) всё более-менее понятно, то со средствами учёта и контроля пользователей по-прежнему возникают затруднения. Для разрешения этой проблемы многие производители сетевого оборудования приступили к выпуску специализированного оборудования для формирующегося рынка услуг. Не стала исключением и компания D-Link, представив шлюз для создания зон коллективного доступа в Интернет DSA-3100 и чек-принтер DSA-3100P.
Итак, какие же функции должна выполнять система, на которой базируется HOTSPOT?
- Быстрое добавление пользователя в систему.
- Аутентификация пользователя.
- Подсчет трафика или времени, проведенного в сети.
- Автоматическое отключение пользователя при достижении лимита трафика или времени.
Безусловно, эти функции можно реализовать даже на маломощной машине под управлением *nix. Однако D-Link обещает нам решение этих задач при помощи простого в настройке шлюза, который сможет настроить даже среднестатистический пользователь. Кроме того, шлюз будет интересен и более подготовленным пользователям, т.к. на его основе возможно построение полноценной биллинговой системы.
Устройство имеет три порта Ethernet:
- WAN-порт – для подключения к сети Интернет.
- LАN-порт (частная сеть) – подключаются клиенты, для которых не требуется аутентификация (например, локальная сеть кафе, в котором организован HOTSPOT).
- Authentication-порт – к этому порту подключается сеть, клиенты которой будут проходить аутентификацию перед выходом в Интернет.
На базе шлюза можно создать несколько типов хотспотов. Во-первых, это простейший случай – отдельно стоящий хотспот, в котором есть оператор. Такой хотспот организовывается довольно легко: нужна минимальная настройка шлюза, с которой справится любой человек, имеющий базовые знания по IP-сетям. Все настройки осуществляются через встроенный веб-интерфейс. Оператор хотспота (человек, пробивающий чеки на тикет-принтере) также не будет загружен сложной работой. Добавление нового пользователя происходит очень просто: в меню вводится количество предоплаченных клиентом часов и нажимается кнопка «Print» на чек-принтере. В распечатанной карточке доступа (которая, правда, больше похожа на чек) находится вся необходимая для подключения к сети информация: ключ WEP-шифрования, логин и пароль для авторизации. При первой попытке пользователя обратиться к ресурсам Интернета он перенаправляется на веб-страницу авторизации. Обмен авторизационной информацией происходит по протоколу HTTPS, что повышает безопасность системы. На случай, если браузер клиента не поддерживает защищённое SSL-соединение (что бывает крайне редко), предусмотрена возможность использования открытого HTTP. Методика авторизации пользователей, построенная на базе Web, избавляет менеджера HOTSPOT от хлопот по установке и настройке на машинах пользователей дополнительного клиентского ПО, управляющего авторизацией.
К вышеописанному виду относится большинство HOTSPOT, которые создаются в аэропортах, на вокзалах, в выставочных комплексах и гостиницах. В них по обыкновению используется тарификация по времени на условиях предоплаты. Шлюз D-Link DSA-3100 в паре с принтером DSA-3100P идеально подходят для решения подобных задач – HOTSPOT может быть развернут всего за несколько часов (в зависимости от масштабов) даже силами приходящего админа или просто продвинутого пользователя.
Кроме простейших случаев, существуют более сложные варианты – например, когда мы имеем не один, а целую сеть HOTSPOT, причём необязательно в каждом из них есть оператор, принимающий платежи. Возможен, например, такой вариант: клиент активирует карточки предоплаты (скретч-карты) для зачисления денег на свой электронный счёт. В этом случае шлюз DSA-3100 становится большой важной шестерёнкой под названием NAS (Network Access Server) в сложном механизме биллинговой системы. Аутентификация/Авторизация/Аккаунтинг (ААА) при этом проводятся через RADIUS-сервер.
Ещё одним важным свойством такой системы является то, что для того, чтобы она стала полноценным биллингом, её, скорее всего, придётся немного доработать, что могут осуществить только самые упорные и опытные. Но не боги горшки обжигают!
RADIUS расшифровывается как Remote Authentication Dial In User Service. Изначально данный протокол был создан для обслуживания больших модемных пулов, но реализация получилась настолько удачной, что сейчас он часто используется не только для DialUP, но и для IP-телефонии, организации доступа в VPN-сети.
Итак, раз заголовок нашей статьи «HOTSPOT – это просто!», мы рассмотрим самый простой вариант из всех возможных сложных вариантов и набросаем в общих чертах хотспотный биллинг, который и есть самое главное в хотспоте. Средством сбора статистики будут шлюзы DSA-3100. Несмотря на взрывной рост популярности Linux-систем, наиболее распространенной и знакомой для большинства остается Windows. Поэтому мы рассматриваем RADIUS- сервер именно на его основе. Безусловно, для опытного юниксоида не будет проблемой связать DSA-3100, например, с freeradius, одним из важнейших достоинств которого является его бесплатность.
Для эксперимента мы использовали компьютер под управлением Win2k Server и WinRadius 2.11 (http://www.it consult2000.com), как и большинство программ под Windows, WinRadius небесплатен, однако эту проблему можно решить тем или иным способом (например, купить ее).
Теперь более подробно о том, как будет выглядеть наша учётно-биллинговая система и как она будет работать. Предположим, у нас есть некоторая опорная сеть, к которой через DSA-3100 подключены все наши хотспоты. Шлюз каждого хотспота настроен на работу с RADIUS, который в свою очередь взаимодействует с базой данных (в нашем случае это будет msAcsess – как самый простейший вариант), в которой хранятся учётные записи пользователей и в которую будет складываться статистика.
Итак, проделаем следующее:
- поставим WinRadius;
- настроим WinRadius на взаимодействие с DSA-3100 и БД MSAccess;
- создадим пользователя на сервере RADIUS;
- аутентифицируемся и посчитаем трафик (посмотрим, как это всё записалось в БД);
- сделаем маленький веб-интерфейс к биллинговой системе, реализующий некоторый функционал.
Настройка WinRadius
Настраиваем драйвер базы данных ODBC
Это требуется для работы нашего RADIUS с БД MSAccess (файл базы данных есть в дистрибутиве WinRadius – WinRadius.mdb). ODBC – это аббревиатура от Open DataBase Connectivity (примерный перевод – открытая система связи с базами данных) – некий универсальный интерфейс к различным базам данных. Что-то вроде прослойки между пользовательскими приложениями и базами данных, которая позволяет скрыть особенности той или иной БД и унифицировать свойства всех источников данных.
- В поле «Data Source Name» вписываем «WinRadius».
- В поле «Description» пишем что хотим.
- Нажимаем «Select», ищем директорию, в которой установлен WinRadius, и находим там файл WinRadius.mdb.
- Нажимаем «OK».
Настраиваем DSA-3100 на работу с сервером RADIUS
Создаём 5 пользователей (больше, к сожалению, нельзя, демоверсия WinRadius не позволяет), всем назначаем аккаунтинг на базе использованного трафика. Затем пробуем аутентифицироваться: на компьютере, который подключён к Authentification-порту DSA-3100, набираем какой-либо URL, шлюз перехватывает http-запрос и выдаёт нам форму для аутентификации (всё, разумеется, под защитой SSL). Процесс аутентификации и завершение пользовательской сессии отображается в окне WinRadius. Все данные, которыми оперирует WinRadius, хранятся в базе данных (данные – это пользовательские аккаунты и логи).
Откроем в MsAcсess файл WinRadius.mdb и посмотрим, как выглядит база данных нашего RADIUS – а выглядит она довольно просто. Видим в ней несколько таблиц.
Таблица tbLogs (в ней записались все данные об объеме трафика, который прокачали 5 тестовых пользователей).
Таблица tbUsers (в которой мы видим созданных пользователей).
Итак, вроде бы всё очень хорошо: пользователи аутентифицируются, и трафик считается. Единая база данных позволяет осуществлять роуминг между HOTSPOT, разбросанными по всему городу. Между точками доступа внутри хотспотов также осуществляется роуминг при помощи протокола IAPP (Inter Access Point Protocol). Однако чего-то всё-таки не хватает. А не хватает следующего: возможности пользователям просматривать текущее состояние своего счёта, возможности пополнять счёт (чтобы это мог делать сам пользователь или администратор/оператор системы). Кроме того, не помешает наличие возможности удобного администрирования системы, в которой, например, будет несколько NAS-серверов DSA-3100 (сеть хотспотов или интернет-кафе), т.е. количество пользователей будет довольно приличным.
Как же всё это реализовать? Ответ напрашивается сам собой: нужно сделать пользовательский и администраторский веб-интерфейс, который будет брать/класть данные в нашу базу данных. Пусть всё это работает на веб-сервере, работающем на том же компьютере, на котором работает RADIUS. Веб-сервер мы поместим в зону, свободную для просмотра (DSA-3100 позволяет это сделать), чтобы даже пользователи с нулевым и отрицательным балансом могли зайти на страницу статистики/пополнения счёта.
Выбираем веб-сервер: компьютер у нас под Win2k Server, значит, скорее всего, будем использовать Apache для Windows или IIS (Internet Information Services). Если выберем Apache, то будем писать веб-страницы со скриптами на PHP (Perl и т. д. и т. п.). Если же выберем IIS, тогда будем использовать технологию ASP (Active Server Pages). Веб-страницы со скриптами в этом случае будем писать на VBS (Visual Basic Script – этот язык очень похож на бейсик, который все мы изучали в школе) или на JavaScrip. Есть, конечно, ещё много различных вариантов, на чём писать и что использовать, я перечислил то, что лежит на поверхности. Остановимся, пожалуй, на IIS с ASP и VBS – вариант наиболее простой для понимания и освоения. Весь перечисленный функционал реализовывать не будем, но кое-что всё-таки покажем для примера.
Создаём сайт на веб-сервере IIS
- Control Panel –> Administrative Tools –> Internet Services Manager (оснастка, управляющая IIS).
- Правой мышкой по компьютеру –> New –> Web Site –> запустился мастер –> пишем название сайта (любое) –> назначаем ему IP-адрес –> указываем папку, которая будет домашним каталогом сайта (туда будем складывать веб-странички со скриптами) –> ничего не трогаем, жмём «Next» –> «Finish». Сайт готов, он появился в левой половине оснастки.
Скрипт №1
Для начала сделаем страницу со скриптом, который просто обращается к нашей БД и полностью извлекает оттуда содержимое таблицы tbLogs. Делать можно в чём угодно, в том числе и в блокноте (номера строк писать не надо – это для удобства комментирования). Файл назовём bd.asp; сохраним его в домашний каталог сайта.
bd.asp
1 <html>
2 <head>
3 <title>tbLogs</title>
4 </head>
5 <body bgcolor="#FFFFFF" text="#000000">
6 ------ Таблица <b>tbLogs</b> ------- <br><br>
7
8 <% set MyConnection = Server.CreateObject("ADODB.Connection")
9
10 MyConnection.Open "Driver={Microsoft Access Driver (*.mdb)};" & _
11 "DBQ=WinRadius.mdb;" & _
12 "DefaultDir=C:\(radius)\WinRadius;" & _
13 "Uid=Admin;Pwd=;"
14
15 set rsLogs=MyConnection.Execute ("SELECT * FROM tbLogs")
16
17 response.write "<table width=90% border=1 cellspacing=0 align=center><tr><td><b>happen</b></td>"
18 response.write "<td><b>username</b></td><td><b>duration</b>"
19 response.write "</td><td><b>input</b></td><td><b>output </b></td><td>"
20 response.write "<b>fee</b></td></tr>"
21
22 do while not rsLogs.EOF
23 response. write "<tr>"
24 response.write "<td>" & rsLogs("happen") & "</td><td>" & rsLogs ("username") & "</td><td>" & rsLogs("duration")
25 response.write "</td><td>" & rsLogs ("input") & "</td><td>" & rsLogs ("output") & "</td><td>" & rsLogs ("fee") & "</td>"
26 response. write "</tr>"
27 rsLogs.movenext
28 loop
29
30 response.write "</tr></table>"
31 rsLogs.Close
32 rsLogs = null %>
33 </body>
34 </html>
Разбор bd.asp:
- Строки 1-6: здесь всё понятно – простой HTML.
- Строка 8: значок «<%» открывает скрипт. При помощи метода CreateObject объекта Server создаётся соединение ADO – MyConnection (которое в свою очередь тоже является обьектом и имеет набор свойств и методов).
- Строки 10-13: при помощи метода OPEN объекта MyConnection открывается соединение с базой данных RADIUS. В строке соединения (строки 11-13) задаются параметры соединения с БД (по порядку): драйвер, имя файла БД, директория с файлом БД (не забудьте вписать туда директорию, в которой лежит WinRadius.mdb), имя, пароль (пароль не задан и это, конечно же, надо тоже исправить).
- Строка 15: при помощи метода Execute объекта My Connection выполняем SQL-запрос и ответ помещаем в переменную rsLogs (которая является набором записей, содержащим результат запроса к БД). Структура этой переменной определяется запросом, т.е. если на выходе будет таблица, то rsLogs будет иметь структуру данной таблицы. Чтобы вывести данные из этой переменной, надо организовать цикл, выполняющийся до тех пор, пока набор записей не будет прочитан, что мы и делаем в последующих строках (22-28).
- Строки 17-21: делаем шапочку для таблицы, в которой будут отображены данные, считанные из БД.
- Строка 22: начало цикла, в котором будем читать и выводить содержимое переменной rsLogs до тех пор, пока её полностью не прочитаем (not rsLogs.EOF).
- Строки 23-26: выводим набор записей из rsLogs в таблицу на печать (т.е. на экран). Делаем это при помощи метода write объекта Response. Если содержимое вывода является HTML, то помещаем его в кавычки; если содержимое вывода какая-либо переменная, то пишем её без кавычек. HTML и переменные можно чередовать в выводе, объединяя их символом «&».
- Строка 27: перемещаемся на следующую строку набора записей, содержащихся в rsLogs.
- Строка 28: идём в начало цикла.
- Строка 30: закрываем теги,которые мы открыли перед циклом вывода данных (22028)
- Строки 31-32: закрываем набор записей rsLogs и скрипт символом «%>».
- Строки 33-34: конец страницы.
Результат обращения к данной странице:
Набираем в браузере: http://IP веб-сайта/bd.asp.
В ответ получаем содержимое таблицы БД, в которую сложились логи с DSA-3100, выступающего в качестве NAS (думаю, что у всех всё заработало).
Скрипт №2
Теперь реализуем функционал, позволяющий пользователю смотреть статистику своих соединений, страницу статистики защитим паролем. Вся обработка обращения пользователя осуществляется одной страницей, в которой будет выполняться та или иная часть скрипта в зависимости от того, что пользователь введёт в поля «логин» и «пароль» (этот метод называется «рекурсивная обработка формы»). Файл назовём bd2.asp, его также сохраним в домашнем каталоге сайта. Логика работы страницы следующая:
- Проверяем, введено ли что-нибудь в поля «логин» и «пароль»:
- если оба поля не заполнены, или не заполнено какое-либо одно поле, то снова выдаём пустую форму (т.е. возвращаемся к пункту 1);
- если оба поля заполнены, то переходим к пункту 2.
- Обращаемся к БД и проверяем правильность логина и пароля:
- если пароль и логин правильные, то выдаём пользователю статистику его соединений;
- если неправильные, выдаём сообщение «Неправильное или несуществующее имя пользователя или пароль!».
bd2.asp
1 <html>
2 <head>
3 <title>tbLogs</title>
4 <META http-equiv=Content-Type content="text/html; charset=windows-1251">
5 </head>
6 <body bgcolor="#FFFFFF" text="#000000">
7 <%
8 Dim sSearchLogin
9 Dim sSearchPassword
10
11 sSearchLogin = Request.Form("login")
12 sSearchPassword = Request.Form("password")
13
14 if sSearchLogin = "" or sSearchPassword = "" Then
15
16 response.write "<div align=center> <table cellpadding=10><tr><td bgcolor=#CC6600> </td></tr></table>"
17 response.write "<p><b><font color=#CC6600>Mega Wi-Fi network billing system </font></b></p><p> </p> <p><br><br>"
18 response.write "--- Сервер статистики --- "
19 response.write "<form name=form method=post action=bd2.asp><table align=center border=1><tr><td ><b>Логин:</b></td><td > "
20 response.write "<input type=text name=login></td></tr><tr><td ><b>Пароль:</b></td><td> "
21 response.write "<input type=password name=password><input type=submit name=Submit value=вход> </td></tr></table></form>"
22 Response.End
23
24 End If
25 %>
26 <%
27 set Connection = Server.CreateObject("ADODB.Connection")
28
29 Connection.Open "Driver={Microsoft Access Driver (*.mdb)};" & _
30 "DBQ=WinRadius.mdb;" & _
31 "DefaultDir=C:\(radius)\WinRadius;" & _
32 "Uid=Admin;Pwd=;"
33
34 strSQL="SELECT password FROM tbUsers WHERE username = " & "'"& sSearchLogin &"'"
35
36 set rsUsers=Connection.Execute (strSQL)
37 pas=""
38 do while not rsUsers.EOF
39 pas=rsUsers("password")
40 rsUsers.movenext
41 loop
42
43 If pas = sSearchPassword then
44
45 strSQL1="SELECT * FROM tbLogs WHERE username = " & "'"& sSearchLogin &"'"
46 set rsLogs1=Connection.Execute (strSQL1)
47
48 response.write "<P align=center>Личная статистика пользователя <b>" & sSearchLogin & "</b></p><br><br>"
49 response.write "<table width=90% border=1 cellspacing=0x align=center><tr><td><b>начало сессии</b></td>"
50 response.write "<td><b>username</b></td><td><b>продолжительность [мин]</b>"
51 response.write "</td><td><b>input [Mb]</b></td><td><b>output[Mb] </b></td><td>"
52 response.write "<b>стоимость [$]</b></td></tr>"
53 do while not rsLogs1.EOF
54 input=input+rsLogs1("input")
55 output=output+rsLogs1("output")
56 duration=duration+rsLogs1("duration")
57 fee=fee+rsLogs1("fee")
58
59 response. write "<tr>"
60 response.write "<td>" & rsLogs1("happen") & "</td><td> " & rsLogs1("username") & "</td><td>" & round((rsLogs1("duration")/60),2)
61 response.write "</td><td>" & Round(((rsLogs1 ("input"))/1024/1024) ,3) & "</td><td>" & Round(((rsLogs1 ("output"))/1024/1024) ,3)
62 response.write "</td><td>" & ((rsLogs1("fee")) /100) & "</td>"
63 rsLogs1.movenext
64 response. write "</tr>"
65 loop
66
67 response.write "</tr></table>"
68 response.write "<br><br><br><P align=center>__________________________________<br>"
69 response.write "суммарный исходящий трафик: <b>" & round((output/1024/1024),3) & "</b> Mb<br><br>"
70 response.write "суммарный входящий трафик: <b>" & round((input/1024/1024),3) & "</b> Mb<br><br>"
71 response.write "суммарная продолжительность сессий: <b>" & round((duration/60/60),2) & "</b> часов <br><br>"
72 response.write "расход за отчётный период: <b>" & (fee/100) & "</b> $ <br>__________________________________________<br></p>"
73 rsLogs1.Close
74 rsLogs1 = null
75 response.end
76
77 End If
78
79 response.write "Неправильное или несуществующее имя пользователя или пароль!"
80 %>
81
82 </body>
83 </html>
Разбор bd2.asp :
- Строки 1-6: здесь всё понятно – простой HTML.
- Строка 7: значок «<%» открывает скрипт.
- Строки 8,9: объявляем переменные, в которые считаем из формы логин и пароль.
- Строки 11,12: получаем логин и пароль из POST-запроса.
- Строка 14: начало условия (проверяем введено ли имя пользователя и пароль – сравниваем то, что получили из запроса с пустотой).
- Строки 16-22: выводим чистую форму, если пользователь не заполнил оба или одно из полей «логин» и «пароль».
- Строка 24: конец условия.
- Строка 25: конец скрипта.
- Строка 26: начало нового скрипта, который будет выполняться в том случае, если имя и пароль введены.
- Строка 27-32: подключаемся к БД.
- Строка 34: формируем SQL запрос к БД, который выбирает пароль для пользователя с именем, которое введено в форму.
- Строка 36: выполняем запрос.
- Строка 37: объявляем переменную «pas» и приравниваем её к пустой строке.
- Строки 38-41: читаем набор записей, в котором содержится ответ на SQL-запрос, и присваиваем его значение переменной «pas». Если бы в базе не нашлось пароля для введённого имени, тогда бы переменная «pas» осталась бы пустой.
- Строка 43: если выбранный пароль совпадает с введённым, то выполняем с 45 по 76 строку; если не совпадает, тогда выполняем строку 80 – выдаём «Неправильное или несуществующее имя пользователя или пароль!».
- Строки 45-76: делаем запрос к БД, в ответ получаем выборку для нужного пользователя. Выводим статистику на экран в удобной форме. Response.End (76 строка) означает конец вывода.
- Строка 77: конец условия.
- Строка 79: если условие не выполнилось, т.е. пользователь ввёл неправильный пароль или имя, – выдаём соответствующее сообщение.
- Строки 83-84: конец страницы.
Результат обращения к bd2.asp (результат выполнения скрипта)
Заходим на страницу, получаем форму для ввода логина и пароля (неплохо было бы и здесь использовать SSL, чтобы злоумышленники не перехватили открытый POST-запрос c логином и паролем, но о том, как прикрутить SSL к IIS как-нибудь в другой раз – это довольно-таки легко сделать при помощи пакета OpenSSL).
Вводим правильные логин и пароль, получаем результат (если логин или пароль неправильные, то ничего не получаем).
Поздравляю! Мы написали хотспотный биллинг.
Выводы
На первый взгляд всё довольно сложно и запутанно. Но если разобраться, ничего сложного нет: NAS-серверы, в роли которых выступают DSA-3100, проводят аутентификацию пользователей и пишут CDR-подобную статистику в единую базу данных RADIUS. Для реализации различных дополнительных (практически любых) функций биллинга разрабатываем веб-интерфейс, для чего используем, например, ASP или PHP. Тарификация пользователей может осуществляться на основе использованного времени или по трафику. В случае с одиночно стоящим хотспотом – сервисный шлюз DSA-3100 и тикет-принтер DSA-3100P – являются биллингом во плоти, никаких гаек подкручивать не надо, с построением хотспота справится любой, но тарификация будет вестись только по времени.
Возможно, многих озаботит немалое количество дорогого программного обеспечения, которое необходимо задействовать совместно с шлюзом в случае построения сети хотспотов, однако я никого не призываю покупать именно это ПО.
Я говорю следующее: есть простые HOTSPOT и для этого подойдёт DSA-3100 – любой – опытный и не очень пользователь может его себе поставить и всё заработает с пол-оборота. Но бывают сложные решения, и этот шлюз может, несмотря на всю его простоту, быть использован и для сложного решения.
Я показал на базе продуктов от Microsoft и RADIUS-сервере под Windows, какую роль будет выполнять шлюз в этом случае. Microsoft – это просто, визуально, понятно любому. Либо можно использовать связку: Linux + (WEB)Apache/php + (БД)Oracle + (RADIUS)Radiator + NAS(DSA-5100).
Видимо, наиболее применимы эти устройства будут для организации точек HOTSPOT в кафе, ресторанах, гостиницах и прочих заведениях. Но возможно их использование и для серьёзных операторских решений, потому как любой уважающий себя биллинг поддерживает протокол RADIUS. При помощи данных устройств можно легко интегрировать HOTSPOT в сеть сотового оператора. Такое решение, например, представил «Енисейтелеком» (это ведущий оператор сотовой связи в Красноярском крае) на выставке «Связь – ИНФОКОМ 2004»: пользователи отправляли sms на сервисный номер оператора и получали в ответ sms-сообщение с именем и паролем для доступа в Интернет. Шлюз взаимодействовал с биллингом оператора (он поддерживал протокол RADIUS), деньги за пользование услугой снимались с сотового счёта абонента. Очень оригинальная и комфортная с точки зрения пользователя HOTSPOT схема доступа к услуге.
Вместе с тем шлюз DSA-3100 сможет сэкономить немало времени на настройку авторизации и тарификации администратору обычной проводной (в том числе домашней) сети, предоставив в его распоряжение надежную систему авторизации по IP + MAC в совокупности с авторизацией по логину и паролю.