Wi-Fi в кафе, авторизация по смс своими руками и почти бесплатно

28 Апр 2016 | Автор: |

Задача сделать авторизацию по смс посетителей, использующих наш бесплатный Wi-Fi. Это требование закона. Кстати технология называется captive portal.

Уже существует множество решений этой задачи. Из бесплатных привлекательно выглядит Captive Portal service with SMS auth for pfsensepfSense основан на ядре FreeBSD, но не требует каких-либо знаний и умений, специфичных для данной ОС. Практически весь функционал доступен через веб-интерфейс.

Я же делал свой captive portal на основе заметки Ника Поповича (Pipefish) "Captive Audience". Она была написана ровно пять лет назад, но пока я ничего проще не нашел.

Собрал старенький комп с двумя сетевыми картами. На него поставил Linux Debian 8. Он будет выполнять роль маршрутизатора вместо DIR300. А последний положил в резерв (всегда можно воткнуть обратно, если что-то произойдет с компом).

На компе поднял DHCP, DNS, MySQL, Apache.

Основой captive portal будет цепочка правил netfilter/iptables, в которой все пакеты маркируются, перенаправляются на страницу авторизации, где mac посетителя добавляется в исключения.

export IPT="iptables"
export WAN=ppp+ # Интерфейс, который смотрит в интернет, на нем поднято PPPoE до провайдера
export LAN=eth0  # Локальная сеть
export LAN_IP_RANGE=192.168.37.0/24
$IPT -N internet -t mangle
$IPT -t mangle -A PREROUTING -i $LAN -j internet
#/var/lib/users — файл с исключениями из цепочки пакетов от авторизованных mac'ов:
#iptables -t mangle -I internet 1 -m mac —mac-source $mac -j RETURN
/var/lib/users
$IPT -t mangle -A internet -j MARK —set-mark 99
$IPT -t nat -A PREROUTING -i $LAN -p tcp -m mark —mark 99 -m tcp —dport 80 -j DNAT —to-destination $INT_IP
$IPT -t filter -A INPUT -p tcp —dport 80 -j ACCEPT
$IPT -t filter -A INPUT -p udp —dport 53 -j ACCEPT
$IPT -t filter -A INPUT -m mark —mark 99 -j DROP
$IPT -A INPUT -p all -m state —state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -p all -m state —state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -t nat -A POSTROUTING -o $WAN -s $LAN_IP_RANGE -j MASQUERADE

Полностью мой файл firewall.sh тут.

Ему нужно задать права

sudo chmod 700 /etc/firewall.sh

А чтобы он сам запускался при загрузке, нужно вписать в /etc/rc.local

/etc/firewall.sh

Сделать apache владельцем файла /var/lib/users и дать права на чтение/запись. В этом файле хранятся все mac'и авторизованных посетителей.

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

Теперь страница авторизации. Коротко на ней происходит следующее:

У посетителя, чьего mac'а нет в базе, спрашиваем номер телефона, посылаем смс с кодом, и после того, как он его введет, добавляем mac в базу и в файлы /var/lib/user и /var/lib/user1. Последний исполняем, а посетителя отправляем на запрашиваемый изначально url.  (Как вариант, можно обойтись без файла исключений /var/lib/user, а при каждом новом подключении проверять mac на наличие в базе. Плюс писать какое-нибудь приветствие. С файлом исключений посетитель, чей mac там есть, сразу попадет в интернет. Единственный минус, что количество правил в iptables будет чуть больше количество авторизованных mac-ов. Максимальное их количество ограничено 65536 и зависит от оперативки. Но на производительность оно вряд-ли влияет)

Полностью моя страница авторизации по смс тут.
Смс на ней отсылаются посредством сервиса smsc.ru

В итоге на точках доступа открытая Wi-Fi сеть. При запросе любой страницы в браузере посетитель получает страницу авторизации. После ввода кода, его mac-адрес добавляется в исключения цепочки "internet", записывается в базу и файл исключений, с тем чтобы при следующем подключении ходить в интернет без авторизации. В базе хранится список номеров телефонов и mac'ов устройств посетителей.

Шейпинг трафика реализован посредством htb.

Комп кроме маршрутизатора еще выполняет роль принт-сервера. Также по расписанию перегружает точки доступа.

[UPD]

Год спустя в кафе открыли второй зал, и посетители стали грузить CPU почти на 100%.  Тогда же мне в руки попал Mikrotik. На нем вариантов организовать авторизацию несколько, но я решил пойти по протоптанному пути. Благо в Mikrotik стоит RouterOS и используются те же iptables. Конечно, такой вариант бесплатным уже не назовешь, но зато Mikrotik со своими девятью ядрами, по 1.2 ГГц на ядро держит гораздо большую нагрузку.

Итак, дописал страницу авторизации следующим образом (заменил соответствующие функции):

//функция выполнения команд на микротике(подключаемся, используя ключ)

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);

Вот собственно и все.

VN:F [1.9.22_1171]
пожалуйста, оцените страницу, я старался :)
Rating: 4.9/5 (30 votes cast)
Wi-Fi в кафе, авторизация по смс своими руками и почти бесплатно, 4.9 out of 5 based on 30 ratings

комментария 4 на «Wi-Fi в кафе, авторизация по смс своими руками и почти бесплатно»

  1. Автор: Максим на 10 Окт 2016

    В целом ничего, но вот
    www-data ALL=(ALL:ALL) NOPASSWD:/var/lib/users
    www-data ALL=(ALL:ALL) NOPASSWD:/usr/sbin/arp

    очень меня смущает.

  2. Автор: vk.com Иван Чередов на 02 Фев 2017

    Если смущает, можно сделать точно как в заметке. Хотя я не знаю, что может смущать с правами чтение-запись. Да и mac-адрес без arp все равно не получить.

  3. Автор: Стас на 16 Фев 2017

    Добрый день! А какой сервис используете для отправки СМС?

  4. Автор: vk.com Иван Чередов на 20 Фев 2017

    Стас, я использую smsc.ru

Есть что сказать? - Напишите!

Для предотвращения автоматического заполнения, пожалуйста, выполните задание, приведенное рядом.