Настройка 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
Здесь все довольно банально:
- Создаем виртуальную машинку (2 ядра, 4 Гб памяти, 2 сетевых интерфейса, 30 Гб диск)
- Качаем последний дистрибутив, подключаем, ставим.
- Настраиваем сетевые интерфейсы, один смотрит в 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
На этом вроде всё. Система в работе уже месяц, полёт нормальный. Спасибо за внимание!