Настройка wifi авторизации через sms под ubuntu 16.04

Настройка wifi авторизации через sms под ubuntu 16.04

Привет Хабр! Не так давно, в нашей организации встала задача узаконить wifi доступ, но чтобы в дальнейшем использование системы было бесплатно. (Согласно постановлению Правительства №758 от 31 июля 2014г. и №801 от 12 августа 2014 г. — все публичные WIFI сети обязаны производить идентификацию пользователей). У нас 10 залов для мероприятий (от 30 до 400 человек), а в день в среднем проходит от 4 до 12, плюс постоянная текучка народа и капризные пользователи.

Для начала расскажу, как у нас организована сеть. Если не вдаваться в подробности, то развешены точки доступа HP MSM430(J9651), управление через HP MSM760(J9420A) и шлюз HP F1000-EI (JG214A). Выбор оборудования не удачен, но работаем с тем, что имеем.

Так сложилось, что по жизни я больше полюбил Windows системы, но получив задачу, начитавшись кучу статей, пришел к выводу, что для этой цели лучше всего подойдет *nix система. Выбор пал на Ubuntu сервер 16.04. Дальше было несколько дней мучений, но в итоге все получилось.

Эта статья для тех, кто любит Windows, смотрит на Ubuntu и ставит с нуля кучу софта.

Как я решил все организовать:

Имеется открытая сеть, назовем ее Free. Пользователь при подключении переадресуется на хотспот со страницей авторизации. Там ему выдается код доступа к интернету и номер телефона, на которое он должен отправить сообщение (немного необычно, но стояла задача экономии, в том числе и на смс). Как только сообщение приходит к нам, доступ в интернет сразу открывается. Оговорюсь, симку и номер в модеме лучше использовать МТС (не реклама), так как только у них не нашел возможности отправить СМС с сайта без указания левого номера (хотя это проблема, но в процессе решения).

Что нам потребуется:

  • лошадка Ubuntu Server 16.04
  • прокси Squid в прозрачном режиме
  • Mysql (MariaDB)
  • Nginx
  • PHP FPM
  • USB redirector (виртуальная машинка под HyperV)
  • модем Huawei E153 МТС
  • SMS tools для чтения смс
  • и тд. и тп.

Установка Ubuntu Server 16.04

Здесь все довольно банально:

  1. Создаем виртуальную машинку (2 ядра, 4 Гб памяти, 2 сетевых интерфейса, 30 Гб диск)
  2. Качаем последний дистрибутив, подключаем, ставим.
  3. Настраиваем сетевые интерфейсы, один смотрит в vlan сети wifi, второй в сторону шлюза

Настройка сети и форвардинг пакетов

Смотрим, какие у нас присутствуют сетевые карты и какие назначены им логические имена:

В моем случае, это eth0 и eth1:

Редактируем файл настройки сетевых интерфейсов:

Убедимся в том, что в системе действительно присутствуют IPv6 интерфейсы:

Также можно увидеть, что некоторые приложения вывешивают TCP прослушиватели на интерфейсах IPv6. Посмотреть все прослушиваемые в системе порты можно командой:

Чтобы выключить поддержку IPv6 на всех сетевых интерфейсах сразу, открываем на редактирование файл sysctl.conf

В конец файла добавляем строки для включения форвардинга и отключения IPv6:

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

Установка MySQL

В качестве сервера баз данных, выбрал MaridDB. По функционалу в чем-то даже лучше MySQL, но статья не об этом.

Проверяем, все ли хорошо у нас запустилось:

Установка Squid с поддержкой SSL и отключением IPv6

Есть много статей, как собирать и устанавливать прокси, но этот этап оказался наверное самый муторный. По умолчанию, в репозитарии убунты лежит Squid без поддержки SSL. Решил пересобрать, и так прошло 2 дня… В итоге получился свой мануал, как собрать под x64 последнюю версию 3.5.20.

Ставим необходимый софт для сборки:

Расcкомментируем репозитарии исходников и добавим новый:

Новый репозитарий, будет ругаться на ключи, поэтому сразу их получим:

Не забываем обновить информацию о репозитариях:

Чтобы не захламить рабочую папку, переходим в tmp и скачиваем из testing последнюю версию squid с правилами для сборки под debian

Текущая версия 3.5.19, обновляемся до последней 3.5.21

Добавляем строчки (не забываем указать путь к openssl.cnf, у меня это /etc/ssl)

Исправляем ошибку (постоянные сообщения в логах: SECURITY ALERT: Host header forgery detected on local=. 443 remote=. * ), хорошо описанную в статье, с оценкой всех рисков безопасности. (В статье описано о версии 3.5.12, здесь немного изменился код).

Ищем функцию hostHeaderIpVerify и немного изменяем ее код:

Подтверждаем патч и собираем (ждем примерно 10-15 минут)

Смотрим, какие пакеты у нас собрались:

Если пакетов нет, значит проверить папку И начинаем установку Squid:

если по каким-либо причинам, подвис установщик, то сбрасываем блокировку:

запускаем и проверяем статус

в ответ должны увидеть что-то похожее

Проверяем установленную версию Squid

Теперь займемся его настройкой, для начала создадим SSL сертификат и сохраним конфиг по умолчанию:

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

Создаем файл со списком блокируемых ресурсов

Обращаю внимание, что логи будем писать в базу данных. Для этого создаем таблицу:

запускаем и проверяем статус

в ответ должны увидеть что-то похожее

Проверяем используемые порты и версию установленного squid

Ставим USB-Redirector и модем

Так как, используется кластер под HyperV 2012R2, то возникает проблема, а именно как нам воткнуть модем. В нашей организации довольно успешно используется: USB-Redirector. Ставим его под Ubuntu

подключаемся к серверу, куда подключили модем

смотрим перечень всех usb устройств

устанавливаем драйверы модема

подключаемся и проверяем, установлен ли модем

в ответ должны увидеть:

USB устройство требуется перевести в режим модема, для этого ставим программу minicon:

Запускаем ее настройку:

Выбираем «Настройка последовательного порта» и в пункт «последовательный порт» ставим /dev/ttyUSB0 Больше ничего не меняем в настройках. Для переключения режимов работы в модемах huawei используются следующие at-команды: AT^U2DIAG=0 -устройство в режиме только модем AT^U2DIAG=1 -устройство в режиме модем + CD-ROM AT^U2DIAG=255 -устройство в режиме модем + CD-ROM + Card Reader AT^U2DIAG=256 -устройство в режиме модем + Card Reader Включаем режим «только модем»: AT^U2DIAG=0 В ответ получаем «ОК». Выходим из программы, для этого жмем Ctrl+A и Q.

Устанавливаем SMS-tools

Информацию о пакеты можно найти на сайте разработчика. Устанавливаем и настраиваем:

находим строчку [GSM1]

создаем файл обработчика входящих смс и делаем его исполняемым

Настраиваем DHCP сервер

Настраиваем Nginx и PHP 5.6 FPM

Так как php обновилось до 7 версии и во всех репозитариях ubuntu уже лежит php7, то добавляем новый и ставим:

останавливаем установленный сервис и редактируем файлы настройки

Можно убедится в том, что права доступа к сокету установлены верно:

Переходим к Nginx

Основные настройки Nginx хранятся в файле /etc/nginx/nginx.conf.

Настройки базового сайта хранятся в файле /etc/nginx/sites-available/default.

Базовый конфигурационный файл сайта принято помещать в папку /etc/nginx/sites-available/ и затем включить его путём добавления символической ссылки на этот файл в папке /etc/nginx/sites-enabled/.

Дальше буду краток, так как пояснения можно почитать по ссылке. Создаем общие файлы настройки сервера, в которых описываем настройки безопасности, сжатия, кэширования и php.

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

Настраиваем наш сервер:

и делаем редирект с сервера по умолчанию (не забываем, что DNS сервер должен резолвить имя hotspot.domain.com):

Настраиваем phpmyadmin

Для более удобной работы с базой данных, устанавливаем phpmyadmin.

и аналогично подключаем к nginx

Настройка фаервола iptables

В данном разделе, нам требуется ограничить доступ к серверу и завернуть трафик на прокси. Для начала, настроим сохранение всех правил после перезагрузки:

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

Для сохранения правил на фаерволе используем команду:

Для отслеживания и сброса установленных соединений используем conntrack

Настраиваем правила iptables

Для отлавливания проблем используем следующие команды

Настраиваем php файлы обработки запросов и скрипты

Создаем таблицы в нашей базе данных:

создаем скрипт, при входе в систему, для проверки работы всех служб:

устанавливаем права запуска и добавляем на старт

а теперь исходники php файлов:

Ну а теперь, добавим в sudoers права для управления iptables из php

На этом вроде всё. Система в работе уже месяц, полёт нормальный. Спасибо за внимание!

📎📎📎📎📎📎📎📎📎📎