Добрый день.Схема сети.
Cisco 3825
2 провайдера, интернет от которых получаем по BGP.
Своя автономка.
Интернет клиентам раздаётся путём выделения каждому своего vlan-а.На просторах интернета найден скрипт, забирающий и парсящий реестр раз в сутки и создающий на его основе два access-листа. Один для nginx, второй для cisco.
На cisco создан access-list "rzs" а так же route-map на основе данного листа, заворачивающий весть трафик до определённых IP на хост с nginx, который выступает прокси-сервером.
# show route-map rzs
route-map rzs, permit, sequence 1
Match clauses:
ip address (access-lists): rzs
Set clauses:
ip next-hop 1.2.3.4
Policy routing matches: 0 packets, 0 bytes# show ip access-lists rzs
Extended IP access list rzs
10 permit tcp any host 103.31.186.56 eq www 443
20 permit tcp any host 103.31.186.73 eq www 443
30 permit tcp any host 108.162.192.166 eq www 443
....
Задача.
Ограничить всем клиентам доступ к определённым ресурсам(реестр запрещённых сайтов).
Пробовал вешать данный route-map на интерфейсы провайдеров и на BGP-пиров, но результата не получил.
Необходимо из под линукс, при помощи TCL или expect повесить route-map на все существующие клиентские интерфейсы(Gi0/1.XXX), а так же автоматизировать пере-генерацию access-list.
Вариант с "interface range" не подходит, т.к. клиентские vlan-ы идут не по порядку и в результате выполнения этой команды создаются недостающие интерфейсы.
Перечитал много форумов и примеров tcl-скриптов, но сделать то что нужно не получается.
Если поможете повесить route-map на BGP, буду очень благодарен.
Останется тогда лишь автоматизировать пере-генерацию access-list на cisco.Прошу помощи.
Как работать с expect разобрался.
set timeout 5
set hostname "1.2.3.4"set username "user"
set password "pass"spawn ssh $username@$hostname
expect "Password:" {
send "$password\n"
expect "#"
send "terminal width 0\n"
expect "#"
send "terminal length 0\n"
expect "#"
send "sh int | i GigabitEthernet0/1.\n"
expect "#"
send "q\n"Нужна только помощь в инструкции для expect которая бы из запhоса "sh int" выуживала бы только имена интерфейсов и создавала бы файлик с именами этих интерфейсов.
>[оверквотинг удален]
> expect "#"
> send "terminal length 0\n"
> expect "#"
> send "sh int | i GigabitEthernet0/1.\n"
> expect "#"
> send "q\n"
>
Добрый день!
Мне кажется, Вы нашли несколько нетривиальный подход к этой задаче.
Однако, если хочется сделать именно так, то данные, полученные expect'ом, сохраняются в массиве expect_out - элементы массива expect_out(buffer) (вся полученная/отброшенная инфа, в завимости от выражения), expect_out(1,string) (соответствие первому подшаблону регулярки), и так 2..9,string.
Подробнее в man expect.
Еще - парсить удобнее построчный вывод, к примеру, после вывода команды show interfaces description.
> Добрый день!
> Мне кажется, Вы нашли несколько нетривиальный подход к этой задаче.Нашёл то что лежало на поверхности.
Если есть более удобный и простой способ решить поставленную задачу, буду благодарен за совет.> Однако, если хочется сделать именно так, то данные, полученные expect'ом, сохраняются в
> массиве expect_out - элементы массива expect_out(buffer) (вся полученная/отброшенная
> инфа, в завимости от выражения), expect_out(1,string) (соответствие первому подшаблону
> регулярки), и так 2..9,string.
> Подробнее в man expect.
> Еще - парсить удобнее построчный вывод, к примеру, после вывода команды show
> interfaces description.Если не трудно, приведите пример исходя из приведённого выше скрипта.
Спасибо!
>> Добрый день!
>> Мне кажется, Вы нашли несколько нетривиальный подход к этой задаче.
> Нашёл то что лежало на поверхности.
> Если есть более удобный и простой способ решить поставленную задачу, буду благодарен
> за совет.Если Вы собираетесь фильтровать не по URL, а по ip, null route дает меньшую нагрузку, чем ACL. Хотя зная какой примерно объем трафика, можно предложить и другие решения. TPROXY, например.
>> Однако, если хочется сделать именно так, то данные, полученные expect'ом, сохраняются в
>> массиве expect_out - элементы массива expect_out(buffer) (вся полученная/отброшенная
>> инфа, в завимости от выражения), expect_out(1,string) (соответствие первому подшаблону
>> регулярки), и так 2..9,string.
>> Подробнее в man expect.
>> Еще - парсить удобнее построчный вывод, к примеру, после вывода команды show
>> interfaces description.
> Если не трудно, приведите пример исходя из приведённого выше скрипта.
> Спасибо!Через expect:
exp_send "show interfaces description"
expect "#"
puts stdout "\nExpect buffer contains:"
puts stdout $expect_out(buffer)
Потом разбирать содержимое этой переменной утилитами regexp, string и т.д., как больше нравится.Есть еще вариант сгенерировать и применить прямо на циске, если циска поддерживает tcl.
Что за модель? Попробовать можно, набрав tclsh в exec-режиме циски, выйти - набрав tclquit. Подробности, как работать с циской из tclsh в статьях:
http://www.cisco.com/en/US/docs/ios-xml/ios/ios_tcl/configur...
http://www.cisco.com/web/about/security/intelligence/securet...
http://www.cisco.com/en/US/docs/ios-xml/ios/ios_tcl/command/...
И книге Tcl scripting for cisco IOS.
fix:
exp_send "show interfaces description\r"А далее, например, делаете цикл с построчным разбором:
#в первой паре строчек скорее всего будет мусор
set data [split $expect_out(buffer) "\n"]
set dataLength [llength $data]
for {set i 2} {$i<$dataLength} {incr i} {
set line [lindex $data $i]
#в tcl 8.5 можно использовать lassign, но на цисках обычно 8.3.4
set ifName [lindex $line 0]
set ifAdmStatus [lindex $line 1]
set ifOperStatus [lindex $line 2]
set ifDescr [lindex $line 3]
puts stdout "Found interface $ifName in state: $ifOperStatus\($ifAdmStatus\)"
}Писал по памяти, могут быть ошибки.
Принцип понятен?
> Писал по памяти, могут быть ошибки.
> Принцип понятен?Спасибо.
Попробую разобраться.
> Ограничить всем клиентам доступ к определённым ресурсам(реестр запрещённых сайтов).Добрый день.
Фильтрация контента может выполняться с помощью NBAR в конструкциях service-policy output (на внешнем интерфейсе) или ZBFW.
Не понятно зачем Вы постоянно (!) применяете route-map на внутренних интерфейсах - они же там уже должны быть?!
>> Ограничить всем клиентам доступ к определённым ресурсам(реестр запрещённых сайтов).
> Добрый день.
> Фильтрация контента может выполняться с помощью NBAR в конструкциях service-policy output
> (на внешнем интерфейсе) или ZBFW.NBAR не подошёл, т.к. сильно тормозит и имеет свои ограничения.
К примеру для блокировки всего URL "domain.tld/test/index.php?jksvhb"
Нужно разделять доменную часть и сам запрос, создавая при этом 2 правила.
Плюс cisco при этом сильно тормозит.
По поводу ZBFW хотелось бы подробнее и с примерным конфигом, если можно.> Не понятно зачем Вы постоянно (!) применяете route-map на внутренних интерфейсах -
> они же там уже должны быть?!Пользователи то появляются новые то отключаются, так что прописать разом на всех не получается. Плюс при перегенерации access-листа если route-map будет висеть на интерфейсе, клиент будет иметь проблемы с доступностью сети. Так что по мне лучше перед перегенерацией удалить route-map, а затем повесить его вновь.
Добрый день.Тогда я не понял, как Вы определяете список запрещенных сайтов? По IP-адресу?
Я полагаю, что если Вы фильтруете по URL - то NBAR единственный приемлемый вариант.ZBFW также использует NBAR, т.ч. в плане производительности не поможет.
Как Вы определили, что NBAR "сильно тормозит"?
Видимо я все же не вполне понимаю в чем задача... почему не ограничивать доступ на прокси? А на него заворачивать весь нелокальный http-траффик...
> Добрый день.
> Тогда я не понял, как Вы определяете список запрещенных сайтов? По IP-адресу?Список запрещённых сайтов парсится из дампа реестра и на его основе создаётся access-list, точнее rewrite-list для nginx. Пример:
if ($url ~* "0chan.hk/h/"){rewrite ^(.*)$ /403.html;}Из того же дампа вытягивается список доменов и резолвятся их IP, на основе которых строится access=list для route-map-а. Именно трафик, идущий на эти IP роутится на машину с nginx и там уже nginx блокирует совпадающие URL, остальные проксирует как есть.
> Я полагаю, что если Вы фильтруете по URL - то NBAR единственный
> приемлемый вариант.
> ZBFW также использует NBAR, т.ч. в плане производительности не поможет.
> Как Вы определили, что NBAR "сильно тормозит"?Просто циска повисла когда применил несколько правил используя NBAR.
> Видимо я все же не вполне понимаю в чем задача... почему не
> ограничивать доступ на прокси? А на него заворачивать весь нелокальный http-траффик...В принципе идея как раз в этом, только в качестве прокси nginx как более легкий.
> Из того же дампа вытягивается список доменов и резолвятся их IP, на
> основе которых строится access=list для route-map-а. Именно трафик, идущий на эти
> IP роутится на машину с nginx и там уже nginx блокирует
> совпадающие URL, остальные проксирует как есть.Так почему не заворачивать весь трафик?
> Просто циска повисла когда применил несколько правил используя NBAR.
Чините: может прошивка старая, может памяти мало?!!
Просто так Cisco не зависает на NBAR; можно show ver ?>> Видимо я все же не вполне понимаю в чем задача... почему не
>> ограничивать доступ на прокси? А на него заворачивать весь нелокальный http-траффик...
> В принципе идея как раз в этом, только в качестве прокси nginx
> как более легкий.Так заворачивайте весь (!) трафик, в этом случае перенастройка cisco требоваться не будет.
> Так почему не заворачивать весь трафик?Ради пары десятков сайтов ?
Не вижу смысла.> Чините: может прошивка старая, может памяти мало?!!
> Просто так Cisco не зависает на NBAR; можно show ver ?
#show version
Cisco IOS Software, 3800 Software (C3825-ADVIPSERVICESK9-M), Version 12.4(19), RELEASE SOFTWARE (fc1)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2008 by Cisco Systems, Inc.
Compiled Sat 01-Mar-08 01:27 by prod_rel_teamROM: System Bootstrap, Version 12.4(13r)T, RELEASE SOFTWARE (fc1)
R1 uptime is 19 hours, 39 minutes
System returned to ROM by power-on
System restarted at 15:12:20 Ural Tue Oct 8 2013
System image file is "flash:c3825-advipservicesk9-mz.124-19.bin"
This product contains cryptographic features and is subject to United
States and local country laws governing import, export, transfer and
use. Delivery of Cisco cryptographic products does not imply
third-party authority to import, export, distribute or use encryption.
Importers, exporters, distributors and users are responsible for
compliance with U.S. and local country laws. By using this product you
agree to comply with applicable laws and regulations. If you are unable
to comply with U.S. and local laws, return this product immediately.A summary of U.S. laws governing Cisco cryptographic products may be found at:
http://www.cisco.com/wwl/export/crypto/tool/stqrg.htmlIf you require further assistance please contact us by sending email to
export@cisco.com.Cisco 3825 (revision 1.2) with 749568K/36864K bytes of memory.
Processor board ID FCZ113170RL
2 Gigabit Ethernet interfaces
1 Virtual Private Network (VPN) Module
DRAM configuration is 64 bits wide with parity enabled.
479K bytes of NVRAM.
62720K bytes of ATA System CompactFlash (Read/Write)Configuration register is 0x2102
Не советую дёргать каждый день сохранение конфигурации.
Лучше анонсить нужные айпишники на какой-нибудь прокси, где по нужному url будет закрываться доступ.
И закрывать лучше урлы с кодом 451, здесь я с Гуглом согласен.