Wi-fi в кафе, авторизація по смс своїми руками і майже безкоштовно, блог Чередова івана
Вже існує безліч рішень цього завдання. З безкоштовних привабливо виглядає Captive Portal service with SMS auth for pfsense. pfSense заснований на ядрі FreeBSD, але не вимагає яких-небудь знань і умінь, специфічних для даної ОС. Практично весь функціонал доступний через веб-інтерфейс.
Я ж робив свій captive portal на основі замітки Ніка Поповича (Pipefish) "Captive Audience". Вона була написана рівно п'ять років тому, але поки я нічого простіше не знайшов.
Зібрав старенький комп з двома мережевими картами. На нього поставив Linux Debian 8. Він буде виконувати роль маршрутизатора замість DIR300. А останній поклав в резерв (завжди можна увіткнути назад, якщо щось станеться з компом).
На компі підняв DHCP, DNS, MySQL, Apache.
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
/etc/firewall.sh
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

Шейпінг трафіку реалізований за допомогою htb.
Комп крім маршрутизатора ще виконує роль принт-сервера. Також за розкладом перевантажує точки доступу.
// функція виконання команд на мікротіке (підключаємося, використовуючи ключ)
function ssh_exec ($ ip, $ command)
$ Connection = ssh2_connect ($ ip, 22);
if (ssh2_auth_pubkey_file ($ connection, 'www-data', '/var/www/.ssh/id_rsa.pub', '/var/www/.ssh/id_rsa'))
$ Stream = ssh2_exec ($ connection, $ command);
stream_set_blocking ($ stream, true);
$ Stream_out = ssh2_fetch_stream ($ stream, SSH2_STREAM_STDIO);
return stream_get_contents ($ stream_out);
fclose ($ stream);
> else
die ( 'Public Key Authentication Failed');
>>
// дізнаємося мак з таблиці ARP
$ String = '/ ip firewall mangle add chain = prerouting src-mac-address = "'. $ Mac. '" In-interface = BRIDGE protocol = tcp action = jump jump-target = registry place-before = 0';
ssh_exec ($ router, $ string);
// відправляємо смс з 3G-модема, встромлений в мікротік
$ String = '/ tool sms send usb3 channel = 3 +7'. $ Tel. ' message = "Kog Wi-Fi: '. $ code.'" ';
ssh_exec ($ router, $ string);
// додаємо в мікротік правило перестрибувати маркування пакетів для даного Mac'а
$ String = '/ ip firewall mangle add chain = prerouting src-mac-address = "'. $ Mac. '" In-interface = BRIDGE protocol = tcp action = jump jump-target = registry place-before = 0';
ssh_exec ($ router, $ string);
Ось власне і все.
будь ласка, оцініть сторінку, я намагався :)