Показаны сообщения с ярлыком cisco. Показать все сообщения
Показаны сообщения с ярлыком cisco. Показать все сообщения

понедельник, сентября 10, 2012

Стырил с какого-то сайта - массовое изменение конфигурации cisco оборудования
clogin -c 'conf t; no ip http server; no ip http secure-server; end; wr mem' $(find /usr/local/var/rancid -maxdepth 2 -name router.db -exec awk -F: '$3 == "up" && $2 == "cisco" && $1 !~ /^#/ {print $1}' {} +)

#cisco

четверг, марта 11, 2010

поиск pppoe сессии по mac-address

Напомнили тут про скрипт, решил выложить.
Стояла задача, по маку пользователя найти его сессию и получить инфу, сессия pppoe.
можно и руками, но лень, закончилось скриптом на TCL.

if { $argc > 1 } {
puts "too more args, need one"
return 1
}
set cmd {show pppoe session }
append cmd {| include }
append cmd $argv
set mac_sess [exec $cmd]
if { $mac_sess == "" } {
return 1
}
set sess_int [regexp -nocase -line -inline {Vi[0-9]+} $mac_sess]

set u_info [exec "show caller interface $sess_int full"]

set tmp_list [regexp -nocase {User: (.*), line.*service (.*)\n.*Connected for
(.*),.*Idle for ([a-z0-9:]+).*remote ([0-9.]+).*\n} $u_info ignore u_login u_service
u_online u_idle u_remote_addr]

puts "I================================"
puts "I User login: $u_login"
puts "I================================"
puts "I int $sess_int : $u_remote_addr"
puts "I================================"
puts "I On-line: $u_online"
puts "I Idle: $u_idle"
puts "I Service: $u_service"
puts "I================================"

строка set tmp_list **** должна быть в одну линию, тут не поместилось в длинну.

пятница, февраля 19, 2010

пятница, декабря 04, 2009

Radius attribute rewrite

Столкнулся с проблемой, что при pppoe подключении не передается параметр Calling-station-ID, с мак адресом клиента. Нашлось удовлетворительное решение.

Как оказалось, в некоторых (?) версиях IOS, некоторые radius атрибуты железо от cisco пересылает несколько по другому, чем обычно.

В данном случае, речь о Radius атрибуте - Calling-station-ID, который передается от NAS к серверу AAA (тут - radius), при PPPoE подключении.
Так, вот, при подключении клиента, к NAS, посылается запрос на аутентификацию к radius серверу и в этом запросе, присутствует атрибут Calling-station-ID, в котором передается адрес клиента (mac адрес, при использовании pppoe).

Однако, есть софт, в котором этот атрибут не передается.
Только после аутентификации, в запросе на старт accounting, в поле vendor-specific attribute, на radius, передается параметр,

Cisco-AVPair = "client-mac-address=00a0.a000.1234"

Соответственно, при отключении клиента, передается запрос, на остановку accounting и параметр

Cisco-AVPair = "client-mac-address=00a0.a000.1234".

Существует проблема с некоторыми биллинговыми системами и их тех.поддержкой, например NetUP (а когда-то версия на perl, так замечательно распаковывалась).
NetUP, не умеет (а может умеет, но сапорт об этом не знает), вытаскивать информацию из vendor-specific attribute.
Судя по примерам конфигураций для NetUP radius cервера, они использовали, что-то стандартное (может и FreeRadius, возможно с переделками).
FreeRadius, также, как и многие другие radius сервера, умеет создавать/изменять атрибуты на лету, в том числе при акаунтинге.

Уметь-то, умеют, а как сделать? Потратив кучу времени на man, чтение документации на сайтах, замучив google и yandex, нашел только одно, реально полезное описание.

Так, как многие системы не поддаются изменению, либо поддаются, но для изменений нужно много сил, времени, тестирования и т.д., проще привести radius информацию к нужному виду, а именно, вытащить из vendor-specific attribute, так нужный mac адрес.

В radius.conf вписываем функцию

attr_rewrite macaddr {
attribute = Calling-Station-Id
searchfor = "[+ ]"
replacewith = "%{client-mac-address}"
new_attribute = yes
}


В разделе конфига preacct (вызывается перед accounting), указываем preprocess, в секции preprocess пишем macaddr, хотя можно попробовать, вписать сразу в preacct.
В словарь вписываем, нечто вроде
ATTRIBUTE client-mac-address 171 string
В итоге получаем:

Cisco-AVPair = "client-mac-address=00a0.a000.1234"
client-mac-address = "00a0.a000.1234"


Описание тут:
http://nixx.kursk.ru/conf/cisfreerad.html

вторник, октября 20, 2009

Допиливаю сборку конфигов с оборудования

По непонятным причинам, rancid, не мог собрать конфиги с двух железок и в логе постоянно писал - "End of run not found".
Оказалось, что забыл внести одну из команд в список разрешенных... странно, что всплыло только сейчас, спустя пять месяцев, после запуска системы (старт rancid).

Выявление проблемы:
Выясняем, что оборудование, для пользователя (и с сервера) доступно:
/usr/local/libexec/rancid/clogin hostName
hostName
spawn ssh -c 3des -x -l rancid_user hostName
rancid_user@thostName's password:
hostName#

А тут выясняем, почему отваливается:
/usr/local/libexec/rancid/rancid -d hostName
<skip>
HIT COMMAND:hostName#show env all
In ShowEnv: hostName#show env all
<skip>
hostName: End of run not found

Видно, что застревает на команде show env all.
Ага... сначала, подумал, что забыл добавить в разрешенные, однако, оказалось, что на разных версиях софта, команда пишется по разному...
На версиях 12.2.*, она так и есть - "show env all", а на 12.4.*, она выглядит "show environment all", а так как до tacacs команды доводятся полностью, одна и таже команда в консоли (show env all), на tacacs выглядит, для разных версий IOS по разному.
Ниже конфигурация пользователя, для tac_plus

user = rancid_user {
default service = deny
member = root_group
login = des "****"
service = exec {
priv-lvl=15
}
cmd = show {
permit boot
permit bootvar
permit c7200
permit "controllers*"
permit diag
permit diagbus
permit "env all"
permit "environment all"
permit "idprom backplane"
permit "install active"
permit flash
permit "gsr chassis"
permit module
permit running-config
permit "redundancy secondary"
permit "rsp chassis-info"
permit "spe version"
permit "variables boot"
permit version
permit vlan
permit "vtp status"
deny .*
}
cmd = write {
permit "terminal"
deny .*
}
cmd = dir {
permit .*
}

среда, июня 03, 2009

Автоматизированный backup конфигов с Сisco - Rancid

Заморочился приведением в порядок документации, конфигов и всего остального по сети.
Нашел все таки нормальную систему сбора конфигураций с оборудования.
Rancid - заходит на железо по telnet/ssh, вроде умеет rlogin (по моему rlogin уже давно не интересен) - http://www.shrubbery.net/rancid/.
Забирает конфиги, складывает локально в cvs, финальную сборку конфига каждой железки кладет файлом, понимает и умеет обращаться с железом разных производителей (cisco, juniper, nortel, etc), т.е. собирает разные версии, хранит в cvs, различия версий отправляет на почту.
Вылезла ошибка о невозможности найти окончание кофига, думал проблема с terminal length и постраничным выводом конфига, оказалось не все команды разрешил в tacacs.
Наткнулся на проблему с отправкой уведомлений об изменении конфигурации, оказалось запретил в pf обращение к локальному почтовику (localhost).
Единственная реальная сложность, которая меня коснулась в том, что Rancid, не знает новое оборудование cisco, т.к. давно не обновляется, но и это решаемо, есть патчи
http://www.packetmischief.ca/code/rancid/

суббота, июля 26, 2008

Осваиваю TCL

Решил посмотреть на свитче, какие ip с каких портов приходят, задумался...
по snmp конечно хорошо, да еще и по расписанию если, да еще и в базу и страничку на вебе...
Начал гуглить, не нагуглилось как-то, подумал написать, подумал, что лениво...
Надумал сделать на TCL и запускать прямо на свитче, вроде как проще.
Оказалось, что не совсем проще, учитывая, что регулярные выражения каждый раз вспоминаю по доке и язык не известный.
С написанием и отладкой ковырялся полдня:) Глючная штука, по моему из консоли show ip arp | include 10 работает нормально, а из скрипта вместо кучи строк, показало три, решил, что выборку можно сделать в скрипте или уже результаты работы скрипта фильтровать. Тестировал на 3560-PS-S 12.2(40), на другом железе, может потребоваться редактирование regex'а, который вытаскивает int, т.к. вывод на 3560 и 4500 отличается.
Оказалось напрасно я возился, свитч, на котором vlan терминируется не поддерживает tcl, прошивать его не але, перерыв сервиса, лениво.
Может кому пригодится

proc get_ints {} {
#puts "BEFORE\n"
set check ""
set arp_out [exec "show ip arp\n"]

set mylist [regexp -all -nocase -line -inline {[A-Fa-f0-9]{4}\.[A-Fa-f0-9]{4}\.[A-Fa-f0-9]{4}} $arp_out]

#puts "MYLIST $mylist\n"
array set ints_out {}
set i 0
set int ""

foreach mac_addr $mylist {

set mac_out [ exec "show mac address-table address $mac_addr\n" ]
set int [regexp -all -nocase -line -inline {[a-z]*[0-9]/[0-9]*} $mac_out]
set ip_out [exec "show ip arp $mac_addr\n"]
set ip [regexp -all -nocase -line -inline {[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*} $ip_out]


puts "$ip : $mac_addr : $int"

}

#return $int
}

puts ""
puts [eval get_ints]

воскресенье, февраля 17, 2008

работа, работа, работа... учеба

Переработал, перечитал...
Пишу проекты, планирую, считаю, голова пухнет.
Надоело читать с компа, заказал "библиотеку" по сертификации на CCNP.
Правда CCNA до сих пор не сдан, похоже кусками CCNA придется просто выучить (всякие ISDN и Frame Relay) и идти сдавать все пачкой.