Для этого на сервере биллинга по крону раз в 5 минут запускаем следующий php-скрипт:
Код: Выделить всё
<?
ini_set("error_reporting", E_ERROR ^ E_WARNING);
#nastroiki mysql
@ $db = @mysql_pconnect ("localhost", "login", "pass");
mysql_select_db("abills");
#file dlya vyvoda pravil iptables
@$outputfile = fopen ("/didan/fire/list/rules_billing", "w");
fwrite ($outputfile, "#billing.didan IPT configuration v 2.1 \n");
fwrite ($outputfile, "#zulu_gluk (C) core.didan@gmail.com \n");
fclose ($outputfile);
global $accepted, $denied;
#gde lejit iptables
$ipt = "/sbin/iptables";
$sql1 = "select uid, credit, disable from users";
$query1 = mysql_query($sql1);
@$outputfile = fopen ("/didan/fire/list/rules_billing", "a");
while ($users = mysql_fetch_array($query1)) {
$check=0;
$sql2 = "select cid, disable from dv_main where uid='$uid'";
$sql3 = "select pasport_grant from users_pi where uid='$uid'";
$sql4 = "select deposit from bills where uid ='$uid'";
$query2 = mysql_query($sql2);
$query3 = mysql_query($sql3);
$query4 = mysql_query($sql4);
#Proverim balans i kredit usera. esli balans+credit<-10 to ne puskat' v set'
$uid = $users[uid];
$bills = mysql_fetch_array($query4);
$dv_main = mysql_fetch_array($query2);
$credit = $users[credit];
$deposit = $bills[deposit];
if (($deposit+$credit)>-10) {
#Proverim ne otklyuchen li user
$disable = $users[disable];
if ($disable == 0) {
#Proverim pravilnost' MAC adresa. na kajdom ip mojet byt' neskolko MAC (PC i notebook u odnogo usera)
#MACi berem iz polya pasport_grant )
$mac_array = mysql_fetch_array($query3);
$mac = explode (";", $mac_array[pasport_grant]);
$ip_array = explode (".", $dv_main[cid]);
$i = 0;
while ($mac[$i]) {
$mac_array = explode (":", $mac[$i]);
if ($mac[$i]!=="00:00:00:00:00:00") {
if ($mac_array[0]) {
if ($mac_array[1]) {
if ($mac_array[2]) {
if ($mac_array[3]) {
if ($mac_array[4]) {
if ($mac_array[5]) {
#Proveryaem pravilnyi format ip. U nas vse vnutrennie ip v sety 172.17.0.0/16
#IP hranim v pole CID
if ($ip_array[0]=="172") {
if ( $ip_array[1]=="17") {
if ($ip_array[2]<255) {
if ($ip_array[3]<255) {
$good_mac=trim($mac[$i]);
$vlan=$ip_array[2];
#Pishem v file pravilo dlya razresheniya paketov s adresa
fwrite ($outputfile, $ipt." -A FORWARD -s ".$dv_main[cid]." -m mac --mac-source ".$good_mac." -i vlan0".$vlan." -j ACCEPT"."\n");
$accepted=$accepted+1;
$check=1;
}
}
}
}
}}}}}}}
$i = $i + 1;
}}}
if ($check==0){
$denied=$denied+1;
}
}
fclose ($outputfile);
mysql_close();
echo "Accepted ".$accepted."\n";
echo "Denied ".$denied."\n";
?>
На роутере каждые 5 минут скачиваем с биллинга этот файлик смотрим не изменился ли он, если изменился - запускаем.