Вай фай авторизация

Wi-Fi в кафе, авторизация по смс своими руками и почти бесплатно

28 Апр 2016 | Иван Чередов |

Задача сделать авторизацию по смс посетителей, использующих наш бесплатный Wi-Fi. Это требование закона. Кстати технология называется captive portal.

Уже существует множество решений этой задачи. Из бесплатных привлекательно выглядит Captive Portal service with SMS auth for pfsense. pfSense основан на ядре FreeBSD, но не требует каких-либо знаний и умений, специфичных для данной ОС. Практически весь функционал доступен через веб-интерфейс.

Я же делал свой captive portal на основе заметки Ника Поповича (Pipefish) «Captive Audience». Она была написана ровно пять лет назад, но пока я ничего проще не нашел.

Собрал старенький комп с двумя сетевыми картами. На него поставил Linux Debian 8. Он будет выполнять роль маршрутизатора.

На компе поднял DHCP, DNS, MySQL, Apache.

Основой captive portal будет цепочка правил netfilter/iptables, в которой все пакеты маркируются, перенаправляются на страницу авторизации, где mac посетителя добавляется в исключения.

export IPT=»iptables»
export WAN=ppp+ # Интерфейс, который смотрит в интернет, на нем поднято PPPoE до провайдера
export LAN=eth0 # Локальная сеть
export LAN_IP_RANGE=192.168.37.0/24

Полностью мой файл firewall.sh тут.

Ему нужно задать права

sudo chmod 700 /etc/firewall.sh

А чтобы он сам запускался при загрузке, нужно вписать в /etc/rc.local

Запретить консоль пользователю www-data:

usermod -s /bin/false www-data

Сделать apache владельцем файла /var/lib/users и дать права на чтение/запись. В этом файле хранятся все mac’и авторизованных посетителей.

chown www-data /var/lib/users
chmod 600 /var/lib/users

Задать разрешения для apache добавлением в /etc/sudoers строк

www-data ALL=(ALL:ALL) NOPASSWD:/var/lib/users

То же самое для файла /var/lib/user1. В него пишется текущий mac (хотя безопасней не писать его в файл, а сразу поручить апачу выполнять «sudo iptables -I internet 1 -t mangle -m mac —mac-source $mac -j RETURN»). Тем самым маркированный пакет покинет цепочку «interenet».

Туда же добавить строку (чтобы апач смог определить mac посетителя):

www-data ALL=(ALL:ALL) NOPASSWD:/usr/sbin/arp

Теперь страница авторизации. Коротко на ней происходит следующее:

У посетителя, чьего mac’а нет в базе, спрашиваем номер телефона, посылаем смс с кодом, и после того, как он его введет, добавляем mac в базу и в файлы /var/lib/user и /var/lib/user1. Последний исполняем, а посетителя отправляем на запрашиваемый изначально url.

Как вариант, можно обойтись без файла исключений /var/lib/user, а при каждом новом подключении проверять mac на наличие в базе. Плюс писать какое-нибудь приветствие. С файлом исключений посетитель, чей mac там есть, сразу попадет в интернет. Количество правил в iptables будет чуть больше количество авторизованных mac-ов. Максимальное их количество ограничено 65536 и зависит от оперативки. Но на производительность оно вряд-ли влияет

Полностью моя страница авторизации по смс тут.

В итоге на точках доступа открытая Wi-Fi сеть. При запросе любой страницы в браузере посетитель получает страницу авторизации. После ввода кода, его mac-адрес добавляется в исключения цепочки «internet», записывается в базу и файл исключений, с тем чтобы при следующем подключении ходить в интернет без авторизации. В базе хранится список номеров телефонов и mac’ов устройств посетителей.

Шейпинг трафика реализован посредством htb.

Комп кроме маршрутизатора еще выполняет роль принт-сервера. Также по расписанию перегружает точки доступа.

Год спустя в кафе открыли второй зал, и посетители стали грузить CPU почти на 100%. Тогда же мне в руки попал Mikrotik. На нем вариантов организовать авторизацию несколько, но я решил пойти по протоптанному пути. Благо в Mikrotik стоит RouterOS и используются те же iptables. Конечно, такой вариант бесплатным уже не назовешь, но зато Mikrotik со своими девятью ядрами, по 1.2 ГГц на ядро держит гораздо большую нагрузку.

Итак, дописал страницу авторизации следующим образом (заменил соответствующие функции):

//функция выполнения команд на микротике (подключаемся по ssh, используя ключ)

//узнаем мак из таблицы ARP

//отправляем смс с 3G-модема, воткнутого в микротик

$string=’/tool sms send usb3 channel=3 +7′.$tel.’ message=»Ваш код WiFi: ‘.$code.'»‘;
ssh_exec($router, $string);

//или с модема, воткнутого в комп, например, с помощью gnokii (меньше заморочек с кириллицей)

$sms = «Ваш код WiFi: «.$code;
$sms = str_replace(‘ ‘, ‘\ ‘, $sms);
$sms = system(«sudo -u www-data /var/www/html/sms-send.sh +7″.$tel.» «.$sms);

LANG=»ru_RU.UTF-8″
tel=$1
sms=$2
echo «$sms» | /usr/bin/sudo /usr/bin/gnokii —config /etc/sms.conf —sendsms «$tel»

//сначала я отправлял смс через сервис smsc.ru

http://smsc.ru/sys/send.php?login=******&psw=******&phones=+7″.$tel.»&mes=Ваш код WiFi: «.$code;

Но, с увеличением количества клиентов, это стало не выгодно. Тем более, что в кафе работает онлайн-заказ обедов (respublica-omsk.ru/online/), и гости любят ставить галочку «прислать смс с заказом». Плюс уведомления при онлайн-покупке билетов на мероприятия.

//далее добавляем в микротик правило перепрыгивать маркировку пакетов для данного mac’а

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *