UTM+D-Link DES 3523

Технические вопросы по UTM 5.0
hammer
Сообщения: 286
Зарегистрирован: Сб янв 20, 2007 22:58
Контактная информация:

UTM+D-Link DES 3523

Сообщение hammer »

http://www.dlink.ru/products/prodview.p ... =13&id=407
Вот ссылка на железку. Модно ли сделать так, чтобы по SNMP УТМ'ка отрубала (скажем уберало из списка правил фаера на комутаторе правило, разрешающее пользователю доступ через определенный порт) пользователя. Предположим - в базе есть пользователь с тарифом, с подключенной периодической услугой. Абонентка снимается раз в сутки. Если денег на счету не достаточно, то сносим правила для данного пользователя для того порта, на который он подключен. Если я не ошибаюсь, то где то видел на форуме скрипт для управления 33 Длинком по СНМП, но в этот раз найти его не смог. Может мне кто нибудь помочь с этим вопросом, хотя бы сказать в каком направлении копать.

mikkey finn
Сообщения: 1612
Зарегистрирован: Пт ноя 10, 2006 15:23

Сообщение mikkey finn »

man snmpset =)
Заодно изучение D-Link SNMP FAQ.
кстати, если на каждый порт не больше одного клиента, то можно просто отключать порт, а не мучаться с ACL.

Pulse
Сообщения: 945
Зарегистрирован: Вт окт 03, 2006 12:58

Сообщение Pulse »

а дропнул кто-то тему где я скриптик писал

Код: Выделить всё

#!/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 &#40;    &#40;acc.balance <= '0' and atlink.tariff_id = '13'&#41;
                or &#40;acc.balance <= '-200' and atlink.tariff_id = '14'&#41;
                or &#40;acc.balance <= '0' and atlink.tariff_id = '15'&#41;
             &#41;
        ";
                                                                                                              
#   $do = 'on'; #dbg

  if &#40;$do eq 'on'&#41;&#123;
       $sth = $dbh->prepare&#40;$query&#41;;
      $onoff = '1';
      $sth->execute&#40;&#41;;
  &#125;
  elsif &#40;$do eq 'off'&#41; &#123;
      $sth = $dbh->prepare&#40;$query2&#41;;
      $onoff = '2';
      $sth->execute&#40;&#41;;
  &#125;

  while &#40;my $ref = $sth->fetchrow_hashref&#40;&#41;&#41; &#123;
    my $ip = $ref -> &#123;'rip'&#125;;
    my $port = $ref -> &#123;'port_number'&#125;;
    my $id = $ref -> &#123;'id'&#125;;
    my $login = $ref -> &#123;'login'&#125;; #SNMPv3
    my $password = $ref -> &#123;'password'&#125;; #SNMPv3
    print " $id $ip $port \n"; #dbg
     #$onoff = 1 - up, $onoff = 2 - down
    my $exec = snmp_dlink_sw_port&#40;$ip,$community,$port,$onoff&#41;;
  &#125;

&#125; else &#123;
  help&#40;&#41;;
&#125;

скрипт привязан к тарифам, нужно править SQL
юзать ./script.pl start on - включить нужные порты
./script.pl start off - выключить порты

Аватара пользователя
dalex
Сообщения: 1306
Зарегистрирован: Пт янв 21, 2005 11:54

Сообщение dalex »

а по телнету не проще?
пишешь на expect сценарий и вперед

hammer
Сообщения: 286
Зарегистрирован: Сб янв 20, 2007 22:58
Контактная информация:

Сообщение hammer »

Нашел тут эту тему. Отписываюсь о результатах. Может кто столкнется с такой проблеммой. Сделал рулежку по телнету и с работой по ACL листу а не по портам, что гораздо гибче и удобнее, чем просто включение или выключение порта (например оставить пользователю гостевой доступ на к-либо сервер для пополнения баланса). Вобщем кому надо пишите - скину скрипт с подробным описанием что к чему. Може кому времени это и сэкономит.

З.Ы. Этот механизм впринципе при незначительных доработках можно использовать асболютно для любого устройства, которое поддерживает подключение по телнету (или ккой там модуль перла использовать, такой тип подключения и доступен) и наличие какого либо ACL или вообще возможность выполнения любой команды для блокировки пакетов по определнным атрибутам, присущим данному пользователю.

Pulse
Сообщения: 945
Зарегистрирован: Вт окт 03, 2006 12:58

Сообщение Pulse »

довай канечно пащупаем.... gorbushka at mail.ru

sire
Сообщения: 21
Зарегистрирован: Пт июн 22, 2007 13:13

Сообщение sire »

Я сам начал писать скрипт для DES-3526. Управлять свитчём уже могу (доступ в инет через ACL и привязка IP-MAC-Port). Осталось сделать интеграцию с базой биллинга. Было бы сдорово, если бы не пришлось писать эту часть самому.
sire (at) mail.ru. Заранее спасибо.

sire
Сообщения: 21
Зарегистрирован: Пт июн 22, 2007 13:13

Сообщение sire »

dalex писал(а):а по телнету не проще?
пишешь на expect сценарий и вперед
А можно поподробнее про expect. Это где такая функция: в SQL, Perl, shell? Ну и примерчик, если можно. Хотелось бы перенастраивать на свитчах привязку IP-MAC-Port и редактировать ACL-ы не по крону, а сразу же, как только произошли изменения в базе. Причём желательно знать как новые (изменённые), так и старые данные, которые были в базе до изменения, например старый MAC-адрес пользователя. Такое вообще возможно?

sire
Сообщения: 21
Зарегистрирован: Пт июн 22, 2007 13:13

Сообщение sire »

sire писал(а):
dalex писал(а):а по телнету не проще?
пишешь на expect сценарий и вперед
А можно поподробнее про expect. Это где такая функция: в SQL, Perl, shell? Ну и примерчик, если можно. Хотелось бы перенастраивать на свитчах привязку IP-MAC-Port и редактировать ACL-ы не по крону, а сразу же, как только произошли изменения в базе. Причём желательно знать как новые (изменённые), так и старые данные, которые были в базе до изменения, например старый MAC-адрес пользователя. Такое вообще возможно?
Отвечу сам себе :-)
Гугл рулит, нашёл, что такое expect (http://en.wikipedia.org/wiki/Expect) - ещё один способ общения с сервером telnet :-) Я для этих целей использую модуль Perl Net::Telnet, но это не важно.

:?: Вопрос по поводу того, как в реальном времени отслеживать изменения в БД биллинга, чтобы перенастраивать свитчи сразу, а не по крону, остаётся актуальным.

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

Аватара пользователя
Ata-man
Сообщения: 427
Зарегистрирован: Пт янв 21, 2005 10:04
Откуда: Екатеринбург

Сообщение Ata-man »

Сам писал скрипт для 3526 - управление IP-MAC-PORT Binding по SNMP. Было бы интересно взглянуть на ваш. Пожалуйста на Ata-Man(dog)list.ru

Mental Noize
Сообщения: 116
Зарегистрирован: Вт май 15, 2007 12:50

Сообщение Mental Noize »

А если УТМ и свич находятся в разных вланах? 3526 2-го же уровня как быть? Можно ли сначало на свич 3 уровня залезть и с него отдать команду? Или потребуется отдельный комп с тем же вланом что и свич?

Аватара пользователя
Ata-man
Сообщения: 427
Зарегистрирован: Пт янв 21, 2005 10:04
Откуда: Екатеринбург

Сообщение Ata-man »

У нас на сервер с UTM помимо обычного канала заведен еще и управляющий vlan для контроля коммутаторов.

G@rik
Сообщения: 74
Зарегистрирован: Чт май 18, 2006 18:47

Сообщение G@rik »

если можно, и мне скрипты киньте... grkmail at inbox.ru

unlnkd
Сообщения: 9
Зарегистрирован: Вт дек 13, 2005 16:34

Сообщение unlnkd »

и мне vladimir at obnisk.org

hammer
Сообщения: 286
Зарегистрирован: Сб янв 20, 2007 22:58
Контактная информация:

Сообщение hammer »

На последнее мыло не отправляется. На данный момент решил привинтить возможность с веба доступа администратору к управлению сразу всеми маршрутизаторами. Тестирую. + все таки буду пробовать сделать так чтобы скрипт реагировал на изменение в базе данных а не работал по крону.

Закрыто