Гид по технологиям

Превращение Linux в Wi‑Fi хотспот с captive portal на CoovaChilli

• 8 min read • Сеть • Обновлено 27 Nov 2025
Linux хотспот с captive portal на CoovaChilli
Linux хотспот с 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/hostapd

Hostapd не имеет скрипта 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.service

FreeRADIUS — настройка и интеграция с 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

  1. Убедитесь, что машина, выступающая в роли hotspota, имеет доступ в Интернет через WAN интерфейс.
  2. Подключитесь клиентом (смартфон/ноутбук) к SSID, который вы задали в hostapd.
  3. Откройте браузер и перейдите на любой сайт — вас должны перенаправить на страницу авторизации.

Если всё настроено правильно, браузер покажет captive portal.

Страница 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 (минимально необходимое)

  1. Подготовить сервер с последними обновлениями.
  2. Установить зависимости и собрать hostapd, FreeRADIUS, Haserl, CoovaChilli.
  3. Настроить MySQL: импорт схемы, создать пользователя.
  4. Настроить hostapd, создать systemd‑юнит.
  5. Настроить FreeRADIUS, проверить через radtest.
  6. Настроить CoovaChilli, ipup.sh, включить службы.
  7. Тестирование с клиентом и монитор логов.
  8. Перенос в 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

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро