|
|
www.lissyara.su
—> статьи
—> FreeBSD
—> программы
—> HotSpot
HotSpot
Автор: levantuev.
В нашем городе очень плохо развита услуга Хот-спот.
Хот-спот (от англ. hot spot — «горячее пятно») — участок местности (например, помещение офиса, кафе, кампуса, станция метро), где при помощи портативного устройства (ноутбука или наладонника), работающего по беспроводному протоколу радиодоступа Wi-Fi, можно получить доступ к интернету.
Но назло развитию я решил внедрить это дело в Грилль-Бар.
Имеем:
1) Точка доступа D-Link 2100AP
2) Тачку с FreeBSD 7.0
3) Канал в внешний мир
4) ip адреса:
re0 (192.168.0.1) - смотрит в точку доступа
fxp0 (192.168.1.2) - смотрит в adsl модем (router)
диапазон локальной сети - 192.168.0.0/24
DNS сервер - 87.103.161.61
IP Точки доступа - 192.168.10.10
Задача:
*Авторизация пользователей должна проходить через веб-интерфейс.
*По истичению времени пользователь отключается автоматически.
*Должна быть админ.панель для генерации логинов и паролей.
*IP адреса должна присваиваться по DHCP.
*Ифнормация о пользователях должна храниться в mysql
В статье подразумевается что у вас -
1) Установлена связка apache20+php5+mysql50
2) Ядро собрано с поддержкой:
options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPFIREWALL_FORWARD
options IPDIVERT
options DUMMYNET
| 3) Компьютер подключен к интернету и выступает в качетсве шлюза
И так начнем
Авторизация и отключение пользователей осуществляется добавлением/удалением правил в ipfw через php
root# ee /usr/local/www/data/config.php
|
<?php
define('DEBUG', true);
define('conf_DB_HOST', 'localhost'); // хост БД
define('conf_DB_USER', ''); // юзер БД
define('conf_DB_PASS', ''); // его пароль
define('conf_DB_NAME', 'wifi'); // Имя БД
define('RULE_NUM_MIN', 400);
define('RULE_NUM_MAX', 600);
define('CLIENTS_IP_BEGIN', '192.168.0.2');
define('CLIENTS_IP_COUNT', '253');
define('CLIENTS_TIME', '3600'); // время для клиента (1 час)
define('RULE_ADD_IP', '/usr/local/bin/sudo ipfw add %s allow ip from any to %s');
define('RULE_ADD_IP2', '/usr/local/bin/sudo ipfw add %s allow ip from %s to any');
define('RULE_DEL_IP', '/usr/local/bin/sudo ipfw del %s');
define('RULE_DEL_IP2', '/usr/local/bin/sudo ipfw del %s');
$db_link = mysql_connect(conf_DB_HOST, conf_DB_USER, conf_DB_PASS);
if (!$db_link) return cms_errors('Подключение к базе данных не выполнено!');
if (!mysql_select_db(conf_DB_NAME, $db_link))
return cms_errors('Подключение к базе данных не выполнено!!!');
function cms_errors($text)
{
if (DEBUG) echo $text;
return false;
}
function dumpVarX(&$Var, $Var_s = null)
{
echo "<div align='left' class='debug'>";
dumpVar($Var, 0, $Var_s);
echo "<div>";
return true;
}
function dumpVar(&$Var, $Level = 0, $Var_s = null)
{
if ($Level > 4)
{
echo "<b>...</b> LEVEL > 4<br>\n";
return;
}
$is_ob_ar = false;
$Type = gettype($Var);
if (is_array($Var)) {$is_ob_ar = true; $Type = "Array[".count($Var)."]";}
if (is_object($Var)) $is_ob_ar = true;
if ($Level == 0)
{
if ($Var_s)
echo "\n<br>\n<b><span style=\"color:#ff0000\">".$Var_s." = {</span></b>";
if ($is_ob_ar && count($Var)) echo "<pre>\n";
else echo "\n<tt>";
$Level_zero = 0;
}
if ($is_ob_ar)
{
echo "<span style=\"color:#05a209\">$Type</span>\n";
for (Reset($Var), $Level++; list($k, $v)=each($Var);)
{
if (is_array($v) && $k==="GLOBALS") continue;
for ($i=0; $i<$Level*3; $i++) echo " ";
echo "<b>".HtmlSpecialChars($k)."</b> => ";
dumpVar($v, $Level);
}
}
else
{
if (is_string($Var) && strlen($Var)>400)
echo '('.$Type.') <span style="color:#35BBFA">
strlen = '.strlen($Var).'</span>'."\n";
else echo '('.$Type.') "<span style="color:#0000FF">
',HtmlSpecialChars($Var),'</span>"'."\n";
}
if (isset($Level_zero))
{
if ($is_ob_ar && count($Var)) echo "</pre>";
else echo "</tt>";
if ($Var_s) echo "<b><span style=\"color:#ff0000\">}</span></b><br>\n";
}
return true;
}
?>
| Скрипт авторизации пользователя
root# ee /usr/local/www/data/add.php
|
<?php
require_once('config.php');
$user = get_user($_GET['login'], $_GET['pass']);
if ($user)
{
switch ($user['status'])
{
case 0:
if (add_rule($user)) echo '<h2>Вы законектились !</h2>';
else echo 'Ошибка правило не добавлено !';
break;
case 1: echo '<h2>Вы уже подклюдчены</h2>'; break;
case 2: echo '<h2>Логин уже был использован</h2>'; break;
case 3: echo '<h2>Логин отключен</h2>'; break;
default: echo 'Error'; break;
}
} else echo '<h2>Невеный логин/пароль !</h2>';
//dumpVarX($_GET, 'GET');
//dumpVarX($user, 'User');
//dumpVarX($_SERVER['REMOTE_ADDR'], 'REMOTE_ADDR');
// авторизация
function get_user($login, $pass)
{
$user = null;
if (!$login || !$pass) return null;
$login = addslashes($login);
$sql = 'SELECT * FROM users WHERE username="'.$login.'"
AND password="'.$pass.'" LIMIT 1';
$res = mysql_query($sql);
if ($res) $user = mysql_fetch_assoc($res);
return $user;
}
// добавление правила
function add_rule($user)
{
$user_ip = $_SERVER['REMOTE_ADDR'];
$current_date = time();
// dumpVarX($user_ip, 'user_ip');
if (!checkip($user_ip)) return false;
$temp = 0;
$sql = 'SELECT rule_num FROM users WHERE status=1 ORDER BY rule_num';
$res = mysql_query($sql);
if ($res)
{
$t = mysql_fetch_array($res);
if (!$t) $rule_num = RULE_NUM_MIN;
else {
// dumpVarX($t,'t');
while ($temp = mysql_fetch_array($res))
{
// dumpVarX($temp,'temp');
if (($t[0]+1) < $temp[0]) break;
$t = $temp;
}
if ($t[0] < RULE_NUM_MAX) $rule_num = $t[0]+1; else return false;
}
} else return false;
$command = sprintf(RULE_ADD_IP, $rule_num, $user_ip);
// dumpVarX($command, 'command');
exec($command);
$command2 = sprintf(RULE_ADD_IP2, $rule_num+100, $user_ip);
// dumpVarX($command2, 'command');
exec($command2);
$sql = 'UPDATE users SET status=1, time_begin=NOW(),
rule_num='.$rule_num.' WHERE id='.$user['id'];
// dumpVarX($sql, 'sql');
mysql_query($sql);
return true;
}
function checkip($ip)
{
if (!$ip) return false;
$user_ip = explode('.', $ip);
$check_ip = explode('.', CLIENTS_IP_BEGIN);
if (($check_ip[0] != $user_ip[0]) && $check_ip[0] != "*") return false;
if (($check_ip[1] != $user_ip[1]) && $check_ip[1] != "*") return false;
if (($check_ip[2] != $user_ip[2]) && $check_ip[2] != "*") return false;
if (!(($check_ip[3] <= $user_ip[3] && ($check_ip[3]
+ CLIENTS_IP_COUNT) >= $user_ip[3]))
&& $check_ip[3] != "*") return false;
return true;
}
?>
| Скрипт блокировки пользователя по истичении времени
root# ee /usr/local/www/data/cron.php
|
<?php
require_once('config.php');
check_users();
function check_users()
{
$sql = 'SELECT * FROM users WHERE status=1
AND time_begin > 0 AND (TIME_TO_SEC(TIMEDIFF(NOW(), time_begin)) >
'.CLIENTS_TIME.')';
// dumpVarX($sql);
$res = mysql_query($sql);
if ($res)
{
while ($user = mysql_fetch_assoc($res))
{
$command = sprintf(RULE_DEL_IP, $user['rule_num']);
// dumpVarX($command);
exec($command);
$command2 = sprintf(RULE_DEL_IP2, $user['rule_num']+100);
// dumpVarX($command2);
exec($command2);
$sql = 'UPDATE users SET status=2,
time_end=NOW() WHERE id='.$user['id'];
// dumpVarX($sql);
mysql_query($sql);
}
}
return true;
}
?>
| Формы для ввода данных
root# ee /usr/local/www/data/index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Администрирование</title>
<link rel="stylesheet" type="text/css" href="admin.css" />
</head>
<body>
<div class="login">
<div class="form">
<form method="get" action="add.php">
<p><label>Логин:</label>
<input class="text" name="login" type="text" size="16"/></p>
<p><label>Пароль:</label>
<input class="text" name="pass" type="password" size="16"/></p>
<p><input class="submit" type="submit" value="Все верно!"/>
</form>
</div>
<div class="rules">
<h1>Правила пользования Wi-Fi</h1>
<ol>
<li>Wi-Fi в гриль-баре бесплатный!</li>
<li>Закажите любую позицию Wi-Fi меню</li>
<li>Получите логин и пароль</li>
<li>Пользуйтесь</li>
</ol>
</div>
</div>
</body>
</html>
| Админ.панель будет лежать в папке admin/
Для безопастности можно Защитить папку паролем
root# ee /usr/local/www/data/admin/admin.php
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Админ.панель</title>
<link type="text/css" rel="stylesheet" href="style.css">
</head>
<body>
<form method="post" action="admin.php">
Количество пользователей:
<input type="text" value="" name="num" size=2> шт.<br><br>
<input type="submit" value="Сгенерировать">
</form><hr>
<?php
require_once('config.php');
$n = (int) $_POST['num'];
if ($n > 10) {
echo 'Количество создаваемых пользователей превышено!<br><br>'; $n=0; }
function generate_password($number=10)
{
$arr = array('1','2','3','4','5','6',
'7','8','9','0');
// Генерируем пароль
$pass = "";
for($i = 0; $i < $number; $i++)
{
// Вычисляем случайный индекс массива
$index = rand(0, count($arr) - 1);
$pass .= $arr[$index];
}
return $pass;
}
for ($i=0; $i<$n; $i++)
{
$login = generate_password(4);
$pass = generate_password(6);
// echo 'original: '.$pass.'<br>';
// echo 'login: '.$login.'<br>';
// echo 'pass: '.$pass.'<br>';
$sql = 'INSERT INTO users (username, password, status, rule_num)
VALUES("apt'.$login.'", "'.$pass.'", 0, 0)';
$res = mysql_query($sql);
}
if ($res) echo 'Пользователи в количестве <b>'.$n.'
</b> шт. добавлены.<br><br>';
$sql = 'SELECT * FROM users';
$res = mysql_query($sql);
echo '<table width=\'30%\'>
<td><b>Имя</b></td><td><b>Пароль</b></td>
<td><b>Статус</b></td><td><b>Правило</b></td>';
while ($data = mysql_fetch_assoc($res))
{
echo '<tr>';
echo '<td>'.$data['username'].'</td>';
echo '<td>'.$data['password'].'</td>';
if ($data['status'] == 0) {
echo '<td class=\'blue\'>Неактивен</td>'; }
if ($data['status'] == 1) {
echo '<td class=\'green\'>Используется</td>';
echo '<td>'.$data['rule_num'].'</td>';}
if ($data['status'] == 2) {
echo '<td class=\'reds\'>Использован</td>'; }
if ($data['status'] == 3) {
echo '<td><b>Отключён</b></td>'; }
echo '</tr>';
}
echo '</table>';
?>
</body>
</html>
| Информация о статусе пользователя (Активен, использован, не использован) хранится в mysql
Поэтому создаем базу, пользователя и структуру
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL auto_increment,
`username` varchar(50) default NULL,
`password` varchar(50) default NULL,
`created` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
`time_begin` timestamp NOT NULL default '0000-00-00 00:00:00',
`time_end` timestamp NOT NULL default '0000-00-00 00:00:00',
`status` tinyint(4) NOT NULL default '0',
`rule_num` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `rule_num` (`rule_num`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
| Правила ipfw
root# cat /etc/rc.ipfw
#!/bin/sh
ipfw -q -f flush
cmd="ipfw -q add"
ifout="fxp0" #Интерфейс смотрящий в модем
local="re0" #Интерфейс смотрящий в локальную сеть
stburdns="87.103.161.61" #DNS провайдера
localip="192.168.0.0/24"
$cmd 200 divert natd all from any to any via ${ifout}
$cmd 1000 fwd 192.168.0.1,80 tcp from any to any 80 via ${local}
$cmd 1100 allow ip from any to ${stburdns}
$cmd 1200 allow ip from ${stburdns} to any
$cmd 1300 deny ip from ${localip} to any via ${ifout}
$cmd 1400 deny ip from any to ${localip} via ${ifout}
| Добавляем в cron задание для проверки пользователя (Истрачен лимит по времени или нет)
*/1 * * * * root /usr/local/bin/php /usr/local/www/data/cron.php
| Применяем правила
Теперь, что бы правила добавлялись через sudo, создаем пользователя (vasya)
и добавляем его в /usr/local/etc/sudoers:
vasya ALL=(ALL) NOPASSWD: SETENV: ALL
| Делаем что бы все скрипты выполнялись от нашего пользователя
/usr/local/etc/apache2/http.conf:
все...
Теперь займемся настройкой точки доступа
По-умолчанию ip-адрес у D-Link 2100AP - 192.168.0.50 (Логин: admin)
Заходим на нем, меняем ip-адрес и жмем "Apply"
После того как мы перезагрузили точку доступа и зашли на нее по новому ip адресу (192.168.10.10)
Заходи в вкладку "Advanced" -> "DHCP server"
Делаем все как на рисунке ниже
И снова жмем "Apply" и можем свободно подключаться к точке доступа, дефолтный ssid: dlink.
На компьютере подключенному по wi-fi пробуем зайти на любой сайт xxx.ru, должно выйти окно авторизации, при правильном вводе пароля добавляется правило в firewall, если по конфигам, то через 1 час это правило удаляется.
скрипты
|
файл
|
скачан
|
размер
|
размещён
|
примечание
|
|
1377
|
18kb
|
2009-08-21
|
php скрипты hotspot
|
|
Документация
http://nigma.ru/index.php?ui=sypperpit&s=Wi-Fi%20hotspot%20on%20FreeBSD
Ссылка на обсуждение: http://forum.lissyara.su/viewtopic.php?t=20006.
размещено: 2009-08-24,
последнее обновление: 2009-10-20,
автор: levantuev
|
|
|
|
2014-07-27, lissyara
gmirror
Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.
2013-08-20, zentarim
Scan+Print server FreeBSD 9
Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540
2011-11-20, BlackCat
Разъём на WiFi-карту
Делаем съёмной несъёмную антену на WiFi-карте путём установки ВЧ-разъёма
2011-09-14, manefesto
Настройка git+gitosis
Настройка системы контроля версия исходного кода в связке git+gitosis+ssh
2011-08-14, zentarim
Wi-FI роутер + DHCP + DNS
Настройка Wi-Fi роутера на Freebsd 8 + DNS сервер + DHCP сервер: чтобы Wi-Fi клиенты были в одной подсети с проводными, проводные и беспроводные клиенты получали адреса автоматически по DHCP, кэширующ
2011-06-15, -ZG-
Охранная система на FreeBSD+LPT
В этой статье описана попытка реализации простой охранной системы на базе FreeBSD с подключением к ней охранных устройтсв на LPT порт и видеорегистрацией.
2011-03-13, terminus
ng_nat
Описание работы ng_nat, практическое использование, достоинства и недостатки в сравнении с ipfw nat
2011-02-20, Капитан
Nagios+Digitemp
Статья описывает создание системы оповещения о превышении температуры в специальных помещениях на основе Nagios с использованием программы Digitemp.
2011-02-17, Le1
Zyxel Configuration
Скрипт для массового изменения конфига свичей Zyxel. Берет из файла iplist список ip-шек, заходит последовательно на каждый и выполняет комманды из файла commands, записывая происходящее в лог файл.
2011-02-16, fox
hast carp zfs ucarp cluster
HAST (Highly Available Storage), CARP, UCARP, ZFS, Cluster настройка и одаптация плюс личные размышления…
2011-02-04, BlackCat
Восстановление ZFS
История о том, как был восстановлен развалившийся RAIDZ ZFS-пул (перешедший в FAULTED) с помощью скотча и подручных средств. Или о том, какие приключения ожидают тех, кто не делает резервных копий.
2011-02-03, Капитан
1-Wire
Статья описывает самостоятельное изготовление контроллера DS9097 для съёма показаний с датчиков температуры DS1820 с помощью программы Digitemp.
2011-01-28, Капитан
Температура в серверной
Статья описывает построение системы наблюдения за температурой в помещении серверной с использованием программы Digitemp и выводом графиков в MRTG
2011-01-21, m4rkell
Syslog server
Как то буквально на днях, у нас завалилось, что то в еве) или не в еве не суть. Суть в том, что когда захотели снять логи с хостов esx обнаружили, что хранят эти негодяи логии только за последнии сутк
2011-01-07, lissyara
Canon/gphotofs
Монтирование цифровых фотоаппаратов Canon (PTP) как файловой системы, автоматизация этого процесса через события devd и внешние скрипты.
2010-12-13, Al
IPSec
Описание принципов работы IPSEC и способов аутентификации.
2010-12-07, manefesto
FreeBSD on flash
Было принято решении переехать на USB Flash и установить минимальный джентельменский набор для работы своего роутера. Делаем =)
2010-12-05, Fomalhaut
root ZFS, GPT
Инструкция по установке FreeBSD с использованием в качестве таблицы разделов GPT и в качестве основной файловой системы - ZFS
2010-09-05, Cancer
Настройка аудиоплеера на ximp3
Цели: Простенький аудиоплеер, для того что бы тетя продавец в магазине утром пришла нажала на кнопку Power и заиграла в зале музыка, так же был доступ по сети, общая шара куда можно заливать музыку, к
2010-08-31, Cancer
Установка и настройка OpenVPN
На днях появилась задача - объединить головной офис и 3 филиала в одну сеть через интернет посредством OpenVPN, чтобы люди могли подключаться через RDP к базам 1С на серверах.
2010-08-25, manefesto
freebsd lvm
Использование linux_lvm для работы с LVM разделами из-под FreeBSD. Проблемы которые возники при монтирование lvm раздела
2010-04-30, gonzo111
proftpd file auth"a
Proftpd - квоты и авторизация из файлов, без использования базы данных и/или системных пользователей
2010-04-22, lissyara
tw_cli
Пошаговая инструкция по восстановлению RAID на контроллере 3ware, из которого выпал один диск. Настройка мониторинга состояния рейда и отчётов о его состоянии на email.
2010-04-14, fox
MySQL Master+Master
MySQL (Master Master) and (Master Slave) Как настроить репликацию…
2010-03-09, terminus
DNS zones
Краткий ликбез про управление DNS зонами. Примеры проведения делегирования прямых и обратных DNS зон.
2010-03-09, aspera
Squid+AD (group access)
Настройка прокси сервера SQUID с автроризацией пользователей в AD. Разделение пользователей на группы
2010-03-02, BlackCat
Шлюз: Часть 4
Настройка дополнительных сервисов: синхронизация времени (OpenNTPD), клиент DynDNS.org.
2010-03-01, BlackCat
Шлюз: Часть 3
Настройка DHCP и DNS серверов для работы внутри частной сети, c поддержкой внутренних (частных зон) DNS, а так же интеграция DHCP и DNS сервисов.
2010-03-01, BlackCat
Шлюз: Часть 2
Конфигурация МСЭ pf для проброса портов с изменением порта назначения и без, а так же поддержки активного режима FTP и ограничения максимального размера сегмента
2010-03-01, BlackCat
Шлюз: Часть 1
Быстрая настройка шлюза/маршрутизатора с установлением PPPoE-соединения, поддержкой NAT и DNS-forwarding.
2010-02-23, Morty
darkstat
Простая считалка траффика, со встроенным веб-сервером. Очень маленькая, может делать отчеты трафика по хостам, портам, протоколам, а также строить графики
2010-01-23, gonzo111
squid+sams+sqstat
Пилим squid и sams - примеры конфигов с объяснениями. Установка SqStat.
2009-12-19, schizoid
mpd5 + radius + ng_car + Abills
Настройка pppoe-сервера с биллинговой системой Abills и шейпером ng_car
2009-11-16, lissyara
UFS->ZFS
Удалённая миграция с UFS на ZFS. Загрузка с раздела zfs. Настройка для работы с малым количеством памяти под архитектурой i386.
2009-11-13, gx_ua
fusefs-ntfs
Установка, настройка и использование fusefs-ntfs, драйвер NTFS, предназанченного для монтирования NTFS разделов под FreeBSD
2009-11-12, Morty
LiveCD
Создание собственного LiveCD с необходимыми вам изменениями, автоматизирование данного процесса, а так же вариант скоростной сборки СД.
2009-09-27, lissyara
Samba как PDC
Контроллер домена - аналог M$ NT4 домена под самбой, без использования LDAP и прочей хиромантии. Просто и быстро =)
2009-08-30, terminus
ipfw nat
Подробное руководство по ipfw nat, сложные случаи конфигурации.
2009-08-24, levantuev
HotSpot
Установка Hotspot системы в общественное заведение.
2009-08-18, lissyara
diskless
Создание бездисковых терминалов под управлением FreeBSD - с загрузкой по сети. Используются для старта rdesktop и подключения к виндовому серверу терминалов.
2009-07-29, BAV_Lug
Видеонаблюдение
Настройка бюджетного варианта видеонаблюдения на удаленном объекте
2009-07-22, Cancer
OpenLDAP адресная книга
Настройка и создание адресной книги на базе OpenLDAP + phpLDAPadmin
2009-06-30, SergeySL
AimSniff
Руководство по созданию системы мониторинга ICQ-переписки на базе AimSniff, использующей базу данных MySQL для хранения и Web-интерфейс WAS (Web Aim Sniff) для просмотра перехваченных сообщений
2009-06-25, atrium
Управление правами доступа
Полномочия пользователей и файлов, принадлежащих им, формирует концепцию ОС UNIX.
2009-06-16, DNK
Exim+PgSQL
Установка почтовой системы exim+pgsql на FreeBSD 7.1
2009-05-30, mvalery
HDD(mbr) -> HDD(gpt)
Как разбить диск размером более 2TB на разделы, сделать загрузочным, а затем перенести на него информацию с рабочей системы — донора.
2009-05-22, Cancer
SendXMPP
Отправка сообщений на Джаббер сервер по средствам SendXMPP
2009-05-11, Raven2000
Network UPS Tools
Network UPS Tools представляет собой набор программ, которые обеспечивают общий
интерфейс для мониторинга и администрирование UPS оборудования.
|
Комментарии пользователей [22 шт.]