работает. надо только библиотек подтащить и brandelf сделать, если ругается.ZeM писал(а):taf
Верил в опцию в ядре COMPAT_LINUX))
ppoe + минусовый баланс+личный кабинет
Скажите, а вот если абонент попросил статический IP адрес, что в таком случае вы делаете?mrmix25 писал(а): Повторюсь используем коммутируемый доступ, в УТМ нельзя авторизовываться заблокированным клиентам использующим услугу коммутируемый доступ, есть только один способ их авторизовать = это второй пул по другому ни как!
если абонент попросил статический IP = выдаем, но на статике у нас всего 30-40 абонентов из ~1500 сидит и то 90% из них это Юр лица, а они платят по безналу, так что им доступ к Личному кабинету в заблокированном состоянии не предоставляем. Если ситуация измениться и более 250 абонентов не Юр лица перейдут на статику тогда скорее всего для них реализуем способ описанный выше в этой теме ну или что-то подобное что будет подходить для наших нужд.kara писал(а): Скажите, а вот если абонент попросил статический IP адрес, что в таком случае вы делаете?
Последний раз редактировалось mrmix25 Вт июн 18, 2013 12:17, всего редактировалось 1 раз.
и так что имеемdixanl писал(а): большое спасибо да ваша схема подходит сами решили так и сделать! если нетрудно опишите процедуру
Utm 5.2.1.009
freebsd 8.2
mysql 5.1.55
и НАС
freebsd 9.1
mpd5
pf
у Меня настроено так Тарифы состоят из коммутируемый доступ в связке с передача IP трафика, расчетный период с 1 по 1 число, используем только безлимитные тарифы, абоненты не уходят в минус. Работает это примерно так 30 или 31 числа в зависимости от месяца скрипт в 23-40 блокирует всех абонентов у которых не хватает средств для списания абонентской платы далее 1 числа в 00-00 билинг списывает средства у не заблокированных абонентов затем 1 числа в 00-15 скрипт разрывает сессии всех заблокированных они переподключаются и получают ip для заблокированных абонентов, таким образом абоненты заблокированные не ушли в минус и могут подключиться чтоб проверить свой баланс и совершить онлайн платеж. Абонент пополнил свой баланс до абонентской платы скрипт его разблокирует билинг списывает средства и после этого скрипт рвет сессию абоненту чтоб абонент переподключился и получил IP для разблокированных.
UTM 5.2.1-009 - обязательно (в версиях ниже не работает это функционал)
необходимо установить freeRADIUS2 на сервер с билингом нам нужна его утилита, а именно /usr/local/bin/radclient, после установки freeRADIUS2 убираем его из авто загрузки
1) в интерфейсе администратора - настройки -IP пулы = создаем 2 пула (например: ok (пул 172.16.0.0/19 -8000 ip адресов) -для не заблокированных, block (пул 172.16.32.0/19 -8000 ip адресов)-для заблокированных)
2) в интерфейсе администратора - Тарификация - Шаблоны услуг = редактируем коммутируемый доступ во вкладке Параметры услуги = название пула указываем пул для не заблокированных пользователей ok
3)создаем тарифы точно такие как и были, но уже с пулом
4) в интерфейсе администратора - Пользователи и группы = с помощью операций над группами меняем всем пользователям одного тарифа следующий тариф на такой же только с пулом не забываем отлючить самостоятельную смену тарифов в личном кабинете(у меня расчетный период с 1 по 1, этим действием все пользователи с 1 числа перейдут на тариф с пулом)
5)в файле /netup/utm5/radius5.cfg добавить blocked_pool_name=block этим разрешим авторизацию заблокированных абонентов (незабываем ребут радиус) утм начнет авторизировать заблокированных только тех пользователей у которых в услуги коммутируемый доступ стоит пул для не заблокированных... если в услуге коммутируемый доступ пул не указан авторизировать заблокированных утм не будет
6) на Насе(FreeBSD pf) создаем правила для pf что-то типа такого
/etc/pf.conf
wan="em0" # - смотрит в инет
lan="em1" # - смотрит на абонентов
lan2="em2" # - управление
ip_pool="172.16.0.0/19" #- для не заблокированных
ip_block="172.16.32.0/19" #- для заблокированных
reder="xxx.xxx.xxx.xxx" # - обязательно внешний IP Личного кабинета на внутренний IP редирек не будет работать
robokassa="212.24.63.0/24" # - если используете сервис онлайн оплаты в личном кабинете
bpool="172.16.0.0/12,10.0.0.0/8,192.168.0.0/16,0.0.0.0/8,169.254.0.0/16,192.0.0.2/24,204.152.64.0/23,224.0.0.0/3" # - пулы ip адресов чтоб абоненты не лазили куда не надо
############################OPTIONS###############################
set block-policy drop
set skip on lo0
set skip on lan2
scrub in all
###########################NAT_RULES##############################
nat on $wan from $ip_pool to any -> $wan round-robin sticky-address # -натим не заблокированных абонентов в инет
nat on $wan from $ip_block to any -> $wan round-robin sticky-address # -натим заблокированных абонентов в инет
no rdr proto tcp from $ip_block to $robokassa # - не редиректим абонентов которые пошли платить онлайн
rdr proto tcp from $ip_block to !$reder port 80 -> $reder port 8080 # -редиректим все запросы от абонентов на страничку у вас закончились деньги
#########################FILTER_RULES#############################
pass log quick proto { udp } from $ip_block to any port 53 # разрешаем заблокированным абонентам DNS
pass log quick proto { tcp } from $ip_block to $reder keep state # разрешаем заблокированным абонентам Личный кабинет
pass log quick proto { tcp } from $ip_block to $robokassa keep state # разрешаем заблокированным абонентам онлайн платежи
block log quick from $ip_block to any # запрещаем заблокированным абонентам все остальное
block quick to {$bpool} # - чтоб абоненты не лазили куда не надо
pass all keep state (source-track rule, max-src-states 1500) # - разрешаем не заблокированным абонентам все !!!
7) на Насе(FreeBSD mpd5) в /usr/local/etc/mpd5/mpd.conf в раздел startup добавляем:
set radsrv peer 192.168.1.2 pass - откуда будут приходить радиус атрибуты, pass - пароль
set radsrv self 192.168.1.1 3799 - на каком ip и порту будет слушать mpd5 (если не указывать будет слушать на всех сетевых установленных на Насе)
set radsrv open
рестарт mpd5
это делается для того чтоб скрип смог автоматически рвать сессии.
в Апаче на котором крутится Личный кабинет в конфиге /usr/local/etc/apache22/httpd.conf дописываем
Listen 8080
<VirtualHost ххх.ххх.ххх.ххх:8080>
DocumentRoot /usr/local/www/noaccess
<Directory /usr/local/www/noaccess>
DirectoryIndex index.html
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
где ххх.ххх.ххх.ххх - Внешний IP адрес Личного кабинета
в директории /usr/local/www/ создаем папку noaccess в ней файл index.html в файле index.html пишем что-то вроде этого
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251">
<META HTTP-EQUIV="Refresh" CONTENT="60; URL=http://ВашЛичныйкабинет.ru/">
<title>ВашЛичныйкабинет.ru | недостаточно средств</title>
</head>
<body bgcolor="#f5f5f5">
<table align="center">
<rt><td height="500">
<table width=900 align="center">
<tr>
<td>
<h3 align="center">ООО "Интернет Провайдер"</h3>
<h2 style="color:red" align="center">Доступ заблокирован</h2>
<p align="center">Уважаемый абонент, на Вашем лицевом счете недостаточно средств, для включения доступа к сети Интернет.<br>
Для уточнения суммы задолженности Вы можете зайти в Личный кабинет по адресу: <a href="http://ВашЛичныйкабинет.ru/">ВашЛичныйкабинет.ru</a>.<br></p>
<p align="center"><font size="-1">Эта страница автоматически переадресуется на Личный кабинет через 60 секунд.</font></p>
</td>
</tr>
</table>
<table align="right">
<td>
</td>
<td>
</td>
<td>
<p align="left"><b>Техподдержка:</b><br>
Телефоны: 8088888888888<br>
e-mail: 1@1.ru</p>
</td>
</tr>
</table>
</td></rt>
</table>
</body>
</html>
9) Создаем скрипт который будет рвать сессии абонентов пополнивших свой баланс, так как я у себя настроили чтоб абоненты не уходили в минус скрипты я брал из этой темы(авторам скриптов огромное спасибо!) и переделал их под свои нужды выглядит он примерно так
#!/bin/sh
MYUSER="root"
MYPASS="pass"
MYHOST="127.0.0.1"
UTM5DB="UTM5"
dat=`date +%Y%m%d,%H:%M:%S`
day=`date -j +%H%M`
log="/netup/utm5/log/on.log"
RES_AID=`echo "SELECT users.basic_account AS aid FROM users INNER JOIN accounts ON (users.basic_account = accounts.id) \
INNER JOIN account_tariff_link ON (accounts.id = account_tariff_link.account_id) \
INNER JOIN tariffs_services_link ON (account_tariff_link.next_tariff_id = tariffs_services_link.tariff_id) \
LEFT OUTER JOIN periodic_services_data ON (tariffs_services_link.service_id = periodic_services_data.id) \
WHERE users.is_deleted = 0 AND accounts.is_deleted = 0 AND \
account_tariff_link.is_deleted = 0 AND tariffs_services_link.is_deleted = 0 AND \
periodic_services_data.is_deleted = 0 AND periodic_services_data.discount_method = 1 AND \
periodic_services_data.cost > 0 AND accounts.balance >= periodic_services_data.cost AND \
accounts.unlimited < 1 AND \
accounts.is_blocked = 256 ORDER BY aid" | \
mysql -h $MYHOST -u $MYUSER -p$MYPASS -D $UTM5DB`
if [ $day -ge 2300 ]; then
echo "$dat not now!!!" >> $log
elif [ $day -le 0059 ]; then
echo "$dat not now!!!" >> $log
else
for i in $RES_AID;
do
echo "$dat Unlockin accounts - $i" >> $log
ourfa_client -S rsa_cert -a edit_account -account_id $i -is_blocked 0 -int_status 1
sleep 1
c=`echo "SELECT users.login AS user \
FROM users \
WHERE users.basic_account = $i ORDER BY user" | \
mysql -h $MYHOST -u $MYUSER -p$MYPASS -D $UTM5DB`
for a in $c
do
echo "login = $a" >> $log
echo "User-Name = $a" | /usr/local/bin/radclient -r 1 192.168.1.1:3799 40 pass
done
done
fi
этот скрипт, запускается раз в 10 минут проверяет у пользователей баланс и сравнивает его с абонентской платой на следующий месяц, если баланс больше или равен абонентской плате скрип выключает блокировку и заносит id лицевого счета в лог и рвет сессиию абонента, если меньше скрипт ни чего не делает.
###################
На идеальную версию не претендую!
Не говорю что это единственное правильное решение этого вопроса, но Нам оно полностью подходит, настроено так на боевых серверах, абонентов ~1500 работает все уже 3-5 месяцев полет нормальный.
может Кому-нибудь пригодится.... пусть и не вся инструкция, а какая-нибудь её часть
А эти правила пишится в utm или на НАС ( в моем случае это циска )?taf писал(а):I. Клиент, завернутый в л/к, произвел оплату через карту предоплаты. И....? Только не говрите, что ему придется переподключаться. Дополним ситуацию роутером. Заставлять клиента дергать его по питанию это не дело.mrmix25 писал(а):у себя настроил такую штуку. Используем коммутируемый доступ версия УТМ 009 (в версиях ниже не работает этот функционал) в ней создаем 2 пула один для не заблокированных абонентов второй для заблокированных далее
II. У клиент кончились деньги на л/с, но сессия все еще живая. Как быть?
Все-таки идеологически правильнее будет не менять клиентам адреса. На БРАСе просто создаем заворот на л/к всем адресам. Клиенты, у которых интернет включен/плюсовой баланс, обходят этот заворот через разрешительное правило. Клиенты с отрицательным балансом/выключеным интернетом в разрешенных отсуствуют, и по-умолчанию попадают на редирект.
Никаких двойных пулов, никаких требований по переподключению для клиентов, никаких костылей по принудительному прерыванию сессий клиентов в случае включить/выключить интернет.
Пример.
Создаем правила для заворота:
Создаем правила фильтрации:Код: Выделить всё
-A PREROUTING -t nat -m set --match-set station src -j ACCEPT -A PREROUTING -t nat -m set --match-set station dst -j ACCEPT -A PREROUTING -t nat -i ppp+ -p tcp -m tcp --dport 80 -j DNAT --to-destination IP_ADDR_BILLING
в set'е mandatory прописываем все адреса, на которые клиент должен иметь доступ при любом состоянии баланса. У нас это сервера DNS, адрес сервера с личным кабинетом и адреса онлайновых платежных систем, по которым клиент может произвести оплату (сбербанки всякие и еще какая-то шняга)Код: Выделить всё
-A FORWARD -i ppp+ -m set --match-set mandatory dst -j ACCEPT -A FORWARD -i ppp+ -m set --match-set station src -j ACCEPT -A FORWARD -i ppp+ -j DROP
в set'е station перечисляются IP клиентов. Адреса туда заносит utm_rfw. У нас клиентам назначаются фиксированные адреса, но все должно так же работать и при использовании динамических пулов + utm5_radius
Сделал все согласно выше написанного, но увы заглушка не появляется у пользователей с отрицательным балансом.mrmix25 писал(а):и так что имеемdixanl писал(а): большое спасибо да ваша схема подходит сами решили так и сделать! если нетрудно опишите процедуру
Utm 5.2.1.009
freebsd 8.2
mysql 5.1.55
и НАС
freebsd 9.1
mpd5
pf
у Меня настроено так Тарифы состоят из коммутируемый доступ в связке с передача IP трафика, расчетный период с 1 по 1 число, используем только безлимитные тарифы, абоненты не уходят в минус. Работает это примерно так 30 или 31 числа в зависимости от месяца скрипт в 23-40 блокирует всех абонентов у которых не хватает средств для списания абонентской платы далее 1 числа в 00-00 билинг списывает средства у не заблокированных абонентов затем 1 числа в 00-15 скрипт разрывает сессии всех заблокированных они переподключаются и получают ip для заблокированных абонентов, таким образом абоненты заблокированные не ушли в минус и могут подключиться чтоб проверить свой баланс и совершить онлайн платеж. Абонент пополнил свой баланс до абонентской платы скрипт его разблокирует билинг списывает средства и после этого скрипт рвет сессию абоненту чтоб абонент переподключился и получил IP для разблокированных.
UTM 5.2.1-009 - обязательно (в версиях ниже не работает это функционал)
необходимо установить freeRADIUS2 на сервер с билингом нам нужна его утилита, а именно /usr/local/bin/radclient, после установки freeRADIUS2 убираем его из авто загрузки
1) в интерфейсе администратора - настройки -IP пулы = создаем 2 пула (например: ok (пул 172.16.0.0/19 -8000 ip адресов) -для не заблокированных, block (пул 172.16.32.0/19 -8000 ip адресов)-для заблокированных)
2) в интерфейсе администратора - Тарификация - Шаблоны услуг = редактируем коммутируемый доступ во вкладке Параметры услуги = название пула указываем пул для не заблокированных пользователей ok
3)создаем тарифы точно такие как и были, но уже с пулом
4) в интерфейсе администратора - Пользователи и группы = с помощью операций над группами меняем всем пользователям одного тарифа следующий тариф на такой же только с пулом не забываем отлючить самостоятельную смену тарифов в личном кабинете(у меня расчетный период с 1 по 1, этим действием все пользователи с 1 числа перейдут на тариф с пулом)
5)в файле /netup/utm5/radius5.cfg добавить blocked_pool_name=block этим разрешим авторизацию заблокированных абонентов (незабываем ребут радиус) утм начнет авторизировать заблокированных только тех пользователей у которых в услуги коммутируемый доступ стоит пул для не заблокированных... если в услуге коммутируемый доступ пул не указан авторизировать заблокированных утм не будет
6) на Насе(FreeBSD pf) создаем правила для pf что-то типа такого
/etc/pf.conf
wan="em0" # - смотрит в инет
lan="em1" # - смотрит на абонентов
lan2="em2" # - управление
ip_pool="172.16.0.0/19" #- для не заблокированных
ip_block="172.16.32.0/19" #- для заблокированных
reder="xxx.xxx.xxx.xxx" # - обязательно внешний IP Личного кабинета на внутренний IP редирек не будет работать
robokassa="212.24.63.0/24" # - если используете сервис онлайн оплаты в личном кабинете
bpool="172.16.0.0/12,10.0.0.0/8,192.168.0.0/16,0.0.0.0/8,169.254.0.0/16,192.0.0.2/24,204.152.64.0/23,224.0.0.0/3" # - пулы ip адресов чтоб абоненты не лазили куда не надо
############################OPTIONS###############################
set block-policy drop
set skip on lo0
set skip on lan2
scrub in all
###########################NAT_RULES##############################
nat on $wan from $ip_pool to any -> $wan round-robin sticky-address # -натим не заблокированных абонентов в инет
nat on $wan from $ip_block to any -> $wan round-robin sticky-address # -натим заблокированных абонентов в инет
no rdr proto tcp from $ip_block to $robokassa # - не редиректим абонентов которые пошли платить онлайн
rdr proto tcp from $ip_block to !$reder port 80 -> $reder port 8080 # -редиректим все запросы от абонентов на страничку у вас закончились деньги
#########################FILTER_RULES#############################
pass log quick proto { udp } from $ip_block to any port 53 # разрешаем заблокированным абонентам DNS
pass log quick proto { tcp } from $ip_block to $reder keep state # разрешаем заблокированным абонентам Личный кабинет
pass log quick proto { tcp } from $ip_block to $robokassa keep state # разрешаем заблокированным абонентам онлайн платежи
block log quick from $ip_block to any # запрещаем заблокированным абонентам все остальное
block quick to {$bpool} # - чтоб абоненты не лазили куда не надо
pass all keep state (source-track rule, max-src-states 1500) # - разрешаем не заблокированным абонентам все !!!
7) на Насе(FreeBSD mpd5) в /usr/local/etc/mpd5/mpd.conf в раздел startup добавляем:
set radsrv peer 192.168.1.2 pass - откуда будут приходить радиус атрибуты, pass - пароль
set radsrv self 192.168.1.1 3799 - на каком ip и порту будет слушать mpd5 (если не указывать будет слушать на всех сетевых установленных на Насе)
set radsrv open
рестарт mpd5
это делается для того чтоб скрип смог автоматически рвать сессии.
в Апаче на котором крутится Личный кабинет в конфиге /usr/local/etc/apache22/httpd.conf дописываем
Listen 8080
<VirtualHost ххх.ххх.ххх.ххх:8080>
DocumentRoot /usr/local/www/noaccess
<Directory /usr/local/www/noaccess>
DirectoryIndex index.html
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
где ххх.ххх.ххх.ххх - Внешний IP адрес Личного кабинета
в директории /usr/local/www/ создаем папку noaccess в ней файл index.html в файле index.html пишем что-то вроде этого
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251">
<META HTTP-EQUIV="Refresh" CONTENT="60; URL=http://ВашЛичныйкабинет.ru/">
<title>ВашЛичныйкабинет.ru | недостаточно средств</title>
</head>
<body bgcolor="#f5f5f5">
<table align="center">
<rt><td height="500">
<table width=900 align="center">
<tr>
<td>
<h3 align="center">ООО "Интернет Провайдер"</h3>
<h2 style="color:red" align="center">Доступ заблокирован</h2>
<p align="center">Уважаемый абонент, на Вашем лицевом счете недостаточно средств, для включения доступа к сети Интернет.<br>
Для уточнения суммы задолженности Вы можете зайти в Личный кабинет по адресу: <a href="http://ВашЛичныйкабинет.ru/">ВашЛичныйкабинет.ru</a>.<br></p>
<p align="center"><font size="-1">Эта страница автоматически переадресуется на Личный кабинет через 60 секунд.</font></p>
</td>
</tr>
</table>
<table align="right">
<td>
</td>
<td>
</td>
<td>
<p align="left"><b>Техподдержка:</b><br>
Телефоны: 8088888888888<br>
e-mail: 1@1.ru</p>
</td>
</tr>
</table>
</td></rt>
</table>
</body>
</html>
9) Создаем скрипт который будет рвать сессии абонентов пополнивших свой баланс, так как я у себя настроили чтоб абоненты не уходили в минус скрипты я брал из этой темы(авторам скриптов огромное спасибо!) и переделал их под свои нужды выглядит он примерно так
#!/bin/sh
MYUSER="root"
MYPASS="pass"
MYHOST="127.0.0.1"
UTM5DB="UTM5"
dat=`date +%Y%m%d,%H:%M:%S`
day=`date -j +%H%M`
log="/netup/utm5/log/on.log"
RES_AID=`echo "SELECT users.basic_account AS aid FROM users INNER JOIN accounts ON (users.basic_account = accounts.id) \
INNER JOIN account_tariff_link ON (accounts.id = account_tariff_link.account_id) \
INNER JOIN tariffs_services_link ON (account_tariff_link.next_tariff_id = tariffs_services_link.tariff_id) \
LEFT OUTER JOIN periodic_services_data ON (tariffs_services_link.service_id = periodic_services_data.id) \
WHERE users.is_deleted = 0 AND accounts.is_deleted = 0 AND \
account_tariff_link.is_deleted = 0 AND tariffs_services_link.is_deleted = 0 AND \
periodic_services_data.is_deleted = 0 AND periodic_services_data.discount_method = 1 AND \
periodic_services_data.cost > 0 AND accounts.balance >= periodic_services_data.cost AND \
accounts.unlimited < 1 AND \
accounts.is_blocked = 256 ORDER BY aid" | \
mysql -h $MYHOST -u $MYUSER -p$MYPASS -D $UTM5DB`
if [ $day -ge 2300 ]; then
echo "$dat not now!!!" >> $log
elif [ $day -le 0059 ]; then
echo "$dat not now!!!" >> $log
else
for i in $RES_AID;
do
echo "$dat Unlockin accounts - $i" >> $log
ourfa_client -S rsa_cert -a edit_account -account_id $i -is_blocked 0 -int_status 1
sleep 1
c=`echo "SELECT users.login AS user \
FROM users \
WHERE users.basic_account = $i ORDER BY user" | \
mysql -h $MYHOST -u $MYUSER -p$MYPASS -D $UTM5DB`
for a in $c
do
echo "login = $a" >> $log
echo "User-Name = $a" | /usr/local/bin/radclient -r 1 192.168.1.1:3799 40 pass
done
done
fi
этот скрипт, запускается раз в 10 минут проверяет у пользователей баланс и сравнивает его с абонентской платой на следующий месяц, если баланс больше или равен абонентской плате скрип выключает блокировку и заносит id лицевого счета в лог и рвет сессиию абонента, если меньше скрипт ни чего не делает.
###################
На идеальную версию не претендую!
Не говорю что это единственное правильное решение этого вопроса, но Нам оно полностью подходит, настроено так на боевых серверах, абонентов ~1500 работает все уже 3-5 месяцев полет нормальный.
может Кому-нибудь пригодится.... пусть и не вся инструкция, а какая-нибудь её часть
в 2013 году эти костыли были актуальны более 1.5 лет прослужили мне без нареканий.... но после выхода utm 5.3 большая часть из них уже неактуальна.... но заглушка работала ещё долго, это в последнее время режим скорость в минимум, а не блокируем абонентов... что конкретно не получилось настроить ?Andrei12 писал(а): Сделал все согласно выше написанного, но увы заглушка не появляется у пользователей с отрицательным балансом.