UTM+D-Link DES 3523
UTM+D-Link DES 3523
http://www.dlink.ru/products/prodview.p ... =13&id=407
Вот ссылка на железку. Модно ли сделать так, чтобы по SNMP УТМ'ка отрубала (скажем уберало из списка правил фаера на комутаторе правило, разрешающее пользователю доступ через определенный порт) пользователя. Предположим - в базе есть пользователь с тарифом, с подключенной периодической услугой. Абонентка снимается раз в сутки. Если денег на счету не достаточно, то сносим правила для данного пользователя для того порта, на который он подключен. Если я не ошибаюсь, то где то видел на форуме скрипт для управления 33 Длинком по СНМП, но в этот раз найти его не смог. Может мне кто нибудь помочь с этим вопросом, хотя бы сказать в каком направлении копать.
Вот ссылка на железку. Модно ли сделать так, чтобы по SNMP УТМ'ка отрубала (скажем уберало из списка правил фаера на комутаторе правило, разрешающее пользователю доступ через определенный порт) пользователя. Предположим - в базе есть пользователь с тарифом, с подключенной периодической услугой. Абонентка снимается раз в сутки. Если денег на счету не достаточно, то сносим правила для данного пользователя для того порта, на который он подключен. Если я не ошибаюсь, то где то видел на форуме скрипт для управления 33 Длинком по СНМП, но в этот раз найти его не смог. Может мне кто нибудь помочь с этим вопросом, хотя бы сказать в каком направлении копать.
-
- Сообщения: 1612
- Зарегистрирован: Пт ноя 10, 2006 15:23
а дропнул кто-то тему где я скриптик писал
скрипт привязан к тарифам, нужно править SQL
юзать ./script.pl start on - включить нужные порты
./script.pl start off - выключить порты
Код: Выделить всё
#!/usr/bin/perl -w
use strict;
use DBI;
use Net::SNMP;
# $ARGV
my $cmd = $ARGV[0];
my $do = $ARGV[1];
my $sth = '';
my $onoff = '';
#db config
my $utmdb_host = "10.111.1.1";
my $utmdb_db = "UTM5";
my $utmdb_user = "utm5";
my $utmdb_pass = "ТУТПАРОЛЬ";
#snmp config
#Usage port $onoff = 1 - up, $onoff = 2 - down
my $community = "manager";
sub help {
print "Usage: $0 start { on | off }\n";
exit 1;
}
sub snmp_dlink_sw_port {
#$onoff = 1 - up, $onoff = 2 - down
my($ip, $community, $port, $onoff) = @_;
if (open(OUT, ">>/var/log/snmp_sw")) {
my $timestamp = localtime time;
print(OUT "$timestamp");
print(OUT " $ip $port $do \n ");
} else {print "Error open file";}
close(OUT);
my($session, $error) = Net::SNMP->session(
Version => '2c',
hostname => $ip,
Community => $community
);
die "session error: $error\n" if $error;
my $result = $session->set_request(
".1.3.6.1.2.1.2.2.1.7.".$port,INTEGER,$onoff
);
die "request error: ".$session->error unless (defined $result);
$session->close();
}
sub connect_db {
my $dsn = "DBI:mysql:database=$utmdb_db;mysql_client_found_rows=1";
$dsn .= ";host=$utmdb_host" if $utmdb_host;
my $dbh = DBI->connect($dsn, $utmdb_user, $utmdb_pass, {
RaiseError => 1,
});
$dbh;
}
defined $ARGV[0] or help();
if($cmd eq 'start') {
my $dbh = connect_db();
# kogo vkluchat
my $query = "
SELECT
inet_ntoa(4294967295 & r.router_bin_ip) AS rip,
r.login,
r.password,
u.id,
u.port_number,
atlink.tariff_id
FROM accounts as acc, users as u, routers_info as r, account_tariff_link as atlink
WHERE
not atlink.is_deleted
and atlink.account_id = acc.id
and u.basic_account = acc.id
and r.id = u.remote_switch_id
and not acc.is_deleted
and ( (acc.balance > '0' and atlink.tariff_id = '13' )
or (acc.balance > '-200' and atlink.tariff_id = '14' )
or (acc.balance > '0' and atlink.tariff_id = '15')
)
";
# kogo vikluchat
my $query2 = "
SELECT
inet_ntoa(4294967295 & r.router_bin_ip) AS rip,
r.login,
r.password,
u.id,
u.port_number,
atlink.tariff_id
FROM accounts as acc, users as u, routers_info as r, account_tariff_link as atlink
WHERE
not atlink.is_deleted
and atlink.account_id = acc.id
and u.basic_account = acc.id
and r.id = u.remote_switch_id
and not acc.is_deleted
and ( (acc.balance <= '0' and atlink.tariff_id = '13')
or (acc.balance <= '-200' and atlink.tariff_id = '14')
or (acc.balance <= '0' and atlink.tariff_id = '15')
)
";
# $do = 'on'; #dbg
if ($do eq 'on'){
$sth = $dbh->prepare($query);
$onoff = '1';
$sth->execute();
}
elsif ($do eq 'off') {
$sth = $dbh->prepare($query2);
$onoff = '2';
$sth->execute();
}
while (my $ref = $sth->fetchrow_hashref()) {
my $ip = $ref -> {'rip'};
my $port = $ref -> {'port_number'};
my $id = $ref -> {'id'};
my $login = $ref -> {'login'}; #SNMPv3
my $password = $ref -> {'password'}; #SNMPv3
print " $id $ip $port \n"; #dbg
#$onoff = 1 - up, $onoff = 2 - down
my $exec = snmp_dlink_sw_port($ip,$community,$port,$onoff);
}
} else {
help();
}
юзать ./script.pl start on - включить нужные порты
./script.pl start off - выключить порты
Нашел тут эту тему. Отписываюсь о результатах. Может кто столкнется с такой проблеммой. Сделал рулежку по телнету и с работой по ACL листу а не по портам, что гораздо гибче и удобнее, чем просто включение или выключение порта (например оставить пользователю гостевой доступ на к-либо сервер для пополнения баланса). Вобщем кому надо пишите - скину скрипт с подробным описанием что к чему. Може кому времени это и сэкономит.
З.Ы. Этот механизм впринципе при незначительных доработках можно использовать асболютно для любого устройства, которое поддерживает подключение по телнету (или ккой там модуль перла использовать, такой тип подключения и доступен) и наличие какого либо ACL или вообще возможность выполнения любой команды для блокировки пакетов по определнным атрибутам, присущим данному пользователю.
З.Ы. Этот механизм впринципе при незначительных доработках можно использовать асболютно для любого устройства, которое поддерживает подключение по телнету (или ккой там модуль перла использовать, такой тип подключения и доступен) и наличие какого либо ACL или вообще возможность выполнения любой команды для блокировки пакетов по определнным атрибутам, присущим данному пользователю.
А можно поподробнее про expect. Это где такая функция: в SQL, Perl, shell? Ну и примерчик, если можно. Хотелось бы перенастраивать на свитчах привязку IP-MAC-Port и редактировать ACL-ы не по крону, а сразу же, как только произошли изменения в базе. Причём желательно знать как новые (изменённые), так и старые данные, которые были в базе до изменения, например старый MAC-адрес пользователя. Такое вообще возможно?dalex писал(а):а по телнету не проще?
пишешь на expect сценарий и вперед
Отвечу сам себеsire писал(а):А можно поподробнее про expect. Это где такая функция: в SQL, Perl, shell? Ну и примерчик, если можно. Хотелось бы перенастраивать на свитчах привязку IP-MAC-Port и редактировать ACL-ы не по крону, а сразу же, как только произошли изменения в базе. Причём желательно знать как новые (изменённые), так и старые данные, которые были в базе до изменения, например старый MAC-адрес пользователя. Такое вообще возможно?dalex писал(а):а по телнету не проще?
пишешь на expect сценарий и вперед

Гугл рулит, нашёл, что такое expect (http://en.wikipedia.org/wiki/Expect) - ещё один способ общения с сервером telnet


И ещё один вопрос, кто-нибудь знает как вытащить из биллинга IP-адрес свитча, а не его имя. Параметр SWITCH_IP, используемый в правилах firewall задаёт имя, а имя уникально у каждой копии utm5-rfw. А мне нажо так, чтобы один utm5-rfw рулил несколькими свитчами, чтобы не запускать для кажлого свитча в сети отдельную копию utm5-rfw.
-
- Сообщения: 116
- Зарегистрирован: Вт май 15, 2007 12:50