завернул...
короче идея создания биллинговой системы возникла в тот самый момент, когда у меня, собственно появилась сеть...
покупать коряво-ебанутые платные решения типа но-денай и лан-биллинг не было желания (да и возможности).
начиналось всё с мелкой-мелкой проги для автоматического создания правил файервола в... дай бог памяти... асп-линукс. с тех пор я дружу только с красной шапкой (ред-хат-клоны) и напрочь не понимаю системы управления брандмауэром фри (хотя говорят что привинтить биллинг впринципе могно к любой системе - активно, целеустремлённо не верю, ибо... ибо).
за основу я взял пхп-скриптование (со своим опытом ковыряния си-проэктов для меня проще было выучить именно этот лангвич, похожий на него слишком заумный перл меня непоперл) - наиболее простой способ достичь консенсуса с роутером.
итак, на основе сложных расчётов нам необходимо создавать простые команды ВЫКЛ и ВКЛ на отдельного пользователя.
пример команд:
ВКЛ)
iptables -t nat -A POSTROUTING -s X.X.X.X -j SNAT --to-source Y.Y.Y.Y;
данная конструкция говорит брандмауэру, что надо создать правело подстановки вместо адреса X.X.X.X клиента внутренней сети адрес Y.Y.Y.Y роутера в интернете (и наоборот).
именно она позволяет пробрасывать пакеты разных клиентов через один внешний адрес.
обратная команда удаления звучит так:
ВЫКЛ)
iptables -t nat -D POSTROUTING -s X.X.X.X -j SNAT --to-source Y.Y.Y.Y;
собственно называние таблицы (nat) и цепочки (POSTROUTING) не меняются.
адрес шлюза в интернете - если он один на всех - тоже.
создадим функции, позволяющие команды ВКЛ и ВЫКЛ передавать операционной системе:
function rule_on($ip)
{
shell_exec("iptables -t nat -A POSTROUTING -s $ip -j SNAT --to-source Y.Y.Y.Y");
}
function rule_off($ip)
{
shell_exec("iptables -t nat -D POSTROUTING -s $ip -j SNAT --to-source Y.Y.Y.Y");
}
для того, чтобы правила срабатывали, необходимо, чтобы скрипт выполнялся с правами администратора. то есть апач должен быть соответственным образом настроен (например, позволив управлять ему сетью через sudoers).
дальнейшее, как говорится - дело техники. можно завести базу, где складываются не только айпи клиентов, но и их состояние - чтобы быть уверенным, что то или иное правило ДОЛЖНО БЫТЬ ВКЛЮЧЕНО или ОТКЛЮЧЕНО. при управлении с админки, к примеру, вы нажимаете "ВКЛ" на определённой записи и передаёте команду скрипту, выгребающему из БД данные об этой записи (айпи и состояние) и меняете его на противоположное, после чего загоняете обновлённые данные о состоянии обратно в базу.
пример скрипта автоматического отключения должников:
$result=mysql_query("SELECT ip,state FROM users WHERE cash<0");
while($array=mysql_fetch_array($result))
{
if($array["state"]!=0) rule_off($array["ip"]);
}
mysql_query("UPDATE users SET state=0 WHERE cash<0 and state!=0");
собственно, ничего сверъестественного здесь нет - сначала из базы мы выбрали всех, у кого "минус", потом "прошлись" по ним, заставив каждого, кто не отключен, отключиться, а потом - подали команду базе на изменение статуса всех "минусов", которые "онлайн" на "офф".
принцип прост, как палец обоссать...