Превращение Linux в Wi‑Fi хотспот с captive portal на CoovaChilli
CoovaChilli — это open-source решение для организации гостевого Wi‑Fi с captive portal. В этой инструкции показано, как на Linux (пример на Fedora) собрать и настроить hostapd, FreeRADIUS, Haserl и CoovaChilli, чтобы выдавать гостям страницу авторизации и управлять доступом через базу MySQL. Включены рекомендации по безопасности, проверке и отладке, а также пошаговые проверки и чек‑листы.
Введение
Цель этой статьи — показать, как превратить компьютер или ноутбук на базе Linux в беспроводной хотспот с captive portal, где пользователи проходят аутентификацию через веб‑страницу. Основной контроллер — CoovaChilli. Такое решение удобно для отелей, ресторанов, магазинов и других публичных мест с Wi‑Fi.
Определения в 1 строке
- Captive portal — веб‑страница, на которую перенаправляется пользователь для входа/регистрации до получения доступа в Интернет.
- RADIUS — протокол аутентификации, авторизации и учёта (AAA).
Обзор архитектуры и потоков (ментальная модель)
- Клиент подключается к точке доступа (hostapd) — получает IP из подсети CoovaChilli.
- CoovaChilli перехватывает HTTP/HTTPS запросы и перенаправляет на UAM (portal) — встроенный miniportal (Haserl) или внешний веб‑сервер.
- Параллельно CoovaChilli общается с FreeRADIUS для проверки учётных данных в MySQL (radcheck/radacct).
- После успешной аутентификации CoovaChilli размещает соответствующие правила iptables, чтобы разрешить маршрутизацию и NAT.
Важно: порядок запуска сервисов и корректные права для каталогов (radiusd, chilli) критичны для стабильности.
Требования и предварительные условия
- Дистрибутив Linux (в статье используется Fedora 20, но подход применим и к более новым версиям).
- Наборы библиотек для сборки из исходников (libnl3-devel, libtalloc-devel и пр.).
- Рабочий сервер MySQL/MariaDB.
- Проводной интерфейс с выходом в Интернет (например, eth0).
- Права sudo.
- Беспроводной модуль, поддерживающий режим Access Point (AP).
Проверка поддержки AP в вашей карточке Wi‑Fi:
sudo iw phy |grep -A 5 -i 'Supported interface modes' | grep '*'Если в выводе есть “AP”, карточка поддерживает точку доступа.
Установка зависимостей CoovaChilli
Установите необходимые библиотеки (пример для RHEL/Fedora/CentOS):
yum install libnl3-devel libtalloc-devel iptables(Для Debian/Ubuntu команда будет apt-get / apt.)
Установка hostapd
Hostapd позволяет компьютеру выступать в роли точки доступа (WPA/WPA2 Authenticator). В большинстве дистрибутивов есть пакеты hostapd, но часто требуется актуальная версия, поэтому показана сборка из исходников.
Установка пакета (быстрый вариант):
yum install hostapdСборка из исходников (если вам нужна последняя версия):
cd /usr/src
sudo git clone git://w1.fi/hostap.gitПерейдите в исходники hostapd:
cd hostap/hostapdHostapd не имеет скрипта configure, поэтому поменяйте префикс установки. Пример с sed (в исходном тексте использованы типографские кавычки — при копировании в терминал замените их на обычные “ или используйте редактор):
sed -i “s:export BINDIR ?= /usr/local/bin/:export BINDIR ?= /usr/sbin:g” MakefileКопируем дефолтный конфиг и редактируем:
cp -v defconfig .config
vim .configВ файле .config раскомментируйте/включите нужные опции (поддержка libnl, 802.11n/ac и отладка):
CONFIG_LIBNL32=y # Use libnl 3.2 libraries
CONFIG_IEEE80211N=y # Enables IEEE 802.11n support
CONFIG_WNM=y # Enables Network Management support
CONFIG_IEEE80211AC=y # Enables IEEE 802.11ac support
CONFIG_DEBUG_FILE=y # Support for writing debug log to fileСобираем и устанавливаем:
make
sudo make installПроверка установки:
hostapd -vКонфигурация hostapd
Создайте каталог конфигурации и скопируйте пример:
sudo mkdir /etc/hostapd
sudo cp -v /usr/src/hostap/hostapd/hostapd.conf /etc/hostapd/
sudo vim /etc/hostapd/hostapd.confИзмените параметры под вашу среду:
driver=nl80211
interface=wlan0 # Замените на ваше устройство
ssid=KAMPALA-3 # Задайте SSID
hw_mode=g
channel=6 # Желаемый канал
ieee80211n=1 # Включить 802.11n
wpa=1
wpa_passphrase=myverysecretpassword
wpa_pairwise=TKIP CCMP
rsn_pairwise=CCMPСоздайте каталог для сокетов hostapd и поднимите интерфейс:
sudo mkdir /var/run/hostapd
sudo rfkill unblock wifi
sudo ip link set dev wlan0 upТестовый запуск в foreground с отладкой:
sudo hostapd -d /etc/hostapd/hostapd.confЕсли демон не завершает работу сразу — обычно всё в порядке.
Создайте systemd‑юнит для hostapd (для автоматического старта):
sudo vim /etc/systemd/system/hostapd.serviceВставьте следующее содержимое:
[Unit]
Description=Hostapd IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
After=dnsmasq.service
[Service]
Type=forking
PIDFile=/var/run/hostapd.pid
ExecStartPre=/bin/mkdir -p /var/run/hostapd
ExecStart=/usr/sbin/hostapd /etc/hostapd/hostapd.conf -P /var/run/hostapd.pid -B
[Install]
WantedBy=multi-user.targetВключаем автозапуск:
sudo systemctl enable hostapd.serviceFreeRADIUS — настройка и интеграция с MySQL
FreeRADIUS отвечает за проверку учётных данных и ведение учёта (radacct). Мы используем версию 3.x, собираем из исходников для актуальности.
Скачивание и распаковка:
cd /tmp/
wget -c ftp://ftp.freeradius.org/pub/freeradius/freeradius-server-3.0.9.tar.bz2
sudo tar jxvf freeradius-server-3.0.9.tar.bz2 -C /usr/src/
cd /usr/src/freeradius-server-3.0.9Конфигурация, компиляция и установка:
sudo ./configure --prefix=/usr --libdir=/usr/lib64 --sysconfdir=/etc --localstatedir=/var/ --enable-fast-install=no
sudo make
sudo make installЕсли при установке получите ошибку создания /etc/raddb, выполните:
rmdir /etc/raddb
make install && make installДобавьте системную группу и пользователя radiusd:
sudo groupadd -r radiusd
sudo useradd -r -M -c "Radius Server User" -g radiusd radiusd -s /sbin/nologinКонфигурация FreeRADIUS с MySQL
Запустите MySQL/MariaDB, создайте базу radius и импортируйте схему:
sudo systemctl -q is-active mysqld.service || sudo systemctl start mysqld.service
sudo systemctl enable mysqld.service
mysqladmin -u root -p[MYSQL_ROOT_PASSWORD] create radius
sudo cat /etc/raddb/mods-config/sql/main/mysql/schema.sql | mysql -u root -p[MYSQL_ROOT_PASSWORD] radiusСоздайте пользователя для FreeRADIUS и выдайте привилегии:
mysql -u root -p[MYSQL_ROOT_PASSWORD] radius
GRANT ALL PRIVILEGES ON radius.* to [FREERADIUS_DB_USER]@localhost IDENTIFIED by '[FREERADIUS_DB_PASS]';Отредактируйте модуль sql в /etc/raddb/mods-available/sql, указав правильные параметры подключения:
driver = "rlm_sql_mysql"
dialect = ”mysql”
server = "localhost"
port = 3306
login = "FREERADIUS_DB_USER"
password = "FREERADIUS_DB_PASS"
read_clients = yesДобавьте счётчики Chillispot в sqlcounter и включите модули:
sudo vim /etc/raddb/mods-available/sqlcounter
# добавьте строку:
$INCLUDE ${modconfdir}/sql/counter/${modules.sql.dialect}/chillispot.conf
sudo ln -s /etc/raddb/mods-available/sql /etc/raddb/mods-enabled/sql
sudo ln -s /etc/raddb/mods-available/sqlcounter /etc/raddb/mods-enabled/sqlcounterВ clients.conf задайте secret, совпадающий с HS_RADSECRET в конфиге CoovaChilli:
secret = [FREERADIUS_DB_PASS]В /etc/raddb/radiusd.conf укажите пользователя/группу:
user = radiusd
group = radiusd
allow_vulnerable_openssl = yes
IMPORTANT: Don't do this. You really should update to recent versions of OpenSSLПримечание безопасности: разрешать “allow_vulnerable_openssl = yes” опасно. Лучше обновить OpenSSL до актуальной безопасной версии и ничего не менять.
Добавьте модули счётчиков в секцию instantiate:
chillispot_max_bytes
noresetcounterОтредактируйте виртуальный сервер default (/etc/raddb/sites-available/default) — в секциях authorize, accounting, session и post‑auth замените вызовы ‘-sql’ на sql и добавьте chillispot‑модули там, где требуется. Аналогично правки сделайте в inner-tunnel.
Пример файла счетчика chillispot для MySQL:
sqlcounter chillispot_max_bytes {
counter_name = Max-Total-Octets
check_name = ChilliSpot-Max-Total-Octets
reply_name = ChilliSpot-Max-Total-Octets
reply_message = "You have reached your bandwidth limit"
sql_module_instance = sql
key = User-Name
reset = never
query = "SELECT IFNULL((SUM(AcctInputOctets + AcctOutputOctets)),0) FROM radacct WHERE username = '%{${key}}' AND UNIX_TIMESTAMP(AcctStartTime) + AcctSessionTime > '%%b'"
}Права на каталоги и журнал:
sudo touch /var/log/radius/radutmp
sudo chown -R radiusd:radiusd /etc/raddb
sudo chown -R radiusd:radiusd /var/log/radiusСоздание администратора в базе radius:
echo "INSERT INTO radcheck (UserName, Attribute, Value, Op) VALUES ('[ADMIN_USER]', 'Cleartext-Password', '[ADMIN_PASSWORD]', ':=');" | mysql -u radius -p[FREERADIUS_DB_PASS] radiusЗапуск FreeRADIUS в режиме отладки для первоначальной проверки:
sudo /usr/sbin/radiusd -XВ другом окне тестируем с помощью radtest:
radtest [ADMIN_USER] [ADMIN_PASSWORD] 127.0.0.1 0 [FREERADIUS_DB_PASS]Ожидаемый ответ при успешной настройке:
Received Access-Accept Id 174 from 127.0.0.1:1812 to 0.0.0.0:0 length 20
Создайте systemd‑юнит для radiusd и включите автозапуск, как в примере ниже:
sudo vim /etc/systemd/system/radiusd.service(Файл приведён в исходной инструкции — скопируйте содержимое, проверьте пути и права.)
Включаем автозапуск:
sudo systemctl enable radiusd.serviceУстановка Haserl (мини‑портал)
Haserl нужен для встраиваемого miniportal CoovaChilli.
Скачивание, распаковка и установка:
cd /tmp
wget -c http://superb-dca2.dl.sourceforge.net/project/haserl/haserl-devel/haserl-0.9.35.tar.gz
sudo tar zxvf haserl-0.9.35.tar.gz -C /usr/src/
cd /usr/src/haserl-0.9.35/
./configure --prefix=/usr –libdir=/usr/lib64
make
sudo make installПроверьте опции –libdir и –prefix для вашей системы.
Установка CoovaChilli
CoovaChilli — captive portal, который перехватывает трафик и выполняет авторизацию через RADIUS.
Скачивание исходников и сборка:
cd /usr/src
sudo git clone https://github.com/coova/coova-chilli.git
cd /usr/src/coova-chilli
sh bootstrap
./configure --prefix=/usr --libdir=/usr/lib64 --localstatedir=/var --sysconfdir=/etc --enable-miniportal --with-openssl --enable-libjson --enable-useragent --enable-sessionstate --enable-sessionid --enable-chilliredir --enable-binstatusfile --enable-statusfile --disable-static --enable-shared --enable-largelimits --enable-proxyvsa --enable-chilliproxy --enable-chilliradsec --with-poll
make
sudo make installКонфигурация CoovaChilli
Файлы конфигурации находятся в /etc/chilli. Создайте конфигурационный файл на основе defaults:
sudo cp -v /etc/chilli/defaults /etc/chilli/config
sudo vim /etc/chilli/configОбязательные параметры, адаптируйте под вашу сеть:
HS_WANIF=eth0 # WAN интерфейс к Интернету
HS_LANIF=wlan0 # Интерфейс для клиентов
HS_NETWORK=10.1.0.0 # Сеть хотспота (включает HS_UAMLISTEN)
HS_NETMASK=255.255.255.0 # Маска сети
HS_UAMLISTEN=10.1.0.1 # IP адрес хотспота в подсети клиентов
HS_RADSECRET=[FREERADIUS_DB_PASS] # RADIUS shared secret
HS_UAMSECRET=[FREERADIUS_DB_PASS] # UAM секрет
HS_ADMUSR=[ADMIN_USER]
HS_ADMPWD=[ADMIN_PASSWORD]Добавьте скрипт ipup.sh, он включает NAT/маскарадинг при поднятии сессии:
sudo vim /etc/chilli/ipup.shСодержимое скрипта:
#!/bin/sh
#
# Allow IP masquerading through this box
/usr/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEВажно: замените eth0 на фактический внешний интерфейс.
Сделайте скрипт исполняемым и включите chilli:
sudo chmod 755 /etc/chilli/ipup.sh
sudo systemctl enable chilli
sudo systemctl start chilliТестирование captive portal
- Убедитесь, что машина, выступающая в роли hotspota, имеет доступ в Интернет через WAN интерфейс.
- Подключитесь клиентом (смартфон/ноутбук) к SSID, который вы задали в hostapd.
- Откройте браузер и перейдите на любой сайт — вас должны перенаправить на страницу авторизации.
Если всё настроено правильно, браузер покажет captive portal.

Управление пользователями
Добавление пользователя (каждый пользователь — отдельная запись в таблице radcheck):
echo "INSERT INTO radcheck (UserName, Attribute, Value, Op) VALUES ('[LOGIN_NAME]', 'Cleartext-Password', '[LOGIN_PASSWORD]', ':=');" | mysql -u radius -p[FREERADIUS_DB_PASS] radiusМожно автоматизировать добавление пользователей скриптами или через отдельный веб‑интерфейс, который записывает данные в базу.
Отладка и типичные проблемы (когда не работает)
- Нет режима AP на Wi‑Fi‑адаптере: проверьте вывод iw phy и, при необходимости, замените адаптер.
- Hostapd сразу падает: проверьте .conf на синтаксические ошибки, убедитесь в отсутствии конфликтов с NetworkManager/wpa_supplicant.
- CoovaChilli не перенаправляет трафик: проверьте iptables‑правила и работоспособность ipup.sh.
- FreeRADIUS возвращает Access‑Reject: проверьте соответствие secret и правильность записей в radcheck.
- Проблемы с MySQL: убедитесь, что схема импортирована и у пользователя FREERADIUS_DB_USER есть все привилегии.
Полезные команды для отладки:
sudo journalctl -u hostapd -f
sudo journalctl -u radiusd -f
sudo journalctl -u chilli -f
sudo /usr/sbin/radiusd -X # режим отладки FreeRADIUS
sudo iptables -t nat -L -n -vБезопасность и хардениng (важно)
- Не используйте allow_vulnerable_openssl = yes в production; обновите OpenSSL и библиотеки.
- Храните RADIUS‑секреты и пароли в защищённых конфигурационных файлах с ограниченными правами доступа (radiusd:radiusd).
- Используйте HTTPS для внешнего портала. Встроенный miniportal удобен, но для публичных сетей лучше использовать HTTPS с валидным сертификатом (Let’s Encrypt или корпоративный CA).
- Ограничивайте доступ администратора по IP или VPN.
- Логируйте события входа и мониторьте необычную активность (много неудачных попыток входа, аномально большой трафик).
Альтернативные подходы и сравнение (когда CoovaChilli не подходит)
- Использовать коммерческие контроллеры Wi‑Fi (UniFi, Cisco, Ruckus) — проще в управлении, но дороже и закрыты.
- Использовать готовые дистрибутивы типа OpenWrt/LEDE с пакетом Coova/Chilli — удобно для роутеров.
- Для простых сетей хватит только hostapd + iptables + статический портал (без RADIUS).
Выбор зависит от масштаба: для малого бизнеса достаточно мини‑портала и локальной базы; для больших сетей лучше централизованный RADIUS и системы управления.
Роли и чек‑листы (кто что делает)
Администратор сети:
- Проверить аппаратную совместимость Wi‑Fi.
- Настроить hostapd и RADIUS, обеспечить резервные копии конфигов.
- Мониторить логи и обновлять OpenSSL/пакеты.
Оператор/поддержка:
- Создавать пользователей в базе по запросу.
- Помогать клиентам при подключении, проверять редиректы portal.
- Выполнять базовую диагностику (ping, journalctl, iptables).
Служба безопасности:
- Проводить аудит конфигураций и прав доступа.
- Анализировать подозрительную активность и блокировать угрозы.
План запуска / SOP (минимально необходимое)
- Подготовить сервер с последними обновлениями.
- Установить зависимости и собрать hostapd, FreeRADIUS, Haserl, CoovaChilli.
- Настроить MySQL: импорт схемы, создать пользователя.
- Настроить hostapd, создать systemd‑юнит.
- Настроить FreeRADIUS, проверить через radtest.
- Настроить CoovaChilli, ipup.sh, включить службы.
- Тестирование с клиентом и монитор логов.
- Перенос в production: обеспечить резервирование, бэкапы и процедуру отката.
Критерии приёмки (тесты/acceptance)
- Клиент подключается к SSID и получает IP из подсети HS_NETWORK.
- Любой HTTP(S) запрос перенаправляется на captive portal.
- После ввода корректных учётных данных FreeRADIUS возвращает Access‑Accept, пользователь получает доступ в Интернет.
- Журналы radius/radacct записывают сессии и объёмы трафика.
- Сервисы hostapd, radiusd и chilli автоматически стартуют при загрузке.
Тест‑кейсы (короткие)
- Успешная аутентификация: создать тестовую учётную запись и выполнить login — ожидается доступ.
- Некорректный пароль: получить Access‑Reject и соответствующее поведение портала.
- Ограничение по объёму: при достижении Max‑Total‑Octets пользователь блокируется/получает сообщение.
Глоссарий (1‑строчные определения)
- hostapd — демон, реализующий точку доступа и WPA/WPA2.
- CoovaChilli — captive portal для перехвата и управления доступом.
- FreeRADIUS — сервер RADIUS для AAA.
- Haserl — CGI утилита для мини‑порталов.
Совместимость и миграция
- Fedora/RHEL/CentOS: команды yum указаны в тексте; на Debian/Ubuntu используйте apt.
- Архитектура 64‑бит: проверьте параметры –libdir при configure.
- Для обновления с устаревших версий CoovaChilli учитывайте изменения конфигов и опции компиляции.
Резервное копирование и откат (rollback)
- Делайте бэкап /etc/chilli, /etc/hostapd, /etc/raddb и дамп базы данных radius.
- Перед обновлением компонентов снимите копию systemd‑юнитов и скриптов ipup/ipdown.
- В случае критических ошибок: остановите chilli, верните старую конфигурацию и перезапустите службы.
Частые ошибки и быстрые исправления
- “Bind address already in use” при запуске hostapd: проверьте, не запущен ли другой демон, освободите интерфейс.
- Проблемы с NAT: убедитесь, что ip_forward включён (sysctl net.ipv4.ip_forward=1) и iptables содержит правило MASQUERADE.
- FreeRADIUS не может подключиться к MySQL: проверьте параметры driver/dialect/login/password и права пользователя.
Заключение
Эта инструкция даёт практический план от нуля до рабочего локального хотспота с captive portal на базе CoovaChilli. Для production‑окружения дополнительно рекомендуются автоматизация и мониторинг, установка TLS для портала и регулярное обновление компонентов.
Короткое резюме и советы:
- Начните с тестовой среды и поэтапно добавляйте компоненты.
- Проверьте поддержку AP вашим адаптером.
- Следите за безопасностью ключей и обновлениями OpenSSL.
Удачной настройки!
Следите за обновлениями и примерами конфигураций в репозиториях проектов.
Следите за мной: @jzikusooka
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента