Скрипт для привязки mac-ip для UTM5
Скрипт для привязки mac-ip для UTM5
Откроем тему
Это творение производит привязку mac-ip на запускаемом хосте, получая данные из базы UTM. Производится привязка ip-mac у незаблокированых административной блокировкой и у которых кредит+балансе>$balance. Остальные забиваются тем что указано в $ban. Запускать, например по крону указав сеть в качестве параметра, например "arps 192.168.1.".
Пользователь $username должен иметь права на select в таблицах: iptraffic_service, accounts, ip_groups, service_links;
Код:
#!/usr/local/bin/php
<?php
$network=$argv[1];
$balance=-15;
$ban="ff:ff:ff:ff:ff:ff";
$x=0;
$hostname = "utm5_DB_ip";
$username = "utm5_arp";
$password = "password";
$dbname = "UTM5";
#----------------
$link = mysql_connect($hostname,$username,$password) OR DIE ("Can't connect");
@mysql_select_db("$dbname") or die ("Can't select db");
$query = "SELECT INET_NTOA(ip_groups.ip + 4294967296 ), ip_groups.mac FROM ip_groups LEFT JOIN iptraffic_service_links ON iptraffic_service_links.ip_group_id=ip_groups.ip_group_id LEFT JOIN service_links ON service_links.id=iptraffic_service_links.id LEFT JOIN accounts ON accounts.id=service_links.account_id where ip_groups.is_deleted=0 and ip_groups.ip > -1062731776 and ip_groups.ip < -1062666241 and (accounts.balance+accounts.credit)>$balance and accounts.is_blocked < 17 and ip_groups.mac<>'' and INET_NTOA(ip_groups.ip + 4294967296 ) like '%$network%' GROUP BY ip_groups.ip;";
$result = mysql_query($query);
while($row = mysql_fetch_array($result)) {
$iparray[$x]=($row[0]);
$macarray[$x]=($row[1]);
$x++;
}
mysql_free_result($result);
mysql_close($link);
$x=0;
for ($i=2; $i<=254; ++$i) {
$checkip=$network.$i;
if (in_array($checkip,$iparray)) { # echo date("d.m.y H.i.s"), " +", $checkip, " ", $macarray[$x],"\n";
$f="/sbin/arp -s $checkip $macarray[$x] \n";
exec ($f,$junk,$ret);
$x++;
if ($ret !=0) {
echo("cant execute arp, check sudoers");
echo $junk;
print implode(",", $junk);
} }
else { # echo date("d.m.y H.i.s"), " -",$checkip," ", $ban ," \n";
$f="/sbin/arp -s $checkip $ban\n";
exec ($f,$junk,$ret);
if ($ret !=0) {
echo("cant execute arp, check sudoers");
echo $junk;
print implode(",", $junk);
} } }
reset($iparray);
unset($iparray);
reset($macarray);
unset($macarray);
?>
Это творение производит привязку mac-ip на запускаемом хосте, получая данные из базы UTM. Производится привязка ip-mac у незаблокированых административной блокировкой и у которых кредит+балансе>$balance. Остальные забиваются тем что указано в $ban. Запускать, например по крону указав сеть в качестве параметра, например "arps 192.168.1.".
Пользователь $username должен иметь права на select в таблицах: iptraffic_service, accounts, ip_groups, service_links;
Код:
#!/usr/local/bin/php
<?php
$network=$argv[1];
$balance=-15;
$ban="ff:ff:ff:ff:ff:ff";
$x=0;
$hostname = "utm5_DB_ip";
$username = "utm5_arp";
$password = "password";
$dbname = "UTM5";
#----------------
$link = mysql_connect($hostname,$username,$password) OR DIE ("Can't connect");
@mysql_select_db("$dbname") or die ("Can't select db");
$query = "SELECT INET_NTOA(ip_groups.ip + 4294967296 ), ip_groups.mac FROM ip_groups LEFT JOIN iptraffic_service_links ON iptraffic_service_links.ip_group_id=ip_groups.ip_group_id LEFT JOIN service_links ON service_links.id=iptraffic_service_links.id LEFT JOIN accounts ON accounts.id=service_links.account_id where ip_groups.is_deleted=0 and ip_groups.ip > -1062731776 and ip_groups.ip < -1062666241 and (accounts.balance+accounts.credit)>$balance and accounts.is_blocked < 17 and ip_groups.mac<>'' and INET_NTOA(ip_groups.ip + 4294967296 ) like '%$network%' GROUP BY ip_groups.ip;";
$result = mysql_query($query);
while($row = mysql_fetch_array($result)) {
$iparray[$x]=($row[0]);
$macarray[$x]=($row[1]);
$x++;
}
mysql_free_result($result);
mysql_close($link);
$x=0;
for ($i=2; $i<=254; ++$i) {
$checkip=$network.$i;
if (in_array($checkip,$iparray)) { # echo date("d.m.y H.i.s"), " +", $checkip, " ", $macarray[$x],"\n";
$f="/sbin/arp -s $checkip $macarray[$x] \n";
exec ($f,$junk,$ret);
$x++;
if ($ret !=0) {
echo("cant execute arp, check sudoers");
echo $junk;
print implode(",", $junk);
} }
else { # echo date("d.m.y H.i.s"), " -",$checkip," ", $ban ," \n";
$f="/sbin/arp -s $checkip $ban\n";
exec ($f,$junk,$ret);
if ($ret !=0) {
echo("cant execute arp, check sudoers");
echo $junk;
print implode(",", $junk);
} } }
reset($iparray);
unset($iparray);
reset($macarray);
unset($macarray);
?>
Столкнулся с проблемой. В базу была неверно забита связка mac-ip, потом яя ее удалил из веб-интерфейса, но в arp.tbl она все равно переносиласть, в связи с чем предлагаю следующее усовершенстрование скрипта:dalex писал(а):у меня проще берутся все сопоставления из базы
/usr/bin/mysql -u user --password="password" -e "select inet_ntoa(4294967295 & ip), mac from ip_groups WHERE mac!='' and is_deleted=0;" UTM5|grep -v -w mac >/tmp/arp.tbl
/sbin/arp -f /tmp/arp.tbl
/bin/rm -f /tmp/arp.tbl
То есть переносить только не удаленные связки mac-ip
Сорри не въехал сразу. У такого подхода есть минусы - во первых неизвестно не будет ли в какой то момент в кеше запись с неправльным маком и она внесетя в связку (обновлять то придется периодически).Да вроде как берут mac из базы. А UTM4 брал из кэша arp...
А так все просто парсится вывод команды arp на предмет убирания лишних данных а затем передается опять же arp -f. ИМХО только из базы брать правильнее.
Re: Скрипт для привязки mac-ip для UTM5
смени МАСNick писал(а):
$ban="ff:ff:ff:ff:ff:ff";
ff:ff:ff:ff:ff:ff в некоторых случаях воспринимается Фрей как броадкаст
А в случае когда на 2х хостах, то где запускать скрипты arp.sh и utm5_arp.pl?
1)Ядро, радиус, БД, веб
2)Фаер, коллектор, впн, rfw
А то просисал в консоле админа у юзера Ip, name , pass, MAC(любой) он логинится как ни в чём не бывало на любом компе.
Пробывал запускать на сервере с ядром...
В чём баг?
1)Ядро, радиус, БД, веб
2)Фаер, коллектор, впн, rfw
А то просисал в консоле админа у юзера Ip, name , pass, MAC(любой) он логинится как ни в чём не бывало на любом компе.
Пробывал запускать на сервере с ядром...
Код: Выделить всё
# ./utm5_arp.pl
Inserted ip/mac 192.168.1.17/00:0e:a6:4e:73:c8 to database
Inserted ip/mac 192.168.2.1/00:50:bf:03:d0:7c to database
# ./arp.sh
arp: invalid Ethernet address '001195E3A442'
arp: writing to routing socket: No such process
arp: 172.16.0.50: No such process
arp: writing to routing socket: No such process
Я уж не знаю, что в этом скрипте, но вывод достаточно однозначный - у тебя MAC адрес в неправильной форме, надо отдавать через двоеточия, а у тебя слитно.-|LSV|- писал(а): # ./arp.sh
arp: invalid Ethernet address '001195E3A442'
arp: writing to routing socket: No such process
arp: 172.16.0.50: No such process
arp: writing to routing socket: No such process
[/code]
В чём баг?
http://asc.kiev.ua/utm/arp.pl.txt
перловая скриптина, облегчающая задачу импорта в арп нужные связки...
перловая скриптина, облегчающая задачу импорта в арп нужные связки...