может кому пригодиться cisco vpn disconnect

Технические вопросы по UTM 5.0
Ответить
Kapanir
Сообщения: 27
Зарегистрирован: Сб дек 17, 2005 12:44

может кому пригодиться cisco vpn disconnect

Сообщение Kapanir »

отключаем всех у кого баланс уходит за кредит с cisco-nas аля vpn

тут уже встречались похожие поделки на bash и perl.
сразу оговорюсь, я не кодер!!! скрип писался на коленке главное что работает. какие то моменты возможно можно более красиво реализовать.
на cisco должна быть включена поддержка snmp, скрипт вставляем в crontab
/3 * * * * root /netup/utm5/bin/vpn-disconnect.php >>/netup/utm5/log/vpn-status.log

будет бомбить должников каждые три минуты %)

#!/usr/bin/php
<?php
/* MySQL settings */
$db = 'UTM5'; //database name
$host = 'localhost'; //host name or ipaddr
$muser = 'user'; //mysql user

/* NAS-CISCO */
$nas_ip = '10.1.1.10'; //cisco nas
$RO = 'public'; //ro community
$RW = 'private'; //rw community
$OIDr = '1.3.6.1.4.1.9.9.150.1.1.3.1.2'; //no change (OID SNMPWALK)
$OIDw = '1.3.6.1.4.1.9.9.150.1.1.3.1.5.'; //no change (OID SNMPSET)
/* timestamp */
$date = date("Y-m-d H:i:s"); //time


$a = snmpwalkoid($nas_ip, $RO, $OIDr);
foreach ($a as $b => $c) {
$aaa = explode(".",$b);
$tunid = $aaa[9];

$qwe = explode(" ", $c);
$qwe1 = $qwe[1];
$kav = '"';
$login = str_replace($kav,"", $qwe1);


$link = mysql_connect($host, $muser) or die("Could not connect");
mysql_select_db($db) or die("Could not select database");

$query = "select balance, credit from accounts where id = (select account_id from service_links where id = (select id from iptraffic_service_links where is_deleted = '0' AND ip_group_id = (select ip_group_id from ip_groups where uname = '$login' AND is_deleted = '0')))";
$result = mysql_query($query) or die("Query failed" . mysql_error());

while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
if ($line[balance] < ($line[credit])*-1){
print "$date ALERT!!! login: $login balance:$line[balance] credit: $line[credit] \n";
$OIDrw = $OIDw . $tunid;
$snmpresult = snmpset($nas_ip, $RW, $OIDrw, "i", "1");
if ($snmpresult) { echo "Disconnect $login succeful!\n"; }
else { echo "snmpset error!\n"; }
}

//else
//print "$date OK! balance:$line[balance] \t\t credit:$line[credit] \t login:$login \n";
}
mysql_free_result($result);
mysql_close($link);
}

$count = count($a);
echo "$date Total session: $count \n";

Аватара пользователя
Magnum72
Сообщения: 1947
Зарегистрирован: Чт сен 22, 2005 06:54
Контактная информация:

Сообщение Magnum72 »

Убил бы.
Если пользователей в минусе больше например 100, скажем так тысяч 5. Это каждые 3 минуты на циску будет отправлятся 5000 запросов? Это моментально приведет к загрузке в 100 процентов маршрутизатора, через 3 минуты первый скрипт запустится не успеет.

Поэтому лучший вариант это выполнять этот скрипт чарез rfw, ну а для случаев если циска не успеет отработаь каой либо запрос, предусмотреть например раз в час запуск скрипта который сравнивает активные сессии по таблице dhs_sess_log и баланс у этих пользователей в таблице accounts

Витька
Сообщения: 236
Зарегистрирован: Вс дек 16, 2007 21:54

Сообщение Витька »

Ну, во-первых, надо определиться, зачем вообще нужно рубить чьи-то сессии, тем более по крону. У нас на событие выключения интернет повешано правило, добавляющее IP-юзера в блок-лист, после чего интернет у него пропадает без разрыва VPN.
Позже после внедрения раздачи динамики через услугу коммутируемого доступа мы столкнулись с тем, что IP-адрес в биллинге не хранится. На этот случай мы повесили правило на событие смены статуса блокировки. Если он отличен от нуля, то скрипту отдаётся DIALUP_LIST, логины из которого отдаются простенькому скрипту

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

#!/bin/sh

if &#91; -n $1 &#93;
then
  INTERFACE=$&#40;/usr/bin/rsh -l kill vpn.provider.net "show vpdn session state username $1 | include $1" | awk '&#123;print $4&#125;'&#41;
  if &#91; -n $INTERFACE &#93;
  then
    /usr/bin/rsh -l kill vpn.provider.net "clear interface $INTERFACE" &> /dev/null
  fi
fi
Вероятно, есть более простые способы. Это было первое, что пришло в голову.

Kapanir
Сообщения: 27
Зарегистрирован: Сб дек 17, 2005 12:44

Сообщение Kapanir »

Magnum72 писал(а):Убил бы.
Если пользователей в минусе больше например 100, скажем так тысяч 5. Это каждые 3 минуты на циску будет отправлятся 5000 запросов? Это моментально приведет к загрузке в 100 процентов маршрутизатора, через 3 минуты первый скрипт запустится не успеет.

Поэтому лучший вариант это выполнять этот скрипт чарез rfw, ну а для случаев если циска не успеет отработаь каой либо запрос, предусмотреть например раз в час запуск скрипта который сравнивает активные сессии по таблице dhs_sess_log и баланс у этих пользователей в таблице accounts
По своему опыту, могу сказать что не все знают cisco-ios, я например это "поделие" на дух не переношу, с помошью rfw я так полагаю вы предлагаете использовать что то типа acl т.е. это должно быть 5000 тыс правил deny? ей плохо от такого кол-ва не станет?

root@netup:~# time snmpwalk -On -v2c -c public 10.1.1.1 >/root/123123.123

real 0m15.531s
user 0m0.230s
sys 0m0.070s
root@netup:~# cat /root/123123.123 |wc -l
5415

time snmpwalk -On -v2c -c public 10.1.1.1 1.3.6.1.4.1.9.9.150.1.1.3.1.2 |wc -l
50
real
user 0m0.090s
sys 0m0.000s

т.е. опрос по snmp киско очень- очень - очень быстрый ...
не могу сказать как это будет работать на "энтерпрайз" решениях с онлайн 5000 тыс одновременных pptp туннелей (скорее циско загнется :) )... но для решений до 1000 одновременных туннелей ... мне кажется будет приемлемо.
Может ув. Magnum72 не проникся в саму суть ... суть такова, что нужно положить туннель клиента, резать файрволом я могу и на следующем маршрутизаторе . Да и потом как вы узнаете id tunnel?

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

Сообщение Pulse »

Kapanir писал(а):...
Может ув. Magnum72 не проникся в саму суть ... суть такова, что нужно положить туннель клиента, резать файрволом я могу и на следующем маршрутизаторе . Да и потом как вы узнаете id tunnel?
да суть понятна всем, по крону рубить тунели. вам пытаются сказать, что можно это делать именно в тот момент, когда его надо выключить. делается это с помощью событий аффектора rfw. http://www.netup.ru/articles.php?n=50

Аватара пользователя
Magnum72
Сообщения: 1947
Зарегистрирован: Чт сен 22, 2005 06:54
Контактная информация:

Сообщение Magnum72 »

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

#!/usr/bin/perl
use DBI;
if &#40;$#ARGV != 0&#41; &#123;
        print "Usage&#58; close_vpn.pl user_vpn_login\n";
        exit 64;
&#125;
$mysqlserver="1.1.1.1";
$dsn = "DBI&#58;mysql&#58;database=UTM5;host=$mysqlserver";
$dbh = DBI->connect&#40;$dsn, "user", "pass"&#41;;
my $login = $ARGV&#91;0&#93;;
$sth = $dbh->prepare&#40;"SELECT acctsessionid,nasipaddress FROM radutmp WHERE username='$login' ORDER BY acctstarttime DESC"&#41;;
$sth->execute&#40;&#41;;
while &#40;$ref = $sth->fetchrow_hashref&#40;&#41;&#41; &#123;
    my &#40;$sess_id,$nasipaddress&#41; = &#40;$ref->&#123;'acctsessionid'&#125;,$ref->&#123;'nasipaddress'&#125;&#41;;
    $sess_id = hex&#40;$sess_id&#41;;
    if &#40;$sess_id > 0&#41; &#123;
<------>if &#40;!`/usr/bin/snmpset -c commstring -v2c $nasipaddress 1.3.6.1.4.1.9.9.150.1.1.3.1.5.$sess_id i 1`&#41; &#123;
<------>    exit&#40;1&#41;;
<------>&#125;
    &#125;
&#125;
А это по поводу сколько циска тянет:

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

VPN12#sh vpdn ses

L2TP Session Information Total tunnels 7224 sessions 7224

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

Сообщение Pulse »

Magnum72 писал(а):
А это по поводу сколько циска тянет:

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

VPN12#sh vpdn ses

L2TP Session Information Total tunnels 7224 sessions 7224
ого, это чо за железка? ASR?

Аватара пользователя
Magnum72
Сообщения: 1947
Зарегистрирован: Чт сен 22, 2005 06:54
Контактная информация:

Сообщение Magnum72 »

Pulse писал(а):
Magnum72 писал(а):
А это по поводу сколько циска тянет:

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

VPN12#sh vpdn ses

L2TP Session Information Total tunnels 7224 sessions 7224
ого, это чо за железка? ASR?
Угу, но у меня их несколько, а вообще на 10G проце она вытягивает 12000 сессий.

Kapanir
Сообщения: 27
Зарегистрирован: Сб дек 17, 2005 12:44

Сообщение Kapanir »

Pulse писал(а):
Kapanir писал(а):...
Может ув. Magnum72 не проникся в саму суть ... суть такова, что нужно положить туннель клиента, резать файрволом я могу и на следующем маршрутизаторе . Да и потом как вы узнаете id tunnel?
да суть понятна всем, по крону рубить тунели. вам пытаются сказать, что можно это делать именно в тот момент, когда его надо выключить. делается это с помощью событий аффектора rfw. http://www.netup.ru/articles.php?n=50

спасибо, перечитал еще раз табличку и действительно есть возможность передать скрипту id_session cisco. в виду того что в далеком прошлом пытались получить от rfw нужный функционал без результата, собственно и не использовали на сборке 5.2.1 005 сейчас планируем переход на 008 попробую использовать его функционал.

Ответить