HotSpot в Mikrotik, или как заработать $: Часть 1

Наверняка многие знают что такое HotSpot, во многих городах России данное “чудо” используется и работает не лучше общественного туалета в Каире. В данном очерке я не только, поделюсь как сделать качественный HotSpot на оборудовании Mikrotik, но и о том как поднять $.

1. Рисуем схемы

Схема сети

Я немного параноик, поэтому использую промежуточный сервер, для обработки запросов приходящих от Mikrotik HotSpot. Так же предлагаю использовать один(кластер из нескольких) сервер Mikrotik для обработки всех HotSpot сессий, но имея множества AP точек в разных местах города или как в моем случаи областей(краев).

И так алгоритм:
1. Клиент подключается к AP и пытается выйти в интернет через браузер.
2. Браузер перекидывает на страницу авторизации, где ему предлагают, купить карту(с возможностью online оплаты любым доступным способом, включающий любые электронные валюты и платежные карты Visa и MasterCard) или получить бесплатную пробную карту.
3. Если человек переходит на пробную карту, Mikrotik делает запрос на промежуточный сервер, тот проверяет данные и передает их биллинговой системе, которая отправляет смс на указанный номер, а пользователя перебрасывают на страницу авторизации.
4. Если человек хочет купить карту, он переходит на страницу покупки, где промежуточный сервер возвращает варианты карт(размер, количество), далее человек выбирает необходимый и промежуточный сервер формирует линк до платежного центра(например, Onpay.ru)

1. Создаем, строим, делаем

Создаем HotSpot на Mikrotik

#создаем vlan
/interface vlan
add comment="Public HotSpots with test card" interface=ether2 l2mtu=1596 \
    name=e2_v25 vlan-id=25
#создаем профиль, где указываем папку с файлами для Hotspot
/ip hotspot profile
add hotspot-address=172.17.14.254 html-directory=\
    hotspot_with_test_card login-by=http-chap name=\
    hs-public-public_with_test_card nas-port-type=ethernet use-radius=yes
#пул серых адресов для hotspot
/ip pool
add name=hs-pool-public_with_test_card ranges=172.17.14.10-172.17.14.200
#dhcp сервер
/ip dhcp-server
add address-pool=hs-pool-public_with_test_card disabled=no interface=e2_v25 \
    lease-time=10m name=dhcp
#сам hotspot
/ip hotspot
add address-pool=hs-pool-public_with_test_card addresses-per-mac=200 \
    disabled=no interface=e2_v25 name=hotspot_public_with_test_card profile=\
    hs-public-public_with_test_card
#локальный адрес Mikrotik в той же подсети
/ip address
add address=172.17.14.254/24 comment="public hotspot network, with test card" \
    interface=e2_v25
#подсеть для dhcp сервера
/ip dhcp-server network
add address=172.17.14.0/24 dns-server=172.17.14.254 gateway=172.17.14.254
#dns
/ip dns
set allow-remote-requests=yes cache-size=1048KiB max-udp-packet-size=512 \
    servers=8.8.8.8,8.8.4.4
#nat для серых ip
/ip firewall nat
add action=masquerade chain=srcnat comment="masquerade hotspot network anon" \
    src-address=172.17.14.0/24

В winbox есть мастер который делает почти все тоже самое, однако в виде кода будет нагляднее.

2. Воротим HTML

В прошлом пункте мы указали что файлы будут храниться у нас в папке hotspot_with_test_card на самом Mikrotik, куда мы их зальем при помощи sftp или ftp или просто перетащив в winbox.

Согласно официальной инструкции структура каталога вполне конкретна. Опишу только нужные нам файлы, остальные файлы вы без труда сделаете сами.

login.html (загружается по умолчанию, если пользователь не авторизирован):

Для входа в HotSpot введите свои персональные данные
логин:
пароль:
$(if error) $(error) $(endif)

И так у нас два линка, один ведет на покупку карты, второй ведет на получение тестовой карты.

Начнем с тестовой карты(test_card.html):

Получить тестовую карту
номер телефона*:
комментарий:
*например, 9181234567
function submitform() { document.login.submit(); } window.onload=test_card_page_load();

Суть данной формы в следующем, абонент вводит номер телефона и комментарий и нажимает “Получить”, дальше данные отправляются на промежуточный сервер где проверяются и делается запрос в биллинговую систему.
Далее скрипт возвращает редирект на туже самую страницу откуда была послана форма, но только с добавлением параметра id, в котором указывается результат работы, все это обрабатывает javascript процедура, а именно

function test_card_page_load() {
var url_load = window.location;

var url = location.href;
url = url.replace(/\?id=\d+/,"");

//тут мы заполняем параметр return_url, что бы скрипт на промежуточном сервера знал откуда мы пришли и куда нас возвращать
document.getElementById('return_url').value = url;

var font_start = '';
var font_end = '';

//а тут мы анализируем что за результат вернул нам промежуточный сервер
if (/id=1/.test(url_load)) {
	document.getElementById('div_error').innerHTML = font_start + 'Укажите верный номер телефона (например, 9181234567)' + font_end;
}
if (/id=2/.test(url_load)) {
	document.getElementById('div_error').innerHTML = font_start + 'Укажите верный тип карты' + font_end;
}
if (/id=3/.test(url_load)) {
	document.getElementById('div_error').innerHTML = font_start + 'Не удается обработать запрос, попробуйте повторить попытку позднее' + font_end;
}
if (/id=4/.test(url_load)) {
	document.getElementById('div_error').innerHTML = font_start + 'На указанный номер сегодня уже была отправлена карта доступа' + font_end;
}
//удачно, перекидываем на страницу авторизации, сейчас клиенту придет смс он введет и будет счастлив
if (/id=100/.test(url_load)) {
	alert('На указанный номер выслана карта доступа');
	window.location = "/login";
}
	
}

Ну вот и разобрались и с этим осталось купить карту, посмотрим test_card.html:

//прописываем этот src в качестве script
src="http://xxxxxxx.xxxx.xxxx.xx/cgi-bin/pay_hotspot.pl?id=3"

Хочу особо обратить внимание на строчку выше, результат её работы примерно такой:

 var data_frame='1;1 час, 100 руб|2;5 часов, 350 руб|3;24 часа, 900 руб'

А вот собственно и сама форма:

Купить карту доступа
номер телефона*:
тариф карты:
*например, 9181234567
function submitform() { document.login.submit(); } window.onload=pay_card_page_load();

Вот собственно и сама процедура обработки:

function pay_card_page_load() {
var url_load = window.location;

var url = location.href;
url = url.replace(/\?id=\d+/,"");

document.getElementById('return_url').value = url;


if (/id=1/.test(url_load)) {
	document.getElementById('div_error').innerHTML = 'Укажите верный номер телефона (например, 9181234567)';
}
if (/id=2/.test(url_load)) {
	document.getElementById('div_error').innerHTML = 'Укажите верный тип карты';
}
if (/id=3/.test(url_load)) {
	document.getElementById('div_error').innerHTML = 'Не удается обработать запрос, попробуйте повторить попытку позднее';
}

//процедура разбора строчки с ценами
load_pay_rate_frame();
	
}
function load_pay_rate_frame() {
if (data_frame != ''){
	var box = document.getElementById('payment_type_card');
	var arr=data_frame.split("|");
	box.innerHTML = "";
	for (var i = 0; i < arr.length; i++) {
 		var arr_1 = arr[i].split(";");
 		box.options[box.length] = new Option(arr_1[1], arr_1[0]);
	}
	
}
}

В случаи удачной проверки параметров данная форма вернет редирект на платежный центр, откуда пользователь сделает платеж, далее платежный сервер сделает запрос до биллинговой системы, а биллинговая система в свою очередь отправит смс клиенту, тот введ номер карты и пароль в поле логина и будет пользоваться оплаченной картой.

3. Кишки Mikrotik

Все бы хорошо, только с такой настройкой Mikrotik ни за что не пустит нас ни к промежуточному серверу ни к клатежному центру, и все время будет редериктить на login.html, нас это естественно не устраивает, поэтому научим его жить правильно:

/ip hotspot walled-garden
#Добавляем в доверенные адреса(те по которым можно ходить 
#без авторизации) промежуточный сервер
add dst-host=xxxxxxx.xxxx.xxxx.xx/cgi-bin/pay_hotspot.pl dst-port=80
add dst-host=xxxxxxx.xxxx.xxxx.xx
/ip hotspot walled-garden ip
#добавляем в доверенные Ip, dns сервера
add action=accept disabled=no dst-address=8.8.8.8
add action=accept disabled=no dst-address=8.8.4.4
#добавляем ip подсети различных платежных систем
add action=accept comment=onpay disabled=no dst-address=83.222.117.0/24
add action=accept comment=liqpay disabled=no dst-address=184.73.55.0/24
add action=accept comment=liqpay disabled=no dst-address=50.16.196.0/24
add action=accept comment="merchant.webmoney.ru ssl" disabled=no dst-address=\
    212.158.173.0/24 dst-port=443

#и так далее и тому подобное

Для того что бы добавить подсети всех платежных систем, необходимо самолично подключиться к hotspot и поочередно выбирая тот или иной способ оплаты лукапить(dns lookup) url, а затем добавлять эти адреса к списку разрешенных. Рекомендую добавлять не отдельный адрес провайдера, а подсеть 24 или даже 20, велика вероятность что даже если он будет сменен то в рамках этой же подсети(администраторы люди ленивые, особо много не паряться).

4. Рекомендации

Практически во всех местах где бы я был(от захудалого аэропорта в г. Анапа, до аэропорта в Мале), HotSpot напоминал “общественный туалет”, и естественно выражаясь фигурально. Например в Шереметьево терминалах D,E,F циска которая разрешала временный вход постоянно находилась в каком то неадекватном состоянии и постоянно не хотела открывать мне доступ.

Вот парочка рекомендаций, которые помогут сохранить в отличном состоянии даже при большой нагрузки со стороны пользователей:

1. Ограничивайте скорость, используйте Burst(взрывной режим):

 512k/1024k 512k/1512k 512k/768k 10/10 8

Данный параметр передается после авторизации на радиус сервере, в качестве параметра Mikrotik-Rate-Limit.
Максимальная гарантированная скорость на отдачу 1М, однако если клиент в течении 10 секунд не будет превышать скорость 768к, то в следующие 10 секунд он получит 1,5М. Данная опция очень полезна, когда человек использует hotspot для просмотра web страниц, почты и так далее, и одновременно с этим не даст качальщикам(торрент маньяки) убить HotSpot.

2. Ограничивайте сессии.
Я использую биллинговую систему для генерации и выдачи карт(как тестовых, так и оплаченных).
Например, тестовую карту можно получить на один номер телефона раз в сутки, карта выдается с лимитом 500Mb, что хватит для комфортной работы 4-5 часов при условии просмотра web страниц и загрузки небольшой информации.

Используйте параметры радиус: Mikrotik-Recv-Limit, Mikrotik-Xmit-Limit, Session-Timeout

5. В место заключения

Надеюсь я описал вполне приемлемо что бы каждый смог построить свой HotSpot(при наличии лицензии конечно) и зарабатывал на нем $ и предоставлял качественный сервис. В след. раз мы поговорим об этом и как это сделать на Mikrotik.

З.Ы.: Всем удачи, жду комментариев.
UPD: все материалы по хотспотам публикуются с тегом hotspot.

19 Comments

  1. Как с юридической точки зрения данная технология подходит для предпринимательской деятельности(необходимость лицензий, частоты, вид деятельности, налоги и т.п.)?
    Какая ширина канала у одной точки доступа, сколько клиентов(сёрфинг) одна потянет?

    1. Подходит, необходима лицензия на частоту, на конкретное оборудование в конкретном месте(если будете заниматься разберетесь, этим занимается отдельный гос. орган). Так же необходим проект и сдача в эксплуатацию.
      Ширина канала, зависит от выдаваемой скорости конкретному клиенту(например если к точке доступа подходит канал в 10М, то можно подключить 10 клиентов по 1М или 2 клиента по 5М).

  2. Если точка с штатной антеной мощьностью не более 100мвт находится внутри помещений то никаких разрешительных документов для ее работы ненужно, это касается для Украины. Озаботьтесь только легитимностью сбора денег.

  3. А можно подробнее о промежуточном сервере и о биллинговой системе? Буду очень благодарен если есть возможность скинуть на почту.

  4. В данном варианте работает перенаправление HTTPS? То есть, если у клиента стартовой страницей в браузере указан какой-нибудь сервис типа гугл поиска или фейсбука, не увидит ли он ошибку SSL и тому подобные?

      1. как раз с https есть проблема.
        если не авторизован, то сначала надо хотя бы одну страничку по http открыть.

        подскажите как побороть
        эту проблему ?

        1. Никак, к сожалению
          Протокол https подразумевает, что в трафик не может вмешиваться третья сторона. А принудительный редирект на страницу авторизации – как раз вмешательство

  5. Добрый день! А вы можете для особо одаренных исходники передать? потому что не могу разобраться как эти страницы делать, куда вставлять javaсрипт, и почему в ваших формах нет input для вставки номера телефона?

    1. Исходники приведены не полностью, разумеется – только описан принцип. Если у вас есть какие-то частные вопросы или нужна помощь – пишите на nixman@nixman.info, мы обязательно ответим.

  6. Может хоть как-то можно обойти?

    Странно что mail.ru криво сделал у себя. Вот с vk.com никаких проблем.

    1. Что-то форма глюканула, и не понятно на что я отвечал.
      Я про https перенаправление

      1. Что mail.ru сделал криво и с чем нет проблем у vk.com? =)
        Как я уже говорил, внедриться внутрь https-соединения нельзя. Ну если только не пользовать DPI-систему за много-много килобаксов 🙂

        В принципе, сейчас все мобильные устройства (и Windows начиная с 8.1) имеют свои captive portal. Так что это, в целом, решает проблему перенаправления с https страниц.

Leave a Reply