The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

СОВЕТЫ (Краткие заметки, Tips) (базовая разбивка)

   Маршрутизаторы Cisco, VoIP
AAA, контроль dial-up пользователей
ACL, ограничение доступа, безопасность
VoIP
Настройка маршрутизации (BGP, OSPF, RIP)
Ограничение и учет трафика на Cisco

----* JFFS и мониторинг активности wifi на роутере Linksys WRT54GL (доп. ссылка 1)   Автор: Sergey Volhin  [обсудить]
 
Расскажу о двух возможностях, которые можно реализовать на роутере
 с прошивкой DD-WRT на примере роутера Linksys WRT54GL.

1) Файловая система JFFS.

На роутере можно без труда организовать небольшое энергонезависимое хранилище файлов.
Для этого в веб-интерфейсе включаем поддержку jffs (по туториолу из официального вики dd-wrt):

1. Откройте вкладку "Administration".
2. Перейдите к секции "JFFS2 Support".
3. Кликаем "Enable JFFS".
4. Затем жмём "Save".
5. Ждём несколько секунд и жмём "Apply".
6. Опять ждём. Идём обратно к опции "Enable JFFS", кликаем "Clean JFFS".
7. Не кликая "Save", жмём вместо этого "Apply".

Теперь если мы приконнектимся к роутеру по ssh команда "df -h" расскажет нам о
наличие новой файловой системы,
смонтированной в каталоге /jffs/, и её размере (размер очень сильно зависит от
типа вашей прошивки,
для получения хоть сколько-нибудь полезного свободного пространства для jffs
рекомендуется установить mini-версию dd-wrt).



2) Индикация активности wifi по лампе на корпусе роутера.

Теперь используем возможности jffs - разместим на ней скрипт (с того же вики
dd-wrt), который заставляет
гореть лампу янтарным светом при подключенных wifi-клиентах и мигать белым при
трансфере данных через WLAN.

Для установки скрипта:

1. Коннектимся по ssh.
2. Переходим в каталог /jffs/ и создаем директорию bin:

   # cd /jffs/
   # mkdir ./bin

3. Как видно /jffs/bin уже прописан в переменной поиска команд PATH:

   # echo $PATH
   /bin:/usr/bin:/sbin:/usr/sbin:/jffs/sbin:/jffs/bin:/jffs/usr/sbin:/jffs/usr/bin

4. Создаем файл скрипта (# vi ./wlan.sh) со следующим содержанием:


    #!/bin/sh
    I=`nvram get wl0_ifname`
    while sleep 1; do
    if [ "`wl assoclist`" != "" ]; then
     XFER=`ifconfig $I|grep bytes`
     if [ "$XFER" != "$PXFER" ]; then
       LED='gpio disable 3 ; gpio disable 2'
       PXFER=$XFER
     else
       LED='gpio disable 3 ; gpio enable 2'
     fi
    else
     LED='gpio enable 3 ; gpio enable 2'
    fi
    if [ "$LED" != "$PLED" ]; then
     eval $LED
     PLED=$LED
    fi
    done
   

5. Делаем скрипт исполняемым:

   # chmod +x ./wlan.sh


Готово!
Скрипт теперь можно запускать командой wlan.sh или прописать в автозагрузку.



Оригинал в блоге по ссылке: http://damnsmallblog.blogspot.com/2008/03/jffs-wifi-linksys-wrt54gl.html
 
----* Выбор метода обмена ключами с при подключении по ssh к Cisco ASA   Автор: Аноним  [комментарии]
 
Из-за отключения по умолчанию в OpenSSH 7.0 поддержки обмена 1024-битными
ключами diffie-hellman-group1-sha1 при попытке подключиться по SSH к
оборудованию Cisco ASA возникает ошибка:

   no matching key exchange method found

Начиная с версии IOS 9.1(2) ASA поддерживает dh-group14-sha1 для SSH.

По умолчанию:
   ssh key-exchange group dh-group1-sha1

меняем на:
   ssh key-exchange group dh-group14-sha1


Другим вариантом является явное включение dh-group1-sha1 на стороне клиента:

   ssh user@host -oKexAlgorithms=diffie-hellman-group1-sha1
 
----* Базовая настройка коммутатора Cisco   Автор: KoD  [комментарии]
 
1. Настройка параметров терминала.

Для базовой настройки параметров терминала:

Назначить имя устройства

    (config)# hostname <string>

Если необходимо, изменить строку приглашения

    (config)# prompt %n@%h%p

где:    %% -  символ процента;
        %n -  номер tty-порта;
        %h -  имя хоста;
        %p -  символ приглашения ( # или > );
        %s -  пробел;
        %t -  табуляция;

Создать баннеры:


    (config)# banner motd # text #
    (config)# banner login # text #
    (config)# banner exec # text #
    (config)# banner incoming # text #

Отключить поиск в системе DNS:

    (config)# no ip domain-lookup


Задать время сеанса (5 мин.):

    (config)# line { console | vty | tty } <n>
    (config-line)# exec-timeout 5 0


Для вывода информации о местоположении устройства при входе пользователя в систему:

    (config)# service linenumber
    (config)# line console 0
    (config-line)# location <text>


Чтобы сообщения консоли не мешали вводу команд:

    (config)# line { console | vty | tty } <n>
    (config-line)# logging synchronous


Задать скорость консольного порта:

    (config)# line console 0
    (config-line)# speed 115200


Определить длину истории команд:

    (config)# line { console | vty | tty } <n>
    (config-line)# history size <0-256>


Включить запись истории изменения конфигурации:

    (config)# archive
    (config-archive)# log config
    (config-archive-log-cfg)# logging on
    (config-archive-log-cfg)# hidekeys


Включить поддержку IPv6, перезагрузить роутер

    (config)# sdm prefer dual-ipv4-and-ipv6 routing
    (config)# ^Z
    # wr
    # reload


2. Установка параметров входа в систему.

2.1 Локальная аутентификация

Добавить локального пользователя:

    (config)# service password-encryption
    (config)# username <str> privelege <0-15> secret <str>


Включить поддержку ААА и настроить аутентификацию:

    (config)# enable secret <str>
    (config)# aaa new-model
    (config)#
    (config)# aaa authentication login default local
    (config)# aaa authorization exec default local
    (config)# aaa authorization console
    (config)#
    (config)# line { console | vty | tty } <n>
    (config-line)# login exec default
    (config-line)# authorization exec default


2.1 Аутентификация на RADIUS-сервере

На RADIUS-сервере в файл users прописать(!!! до первого вхождения пользователя DEFAULT):

  "username" Cleartext-Password := "passwd"
             Auth-Type == Local,
             Service-Type = NAS-Prompt-User,
             Cisco-AVPair = "Shell:priv-lvl=15"


В файл clients.conf:

  client <short-name>{
    ipv6addr  = xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
    secret    = secret123
    shortname = short-name

  }


На коммутаторе:

    (config)# radius server RADSERV1
    (config-radius-server)# address ipv6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
    (config-radius-server)# key 0 secret123
    (config-radius-server)# exit
    (config)#
    (config)# aaa group server radius RADGRP1
    (config-sg-radius)# server name RADSERV1
    (config-sg-radius)# deadtime 3
    (config-sg-radius)# exit


Включить поддержку ААА и настроить аутентификацию:

    (config)# enable secret <str>
    (config)# username bkpusr privelege <0-15> secret bkppasswd
    (config)# aaa new-model
    (config)#
    (config)# aaa authentication login default group RADGRP1 local
    (config)# aaa authorization exec default group RADGRP1 local
    (config)#
    (config)# line { console | vty | tty } <n>
    (config-line)# login exec default
    (config-line)# authorization exec default


3. Настройка параметров журналирования.


Включить ведение журнала:

    (config)# logging on
    (config)# logging buffered
    (config)# logging trap <0-7>

0 - минимальное, 7- записывать все сообщения


Добавлять системное время в сообщения:

    (config)# service timestamps log datetime msec localtime show-timezone


Сбор данных на syslog-сервер:

  Для начала необходимо добавить строку в /etc/syslogd.conf вида Facility.Severity file

    local7.info /var/log/cisco3750e-b1s3

Затем настроить роутер:

    (config)# logging facility local7
    (config)# logging trap info
    (config)# logging <servername.com>


Включить сервис нумерации сообщений и записи истории посещений:

    (config)# service sequence-numbers
    (config)# login on failure log
    (config)# login on success log


4. Установка даты, времени, часового пояса, настройка NTP-клиента.


Перевести внутренние часы:

    R1# clock set 12:00:00 20 jun 2012
    R1# conf
    Configuring from terminal, memory, or network [terminal]?
    (config)# clock timezone SAM 3
    (config)# clock summer-time SAM recurring


Включить NTP-клиент:

    (config)# ntp server ipv6 ntp6a.rollernet.us
    (config)# ntp server ipv6 ntp6b.rollernet.us


5. Настройка сервисов:

5.1 SSH

Установить имя хоста:

    (config)# ip domain name <name.local>
    (config)# hostname <name>


Сгенерировать секретный ключ (l > 768):

    (config)# crypto generate rsa


Настроить SSH-сервер:

    (config)# ip ssh timeout <1-120>
    (config)# ip ssh authentication retries <0-5>
    (config)# ip ssh logging events
    (config)# ip ssh maxstartups <2-128>
    (config)# ip ssh source-interface <type><mod>/<sl>


В настройках линии указать возможность приема соединений по SSH:

    (config)# line vty 0 15
    (config-line)# transport input ssh


Включить сервис SCP:

    (config)# ip scp server enable


Идентификация по открытому ключу:

    (config)# ip ssh pubkey-chain
    (conf-ssh-pubkey)# username <str>
    (conf-ssh-pubkey-user)# key-string
    (conf-ssh-pubkey-data)# $de12w1sqwsa8
    (conf-ssh-pubkey-data)# $sdadq3eqwsaczxzXX
    (conf-ssh-pubkey-data)# $asdad23adaxxa== pipi@fedi.nil.si
    (conf-ssh-pubkey-data)# exit
    (conf-ssh-pubkey-user)#


5.2 CDP (LLDP)

Сервис CDP включен на коммутаторе по-умолчанию. Для выключения:

    (config)# no cdp run


На отдельном интерфейсе:

    (config-if)# no cdp enable


Время между посылками CDP-пакетов:

    (config)# cdp timer <sec>


Время, которое принятая от соседа информация считается действительной:

    (config)# cdp holdtime <sec>

Если в сети находятся устройства иных производителей, то имеется возможность
использовать протокол LLDP:

    (config)# lldp run


На отдельном интерфейсе:

    (config-if)# lldp transmit
    (config-if)# lldp receive


5.3 SNMPv3

Создать SNMP-tree view для чтения и записи:

    (config)# snmp-server view READVIEW1 <MIB-view-family> { included | excluded }
    (config)# snmp-server view WRITEVIEW1 <MIB-view-family> { included | excluded }


где MIB-view-family может быть:  mib2, system, internet, iso и т.д. 

Создать access-list:

    (config)# ipv6 access-list SNMP-ACL1
    (config-ipv6-acl)# permit xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
    (config-ipv6-acl)# exit


Создать SNMP-группу:

    (config)# snmp-server group <grname> v3 auth read READVIEW1 write WRITEVIEW1 access ipv6 SNMP-ACL1


Создать пользователей SNMP-сервера:

    (config)# snmp-server user <uname> <grname> v3 auth md5 <authpasswd> access ipv6 SNMP-ACL1


5.4 VTPv3

Основные отличия от 1 и 2 версии:
  • Поддержка Privat-VLAN;
  • Поддержка полного диапазона VLAN ( 1 - 4096 );
  • Возможность настройки на уровне отдельного порта;
  • Защита пароля домена;
  • Решена проблема с подключением нового коммутатора (когда происходила перезапись базы VLAN всего домена);
  • Обмен данными более эффективен;
  • Работа в режиме передачи данных между процессами MST. Настройка VTPv3: (config)# vtp domain <name> (config)# vtp version 3 (config)# vtp mode { server | client } (config)# vtp password <passwd> { hidden | secret } Если switch работает в режиме server, необходимо его тип - BACKUP(по-умолчанию) или PRIMAR: Switch# vtp primary vlan This system is becoming primary server for feature vlan No conflicting VTP3 devices found. Do you want to continue? [confirm] Обновления принимаются только от PRIMARY-сервера. В домене только один primary, остальные backup, client либо transparent. При подключении в сеть 2-ого primary, он автоматически становится backup. Выключить VTP на интерфейсе можно командой: (config-if)# no vtp 6. Повышение уровня безопасности устройства. Выключить ненужные сервисы: (config)# no service tcp-small-servers (config)# no service udp-small-servers (config)# no service dhcp (config)# no service finger (config)# no service config (config)# no ip bootp server (config)# no ip http server (config)# no ip http secure-server (config)# no ip source route (config)# no ip gratitous-arps (config)# ip options drop Включить нужные: (config)# service tcp-keepalives-in (config)# service tcp-keepalives-out Настроить access-class на VTY: (config)# ipv6 access-list ADMIN-NETW (config-ipv6-acl)# permit xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/yyy (config-ipv6-acl)# exit (config)# (config)# line vty 0 15 (config-line)# ipv6 access-class ADMIN-NETW (config-line)# exit MANAGEMENT и COMMON VLAN: (config)# int vlan 1 (config-if)# shutdown (config-if)# exit (config)# (config)# vlan 254 (config-vlan)# name MANAGEMENT (config-vlan)# state active (config-vlan)# exit (config)# (config)# int vlan 254 (config-if)# ipv6 enable (config-if)# ipv6 address 2001:DB8:5005:FE::/64 eui-64 (config-if)# ipv6 traffic-filter ADMIN-NETW (config-if)# no shutdown (config-if)# exit (config)# (config)# vlan 255 (config-vlan)# name COMMON (config-vlan)# state active (config-vlan)# exit (config)# (config)#int range g1/0/1 - 48 (config-if-range)# switchport host (config-if-range)# switchport access vlan 255 (config-if-range)# ^Z Switch# wr 7. Создание меню быстрого вызова команд. Задать заголовок: (config)# menu <name> title # Текст # (config)# menu <name> clear-screen (config)# menu <name> line-mode Ввести приглашение: (config)# menu <name> prompt # Текст # Для каждого пункта меню: (config)# menu <name> text <pt-num> <Текст> (config)# menu <name> command <pt-num> <command> Завершить пунктом выхода из меню: (config)# menu <name> text <last-pt-num> Menu exit Вызов меню из режима exec: Switch# menu <name>
  •  
    ----* Подключение к VPN Juniper Network Connect используя perl-скрипт (доп. ссылка 1)   Автор: Alex Samorukov  [комментарии]
     
    Для доступа к некоторым рабочим ресурсам мне необходимо использовать VPN. К
    сожалению, он организован на решении Juniper Network Connect, которое
    использует клиенты с закрытым исходным кодом для Windows (Windows Secure
    Manager) и Linux/Mac (Network Connect). Линукс клиент - ущербный монстрик,
    требующий для своей работы browser с устанвленной JVM, причем исключительно
    i386 (32 бит) архитектуры (используется JNI). Искренне надеюсь, что дурацкая
    модель security by obscurity подохнет вместе с компаниями, которые её
    поддерживают. В данной заметке речь пойдет о том, как получить доступ к ВПН без
    Java и Firefox.
    
    Итак, когда мне надоело запускать бразуер для установления впн соединения, я
    решил разобраться как же это убожество работает. Схема примерно такая:
    
    1) С помощью браузера вводим имя пользователя и пароль (в моём случае rsa secure id из токена).
    2) Происходит перенаправление на страничку с Host Checker (Java applet),
    который проверяет соответствует ли наша система требованиям, в моём случае его
    можно пропустить, видимо правила не жёсткие.  На этом этапе выдаётся
    специальная кука DSID.
    3) Запускается applet , который скачивает клиента для Linux (Java + JNI).
    4) Клиентский applet проверяет, установлен ли клиент, если нет - запускает его установку.
    5) Если клиент установлен - через JNI запускается процесс ncsvc, который в свою
    очередь и поднимает впн. Кроме того - запускается Java GUI (Java + JNI) которое
    показывает статистику.
    
    Оставив за скобками кривизну архитектуры (особенно использование JNI там, где
    оно никому не нужно) я стал думать как обойтись без Java. У ncsvc есть
    аргументы командной строки, но в моём случае они не работали - виноват
    включенный host checker, данный случай описан в Juniper KB20490. Отладка
    показала, что взаимодействие с ncsvc происходит по протоколу tcp (демон слушает
    на 127.0.0.1:4242). Формат обмена - закрытый, но пакеты небольшие и после
    нескольких экспериментов я смог управлять демоном и без Java.
    
    В итоге получился perl-скрипт, который позволяет скачивать Linux клиента,
    устанавливать соединение, отображать статистику и работать в консоли. Скачать
    скрипт и посмотреть скриншоты можно в моём блоге
    (http://samm.kiev.ua/jvpn/jvpn-0.4.0.tar.bz2). Скрипт проверялся на RHEL5/6 и
    Ubuntu 12.04. Буду рад замечаниям или сообщениям об ошибках.
    
     
    ----* Опции DHCP для маршрутизаторов Cisco для PXE-загрузки c SCCM (доп. ссылка 1)   Автор: Величко Д.С.  [комментарии]
     
    Настраиваем маршрутизатор Cisco для загрузки PXE клиентов с Microsoft System
    Center Configuration Manager (SCCM) Server. При этом SCCM сервер и PXE клиенты
    находятся в различных подсетях. Для такой загрузки необходимо настроить DHCP
    пул с указанием опций 66 и 67 для указания IP-адреса SCCM сервера и
    загрузочного файла.
    
    По умолчанию путь к загрузочному файлу PXE "\\SMSBoot\\x86\\wdsnbp.com". Опция
    66 и ip helper-address должны указывать на IP или DNS имя сервера SCCM с
    поднятой ролью PXE.
    
    Конфигурация DHCP пула с опциями 66 и 67:
    
       ip dhcp pool <pool_name>
         network <network netmask>
         default-router <gateway_ip>
         dns-server <dns_server1_ip dns_server2_ip>
         option 66 ip <SCCM_IP>
         option 67 ascii "\\SMSBoot\\x86\\wdsnbp.com"
    
    На данном этапе возникает вопрос каким образом связаны между собой DHCP и PXE?
    При выполнении PXE-запроса сетевая карта отправляет модифицированный пакет
    DHCPDISCOVER, расширенный PXE-опциями. Он рассылается широковещательно. Таким
    образом, DHCPDISCOVER может быть распространен за пределы подсети
    маршрутизатором при помощи ретрансляции DHCP, перенаправляя поступающие от
    клиентов сообщения DHCP серверам в других подсетях. Для этого и настраивается
    ip helper-address на интерфейсе шлюза за которым расположены клиенты PXE
    указывающий на SCCM сервер.
    
       interface <interface_name>
       ip helper-address <SCCM_IP>
    
    Приведу выдержку из конфигурации маршрутизатора
    
       ip dhcp pool osd
          network 10.1.7.0 255.255.255.0
          dns-server 10.1.6.5 10.1.6.6
          domain-name some.domain.local
          default-router 10.1.7.254
          option 66 ip 10.1.6.11
          option 67 ascii "\\SMSBoot\\x86\\wdsnbp.com"
    
       interface Vlan7
        description New OS Deployment
        ip address 10.1.7.254 255.255.255.0
        ip helper-address 10.1.6.11
    
     
    ----* Junoscript на удаленном устройстве c JunOS   Автор: nocn  [комментарии]
     
    Развертывание и поддержка крупной вычислительной сети требует значительных
    усилий инженеров различных специальностей. Во многом помогают средства
    автоматизации. Cisco IOS в этом смысле предоставляет возможность создания
    автоматических средств с помощью TCL. Juniper Networks JunOS предоставляет
    множество средств, основанных на XML. Linux/BSD-платформы в отношении
    автоматизации значительно гибче.
    
    Однако, если говорить об IOS и Linux/BSD, то это уже прижившиеся в сетях
    операционные системы, о которых достаточно информации в интернете, и
    большинство сетевых администраторов чувствуют себя уверенно при работе с ними.
    
    Особняком стоит Junos, появившийся относительно недавно и не накопивший
    достаточного объема документации в рунете.
    
    Большая часть информации о JunOS сконцентрирована на официальном сайте.
    Информации много, и она очень подробная. Если у вас есть специалист, который
    вас может направить на путь к правильному решению, - это очень хорошо. Но если
    такого специалиста нет, вы начинаете просматривать мегабайты документации в
    поисках нужной информации, собирая по деталям всю мозаику, в рисунке которой
    чудесным образом появляется решение проблемы. На это уходит много времени, эта
    статья призвана сократить ваш путь от постановки задачи на автоматизацию до
    начала непосредственно реализации (примеры на PHP).
    
    Для понимания статьи достаточны базовые навыки работы с командным интерфейсом и
    конфигурацией JunOS.
    
    
    Как JunOS работает с конфигурацией и как взаимодействует с CLI
    
    В целом управление устройством на базе JunOS производится с помощью процесса
    mgd (management daemon), который готов принимать запросы из CLI, изменения
    конфигурации и удаленные вызовы. Этот процесс тесно взаимодействует с другими
    процессами операционной системы и позволяет организовывать интерактивный режим
    работы с пользователем. В данном контексте под пользователем подразумевается
    или скрипт, выполняемый локально, или удаленное подключение через (например)
    SSL-сокет, или инженер, находящийся на устройстве посредством ssh или telnet.
    
    Для обеспечения взаимодействия между mgd и другими процессами был выбран
    механизм RPC, основанный на использовании XML. На запросы и ответы в формате
    XML можно взглянуть, направив вывод основной команды пайпом в команды 'display
    xml rpc' и 'display xml' соответственно.
    
    Например:
    
       > show interfaces xe-1/0/0 terse | display xml rpc
    
       <rpc-reply xmlns:junos="http://xml.juniper.net/junos/10.3R2/junos">
        <rpc>
           <get-interface-information>
                   <terse/>
                   <interface-name>xe-1/0/0</interface-name>
           </get-interface-information>
        </rpc>
        <cli>
           <banner></banner>
        </cli>
       </rpc-reply>
    
       > show interfaces xe-1/0/0 terse | display xml
    
       <rpc-reply xmlns:junos="http://xml.juniper.net/junos/10.3R2/junos">
        <interface-information
           xmlns="http://xml.juniper.net/junos/10.3R2/junos-interface"
           junos:style="terse">
           <physical-interface>
               <name>xe-1/0/0</name>
               <admin-status>up</admin-status>
               <oper-status>up</oper-status>
               <description>TEST PORT</description>
               <logical-interface>
                   <name>xe-1/0/0.10</name>
                   ...
               </logical-interface>
           </physical-interface>
        </interface-information>
        <cli>
           <banner></banner>
        </cli>
       </rpc-reply>
    
    Это значит, что при вводе команды CLI формирует XML-документ и отправляет его
    mgd, который в свою очередь интерпретирует запрос, подготавливает результат в
    формате XML и отправляет его CLI. Получив ответ командная оболочка форматирует
    XML-документ в читаемый вид и выводит его на терминал.
    
    Конфигурация тоже представлена в формате XML.
    
       > show configuration | display xml'
       <rpc-reply xmlns:junos="http://xml.juniper.net/junos/10.3R2/junos">
          <configuration junos:commit-seconds="1296472234"
                      junos:commit-localtime="2011-01-31 17:10:34 NOVT"
                      junos:commit-user="root">
               <version>10.3R2.11</version>
                   ...
          </configuration>
       </rpc-reply>
    
    После того, как вы входите в режим конфигурирования устройства, изменяете
    конфигурацию (она приобретает статус candidate) и вводите 'commit', CLI
    форматирует в виде XML конфигурацию-кандидата, которая в последствии сливается
    с активной конфигурацией средствами XSLT-менеджера.
    
    В общем случае любое взаимодействие с JunOS происходит посредством
    взаимодействия с mgd. С этим менеджером мы можем "общаться" из CLI, из
    op-скрипта, из event-скрипта, из commit-скрипта или удаленно через RPC-сессию
    (установить сессию в открытом виде или шифрованную с помощью SSL, работать с
    Junoscript RPC внутри SSH-соединения или с помощью специфичной технологии
    Outbound SSH).
    
    Описание каждого способа взаимодействия - это тема нескольких статей. 
    Вкратце, op-скрипты позволяют автоматизировать работу оператора устройства,
    event-скрипты готовы к выполнению при наступлении какого-либо события (или
    каскада взаимозависимых событий), commit-скрипт выполняется каждый раз, когда
    производится выполнение команды 'commit' из конфигурационного режима.
    
    Ниже мы поговорим о работе с JunOS удаленно.
    
    Теория удаленной работы с JunOS
    
    Первым этапом взаимодействия с устройством JunOS является поднятие транспорта и
    открытие RPC-сессии (последнее требуется только для соединения через SSH).
    Технические детали зависят от того, какой транспорт вы предпочтете. Для работы
    различных транспортных средств может потребоваться дополнительная конфигурация
    или генерирование сертификата. Об этом подробнее рассказано в документации.
    
    Я же буду использовать SSH-соединение, так как его поддержка настроена
    практически на всех моих устройствах под управлением JunOS.
    
    Следующим шагом является отправка XML PI (processing instructions) с указанием
    используемой кодировки "us-ascii" и версии XML. За PI следует отправить
    открывающий тег <junoscript> с атрибутом version="1.0". (Это единственный
    обязательный атрибут, остальные являются опциональными. Ими вы можете
    сопоставить текущую версию JunOS и версию своего скрипта, или указать hostname,
    от которого выполняется скрипт.)
    
    Все готово для того, чтобы отправлять запросы внутри пары тегов <rpc></rpc>.
    
    Информацию о формате запроса можно получить из командной строки, отправив в '|
    display xml rpc' вывод практически любой команды, о чем было сказано выше.
    
    Проверить работоспособность любого RPC-запроса можно из CLI с помощью скрытой
    команды 'junoscript interactive'. (Не забудьте отправить PI и junoscript-тег.)
    
    Ответ вы получите внутри пары тегов <rpc-reply></rpc-reply> сразу после ввода и
    отправки закрывающего тега </rpc>. Обратил внимание, что JunOS никак не
    форматирует ответ (нет отступов, каждый новый тег в новой строке).
    
    Получив от JunOS все, что нам нужно, мы можем закрыть сессию. Можно оборвать
    транспорт, но этот путь не является кошерным, ибо RPC-сессия так и останется
    висеть незавершенной. Лучшим и правильным решением является запрос
    <request-end-session/>, получение от JunOS закрывающего тега </junoscript> и
    отправка этого же тега на устройство. Отключение транспорта будет инициировано
    самой операционной системой JunOS.
    
    
    От слов к делу
    
    Для работы с SSH я использовал библиотеку libssh2-php. Итак, установка
    транспорта и открытие RPC-сессии требует от нас следующих шагов:
    
    1. Подключение к устройству.
    2. Аутентификация посредством ключа или пароля.
    3. Получение файлового дескриптора потока SSH-сессии.
    4. Выполнение команды junoscript на устройстве для открытия сессии.
    
    
       /* Открытие сессии */
       public function sshconnect($host, $port=22)
       {
          $this->ssh = ssh2_connect($host, $port);
          if (!$this->ssh) return false;
          return true;
       }
    
       /* Аутентификация по паролю */
       public function authpass($username, $password)
       {
          if (!$this->ssh) return false;
          $this->auth = ssh2_auth_password($this->ssh, $username, $password);
          return $this->auth;
       }
    
       /* Аутентификация по ключу */
       public function authkey($username, $pubkeyfile, $privkeyfile, $passphrase=null)
       {
          if (!$this->ssh) return false;
          $this->auth = ssh2_auth_pubkey_file($this->ssh,
               $username, $pubkeyfile, $privkeyfile, $passphrase);
          return $this->auth;
       }
    
       /* Открытие сессии, отправка PI и junoscript-тега */
       public function startshell($hostname=null, $encoding="us-ascii", $version="1.0")
       {
          if (!$this->auth) return false;
          $this->stream = ssh2_shell($this->ssh,
               'vt102', null, 0, 0, SSH2_TERM_UNIT_CHARS);
          if (!$this->stream) return false;
    
          /* Старт Junoscript сессии */
          fwrite($this->stream, "junoscript\n");
    
          $s = '';
          while (strstr($s, 'start') === FALSE)
          {
              $s = fgets($this->stream);
              $this->rawXml .= $s;
          }
    
          /* Отправка PI и  тега */
          fwrite($this->stream, '<?xml version="1.0" encoding="'.$encoding.'"?>');
          fwrite($this->stream, "<junoscript version=\"$version\" "
           . ($hostname ? " hostname=\"$hostname\"" : "") . '>');
    
          return true;
       }
    
    
    Как вы могли заметить, в функции startshell я сразу отправил PI и
    junoscript-тег. Теперь самое интересное: отправка RPC и получение ответа.
    
       public function exec($rpcstring)
       {
          $answer = '';
    
          if (!$this->stream) return false;
          fwrite($this->stream, '<rpc>'.$rpcstring.'</rpc>');
       
          $s = '';
          while (strstr($s, '/rpc-reply') === FALSE)
          {
              $s = fgets($this->stream);
              $this->rawXml .= $s;
              $answer .= $s;
          }
    
          return $answer;
       }
    
    
    Описывать подробно работу функции смысла нет, она достаточно простая, чтобы
    быть понятной для программиста любой квалификации. Осталось только закрыть
    сессию и закончить работу с устройством.
    
       public function close()
       {
          if (!$this->stream) return false;
          $close = '<rpc><request-end-session/></rpc>';
          fwrite($this->stream, $close);
    
          $s = '';
          while (strstr($s, '/junoscript') === FALSE)
          {
              $s = fgets($this->stream);
              $this->rawXml .= $s;
          }
          fwrite($this->stream, '</junoscript>');
    
          /* server resets connection now */
          $this->auth = null;
          $this->stream = null;
          $this->ssh = null;
    
          return true;
       }
    
    
    А вот пример работы с классом:
    
       $j = new JunosRPC();
       $result = $j->connect_key("juniper", "username", "id_rsa.pub", "id_rsa");
       echo 'Connect: ', ($result ? 'true' : 'false'), "\n";
    
       $answer = $j->exec('<get-bgp-summary-information/>');
    
       $result = $j->close();
       echo 'Close: ', ($result ? 'true' : 'false'), "\n";
    
       $xml = simplexml_load_string($answer);
       print_r($xml);
    
    
    Полный исходный код класса JunosRPC вы можете изучить 
    здесь или здесь. Подробнее изучить про то, как работает Junos XML
    Management Protocol, можно используя официальную документацию.
    
    
    Заключение
    
    Кто-то может спросить: "И в чем преимущество такого хитрого метода работы с
    устройством по сравнению, скажем, с простым использованием expect'а ?"
    Преимущество основано на том, что JunOS использует именно XML для работы с
    конфигурацией. Учитывая богатый выбор инструментов для работы с XML можно
    предположить, что некий провайдер захочет создать систему управления
    устройствами в сети на основе информации из своего биллинга (похоже это делает
    JunOS Space). В некоторых случаях требуется мониторинг специфичных параметров
    устройства, которых нет в OID-дереве SNMP.
    
    Многие вопросы не были затронуты в статье, как то использование NETCONF,
    создание op-, event- и commit-скриптов. Однозначно, автоматизация - это очень
    широкое поле для исследований.
    
    На Youtube есть пользователь JuniperNetworks, подкасты которого помогут
    ориентироваться во всем многообразии продуктов Juniper.
    
     
    ----* Настройка CustomDNS (DynDNS) на маршрутизаторе Cisco   Автор: serg-dn  [комментарии]
     
    Шаблон настроек Cisco IOS для обновления хоста MyHost своего домена
    My-DNS-Domain.com в DynDNS. Конфигурация для ADSL. Проверено на Cisco IOS
    Software, C870 Software (C870-ADVIPSERVICESK9-M), Version 12.4(24)T4. Для
    обновления раз в час необходима подписка на услугу DynDNS Pro, для корректной
    регистрации должна быть активирована услуга Custom DNS.
    
    Пример конфигурационного файла:
    
       !
       hostname MyHost
       !
       ip domain lookup source-interface Dialer1
       ip domain name My-DNS-Domain.com
       ip host ns1.mydyndns.org 204.13.248.76
       ip host ns3.mydyndns.org 208.78.69.76
       ip host ns4.mydyndns.org 91.198.22.76
       ip host ns5.mydyndns.org 203.62.195.76
       ip host ns2.mydyndns.org 204.13.249.76
       ip name-server 1.1.1.1
       ip name-server 1.1.1.2
       !
       ip ddns update method mydns
        HTTP
         add http://XXX:XXX@members.dyndns.org/nic/update?system=custom&   hostname=MyHost.My-DNS-Domain.com
      remove http://XXX:XXX@members.dyndns.org/nic/update?system=custom&hostname=MyHost.My-DNS-Domain.com
        interval maximum 0 0 1 30
       !
       !
       access-list 1500 permit any
       !
       interface Dialer1
        ip ddns update hostname MyHost.My-DNS-Domain.com
        ip ddns update mydns host members.dyndns.org
        ip access-group 1500 out
       !
    
     
    ----* Равномерное использование транков в Asterisk (доп. ссылка 1)   Автор: ink08  [комментарии]
     
    Не секрет, что есть условно бесплатные (3000 минут) SIM-карты и если превысить
    их лимит, оператор может узнать, что используется gsm-шлюз. Представленный
    скрипт распределяет нагрузку и не звонит при превышении лимита по транку.
    Список разрешенных кодов задается в файле в /usr/share/asterisk/agi-bin/cods.txt
    
    
    
     #!/usr/bin/perl
    
     # load module
     use Asterisk::AGI;
     use DBI;
     #use date::Format;
    
    
    
     # connect
     my $dbh = DBI->connect("DBI:Pg:dbname=asterisk;host=127.0.0.1", "asterisk_user", "passwd", {'RaiseError' => 1});
    
    
     my %trunks=("name1" => "SIP/994",
            "name2" => "SIP/993",
            "name3" => "SIP/992",
            "name4" => "SIP/991"); #89839
    
     my %trunks_id=("name1" => "994",
               "name2" => "993",
               "name3" => "992",
               "name4" => "991");
    
     my $Default_trunk="SIP/63762xx";
     my $Default_trunk_id="63762xx";
    
     my %calls=();
     my @calls_order=();
    
     my $LIMIT=2000*60;
     my $min=$LIMIT;
     my $min_trunk="name1";
    
     foreach $trunk (keys(%trunks)){
        my $sth = $dbh->prepare("SELECT sum(billsec) AS calltime FROM cdr WHERE 
          date_trunc('month',calldate) = date_trunc('month',now())  AND dstchannel LIKE '$trunks{$trunk}-%' ;");
        $sth->execute();
    
        while(my $ref = $sth->fetchrow_hashref()) {
        if($ref->{'calltime'} < $LIMIT){
            $calls{$trunk}=$ref->{'calltime'};
           
            if ($min > $ref->{'calltime'} ){
            $min=$ref->{'calltime'};
            $min_trunk=$trunk;
            }
           
        }
           if(not $ref){
              $calls{$trunk}=0;
           }
            }#end while
     }
    
     $dbh->disconnect();
    
     #@calls_order = sort { $calls{$b} cmp $calls{$a} } keys %calls;
     @calls_order = sort { $calls{$a} <=> $calls{$b} } keys %calls;
    
    
     #foreach $trunk (@calls_order){
     #    print "$trunk = $calls{$trunk}\n";
     #     $AGI->verbose("$trunk = $calls{$trunk}\n",3);
     #}
     #print "min $min_trunk\n";
     #$AGI->verbose("min $min_trunk\n",3);
    
    
    
    
     $|=1;
     my $AGI = new Asterisk::AGI;
     $AGI->setcallback(\&mycallback);
     my  %input = $AGI->ReadParse();
     sleep(1);
     my $num = $input{'extension'};
     my $caller_id = $input{'callerid'};
     if (!$num) {
            exit;
        }
       
     my $num1 = substr($num,1,6);
        my $syscmd1=`perl -ne "print if m/$num1/" /usr/share/asterisk/agi-bin/cods.txt`;
        chomp($syscmd1);   
        if($syscmd1==0){
           $AGI->exec('Playback', "/var/lib/asterisk/sounds/record/blocked_call");
           exit;     
        }
       
     my $use_default=1;
       
     #$AGI->stream_file("/var/lib/asterisk/sounds/record/limit_call","*");
     $AGI->exec('Playback', "/var/lib/asterisk/sounds/record/limit_call");
    
     $AGI->verbose("Executing Dial $num $num1 $caller_id  $syscmd1 \n",3);
     foreach $trunk (@calls_order){
        $AGI->set_callerid($trunks_id{$trunk});
        my $syscmd=`asterisk -r -x "core show channels" | grep "$trunks{$trunk}"| wc -l`;
        chomp($syscmd);
       
        if($syscmd==0){
        #$AGI->verbose("????? Status $trunks{$trunk} '$ret' '$status'\n",3);
    #        my $ret=$AGI->exec('Dial', "$trunks{$trunk}/$num");
    
            my $ret=$AGI->exec('Dial', "$trunks{$trunk}/$num|120|L(191664)");
        my $status=$AGI->channel_status();
       
            if( ($status==0 || $status==1) && $ret!=1 ){
            $AGI->verbose("????? OK! $caller_id $num ret=$ret status=$status syscmd=$syscmd\n",3);
            $use_default=0;
            last;
        }else{
            $AGI->verbose("????????? error $caller_id $num $trunks{$trunk}/$num '$ret' status=$status  syscmd=$syscmd \n",3);
        }
        }
     }
    
     if($use_default==1){
        $AGI->set_callerid($Default_trunk_id);
        my $ret=$AGI->exec('Dial', "$Default_trunk/$num");
        $AGI->verbose("????????? error_Default_trunk $caller_id $num $Default_trunk/$num ret=$ret \n",3);
     }
    
     sleep(1);
     exit;
    
     sub mycallback {
      my ($returncode) = @_;
        &log("CALLBACK");
        &cleanup;
        #print STDERR "User Disconnected ($returncode)\n";
        $AGI->verbose("!!!!!!!!!! ($returncode)\n");
      exit($returncode);
     } 
    
     
    ----* IPSec туннель между Cisco и CentOS Linux   Автор: PsV  [комментарии]
     
    Имеем:
    
    1 Маршрутизатор Cisco 5510 ASA с реальным IP 1.1.1.1 (сеть XXX.XXX.0.0/24)
    2. Маршрутизатор Linux CentOS 5.2 (ядро 2.6.18-92.el5) с установленным
    ipsec-tools-0.6.5-13.el5_3.1 и реальным IP 2.2.2.2 (сеть XXX.XXX.0.0/16)
    
    Конфигурация на маршрутизаторе Cisco:
    
       crypto isakmp policy 5
        encr aes
        authentication pre-share
        group 2
        lifetime 3600
        hash sha
       !
       crypto isakmp key SECRETKEY address 2.2.2.2
       crypto ipsec security-association lifetime seconds 3600
       crypto ipsec transform-set GK esp-aes esp-sha-hmac
       crypto map IPSec 7 ipsec-isakmp
       set peer 2.2.2.2
       set transform-set GK
       set pfs group2
       match address 666
      !
      interface GigabitEthernet0/0.1
       ip address 1.1.1.1 255.255.255.224
       crypto map IPSec
      !
      ip route XXX.XXX.0.0 255.255.255.0 2.2.2.2
      access-list 666 remark asGK
      access-list 666 permit ip  XXX.XXX.0.0 0.0.255.255  XXX.XXX.0.0 0.0.0.255
      access-list 666 deny   ip any any
    
    
    Конфигурация на машине с Linux CentOS:
    
    /etc/sysconfig/network-scripts/ifcfg-ipsec0
    
       TYPE=IPSEC
       ONBOOT=yes
       IKE_METHOD=PSK
       IKE_PSK=SECRETKEY
       IKE_DHGROUP=2
       ESP_PROTO=aes
       AH_PROTO=none
       AESP_PROTO=hmac-sha1
       SRC=2.2.2.2
       SRCGW=XXX.XXX.0.100
       DSTGW=1.1.1.1
       SRCNET=XXX.XXX.0.0/24
       DSTNET=XXX.XXX.0/16
       DST=1.1.1.1
    
    
    /etc/racoon/racoon.conf
    
       path include "/etc/racoon";
       path pre_shared_key "/etc/racoon/psk.txt";
       log notify;
    
       listen
       {
          isakmp 2.2.2.2 [500];
       }
    
       sainfo address  XXX.XXX.0.0/24 any address XXX.XXX.0.0/16 any
       {
           pfs_group 2;
           lifetime time 6400 sec;
           encryption_algorithm aes;
           authentication_algorithm hmac_sha1;
           compression_algorithm deflate;
       }
    
    
    и не забываем про iptables!!
    
    после настройки
    
       #ifup ipsec0
    
    после поднятия ipsec0 можно посмотреть есть ли туннель
    
       #setkey -D
    
       2.2.2.2 1.1.1.1
           esp mode=tunnel spi=3839224802(0xe4d5ebe2) reqid=0(0x00000000)
           E: aes-cbc  c98674dd c1cda3a8 36f39eb5 84fd56b4 192e4acd 7ad470d7 0176919b c955cc38
           A: hmac-sha1  d8e6305b 8b0352ab 249d125f 1515e6a8 136d8896
           seq=0x00000000 replay=4 flags=0x00000000 state=mature
           created: Jul  8 10:19:23 2010 current: Jul  8 10:44:57 2010
           diff: 1534(s)   hard: 86400(s)  soft: 69120(s)
           last: Jul  8 10:19:27 2010    hard: 0(s)        soft: 0(s)
           current: 2160(bytes)    hard: 0(bytes)  soft: 0(bytes)
           allocated: 18   hard: 0 soft: 0
           sadb_seq=1 pid=8863 refcnt=0
       1.1.1.1 2.2.2.2
           esp mode=tunnel spi=111533039(0x06a5dbef) reqid=0(0x00000000)
           E: aes-cbc  3e1f5040 cf6c15d2 8083dc28 aa6006ef df53337f 13b31da2 2782ef5c e46d3567
           A: hmac-sha1  a9553dd3 e9b431a5 534baef8 a2b1f34b cc2b8867
           seq=0x00000000 replay=4 flags=0x00000000 state=mature
           created: Jul  8 10:19:23 2010 current: Jul  8 10:44:57 2010
           diff: 1534(s)   hard: 86400(s)  soft: 69120(s)
           last: Jul  8 10:19:27 2010    hard: 0(s)        soft: 0(s)
           current: 833(bytes)     hard: 0(bytes)  soft: 0(bytes)
           allocated: 18   hard: 0 soft: 0
           sadb_seq=0 pid=8863 refcnt=0
    
    
    Ссылки:
           http://www.opennet.ru/base/cisco/cisco_ipsec_freebsd.txt.html (очень помогла эта статья)
           http://netbsd.gw.com/cgi-bin/man-cgi?racoon++NetBSD-current
    
     
    ----* Настройка корректного отображения шрифтов для работы Cisco Packet Tracer 5   Автор: toidi  [комментарии]
     
    Чтобы при работе в Cisco Packet Tracer 5 шрифты выглядели нормально нужно
    закомментировать в файле /usr/local/PacketTracer51/packettracer строку
    
       export LD_LIBRARY_PATH=$PTDIR/lib
    
    , тогда будет использована стандартная версия библиотеки Qt, которая должна
    быть установлена в системе.
    
     
    ----* Заметки по настройке времени, логов, BGP и Radius в Cisco IOS   Автор: fantom  [комментарии]
     
    1. Время.
    
    Казалось бы какая простая и понятная штука - время. Но сколько проблем может
    доставить его неправильные показания :)
    
    Синхронизация с ntp сервером (это знают почти все)
    
       ntp server 1.2.3.4
       ntp clock-period 17180179
    
    но время буде GMT,  укажем зону:
    
       clock timezone Riga 2
    
    Riga - это имя, какое введете - такое и будет, 2 - +2 часа к GMT,
    варианты предлагаются от -23 до 23
    
    И все бы было хорошо если бы не переходы на летнее время, но есть возможность учесть и это
    
       clock summer-time Riga recurring last Sun Mar 02:00 last Sun Oct 03:00
    
    т.е. Летнее время "работает" с последнего воскресенья марта по последнее
    воскресенье октября (Riga - это имя зоны, которое было задано в clock timezone)
    
    И теперь для полного счастья, чтобы логи и отладочную информацию смотреть в
    локальном времени, а не с момента включения устройства:
    
       service timestamps debug datetime msec localtime
       service timestamps log datetime msec localtime
    
    2. Radius
    
    Возникла у начальства 2-х контор "светлая мысль" - совместно использовать Сisco
    как pppoe сервер, а т.к. биллинги разные - то и работать надо одновременно с
    2-мя radius серверами.
    Оказывается - элементарно!
    
       Interface Loopback1
        description For_RAD1
        ip address a.a.a.a
    
       Interface Loopback2
        description For_RAD2
        ip address b.b.b.b
    
    
       aaa group server radius RAD1
        server 1.1.1.1 auth-port 1645 acct-port 1646
        server-private 1.1.1.1 auth-port 1645 acct-port 1646 key secret
        ip radius source-interface Loopback1
        attribute nas-port format a
       !
       aaa group server radius RAD2
        server 2.2.2.2 auth-port 1812 acct-port 1813
        server-private 2.2.2.2 auth-port 1812 acct-port 1813 key tayna
        ip radius source-interface Loopback2
        attribute nas-port format a
       !
       aaa authentication ppp rad1 group RAD1
       aaa authentication ppp rad2 group RAD2
       aaa authorization network rad1 group RAD1 
       aaa authorization network rad2 group RAD2 
       aaa accounting update periodic 2
       aaa accounting network rad1
        action-type start-stop
        group RAD1
       !
       aaa accounting network rad2
        action-type start-stop
        group RAD2
    
       bba-group pppoe rad1
       virtual-template 1
        vendor-tag circuit-id service
        sessions per-vlan limit 800
        sessions per-mac throttle 4 60 300
    
       bba-group pppoe rad2
       virtual-template 2
        vendor-tag circuit-id service
        sessions per-vlan limit 800
        sessions per-mac throttle 4 60 300
    
       interface Virtual-Template1
        ip unnumbered Loopback1
        peer default ip address pool PPPoE_POOL1
        ppp authentication pap rad1
        ppp authorization rad1
        ppp accounting rad1
    
       interface Virtual-Template2
        ip unnumbered Loopback2
        peer default ip address pool PPPoE_POOL2
        ppp authentication pap rad2
        ppp authorization rad2
        ppp accounting rad2
    
       interface GigabitEthernet0/0.100
       encapsulation dot1Q 100
       pppoe enable group rad1
    
       interface GigabitEthernet0/1.200
       encapsulation dot1Q 200
       pppoe enable group rad2
    
    И вуаля - абоненты из VLAN 100 - уходят на биллинг одного провайдера, а  VLAN 200 - другого.
    ip radius source-interface LoopbackN - очень полезный параметр - cisco всегда
    отправляет пакеты с src IP интерфейса  LoopbackN.
    
    
    3. Syslog log
    
    Ну тут все просто:
    
       logging 3.3.3.3
       logging source-interface LoopbackN
    
    логи всегда идут с ip на LoopbackN, маршрутизатор всегда однозначно
    идентифицируется (если этого не сделать то логи приходят и IP-а "ближайшего" к
    серверу интерфейса - неудобно если вдруг маршрутизация перестроилась)
    
       logging buffered 4000000
    
    Установка размера буфера (в байтах) для хранения log-ов прямо в памяти cisco.
    
    Теперь можно посмотреть историю событий
    
       show logging
    
    
    4. BGP
    Надо проанонсировать 2 AS-ки с одной Сisco.
    
       router bgp 111
       neighbor 1.1.1.1 route-map INET-OUT out
    
       ip prefix-list as222 seq 100 permit 2.2.2.0/24
    
       route-map INET-OUT permit 100
        match ip address prefix-list as222
        set as-path prepend 222 
    
    и на neighbor 1.1.1.1 сеть 2.2.2.0/24 придет с as-path 
    111 222
    
    что и требовалось обеспечить.
    
    Есть более изящное решение:
    
       router bgp 111
       address-family ipv4
       network 2.2.2.0 mask 255.255.255.0 route-map AS222
    
       route-map AS222 permit 100
         set origin egp 222
    
    но к сожалению работает оно не в каждом IOS-е.
    
     
    ----* Включение и настройка LLDP на коммутаторах Linksys / Cisco серий SPS и SRW средствами SNMP   Автор: Shadowcaster  [комментарии]
     
    Коммутаторы серии SPS и SRW не предоставляют средств для управления протоколом
    обнаружения (LLDP) из CLI. Данную функциональность можно активировать или
    выключить только при помощи протокола SNMP.
    
    Включенный и неправильно настроенный LLDP может предоставлять угрозу
    безопасности, распространяя информацию о устройстве и L2-параметрах во все
    активированные порты. Правильно настроенный LLDP является незаменимым
    помощником сетевого администратора, позволяет автоматически строить топологию
    сети и обнаруживать устройства на портах.
    
    Мне в руки попал Linksys/Cisco small business SPS224G4. По результатам
    snmpwalk-a видно, что устройство поддерживает LLDP, но не отправляет и не
    принимает пакеты. В cli-команды lldp run/show lldp neighbors нет.
    
    После для поисков были обнаружены mib-ы для SPS- и SRW-серий коммутаторов. Это
    перебрандированые mib-ы RADLAN-а, такую же платформу можно обнаружить в
    коммутаторах Dell PowerConnect 54xx - правда там честно написано RADLINK.
    
    Итак, для Linksys:
    https://www.myciscocommunity.com/docs/DOC-12539
    Прямой линк
    https://www.myciscocommunity.com/servlet/JiveServlet/downloadBody/12539-102-2-21519/SRW_MIB_2009.zip
    
    В дальнейшем oid приведены в цифровом виде, скачивать mib-ы нет необходимости,
    разве что для изучения обширных возможностей SNMP, которые предоставляет
    Linksys SPS/SRW.
    
    подготовим snmp на коммутаторе (cli):
    
       console# conf term
       console(config)# snmp-server enable
       console(config)# snmp-server community secret1 rw
    
    И проверим статус lldp на коммутаторе при помощи snmpwalk из пакета net-snmp
    
       snmpwalk -v2c -c secret1 <ip> 1.3.6.1.4.1.3955.89.110.1.1.1.0
       CISCOSB-LLDP-MIB::rlLldpEnabled.0 = INTEGER: false(2)
    
    попытаемся активировать lldp engine:
    
       snmpset -v2c -c secret1 <ip> 1.3.6.1.4.1.3955.89.110.1.1.1.0 i 1
       CISCOSB-LLDP-MIB::rlLldpEnabled.0 = INTEGER: true(1)
    
    проверим статус lldp на портах коммутатора:
    
       snmpwalk -v2c -c secret1 <ip> 1.0.8802.1.1.2.1.1.6.1.2
       LLDP-MIB::lldpPortConfigAdminStatus.1 = INTEGER: txAndRx(3)
       LLDP-MIB::lldpPortConfigAdminStatus.2 = INTEGER: txAndRx(3)
       LLDP-MIB::lldpPortConfigAdminStatus.3 = INTEGER: txAndRx(3)
    
    Теперь необходимо настроить коммутатор на отправку нужных TLV (параметров,
    которые мы хотим видеть с другой стороны линка)
    проверяем:
    
       snmpwalk -v2c -c secret1 <ip>  1.0.8802.1.1.2.1.1.6.1.4
       LLDP-MIB::lldpPortConfigTLVsTxEnable.1 = BITS: 00
       LLDP-MIB::lldpPortConfigTLVsTxEnable.2 = BITS: 00
       LLDP-MIB::lldpPortConfigTLVsTxEnable.3 = BITS: 00
    
    и выставляем разумный минимум:
    
       snmpset -v2c -c secret1 <ip>  1.0.8802.1.1.2.1.1.6.1.4.<portnumer> x F0
       LLDP-MIB::lldpPortConfigTLVsTxEnable.<portnumer> = BITS: F0 portDesc(0) sysName(1) sysDesc(2) sysCap(3)
    
    повторить для каждого порта, на котором нужно включить LLDP
    
    На данном этапе соседи должны увидеть LLDP соседа на линкe. Проверим:
    
       snmpwalk -v2c -c secret1 <neighbor_ip>  1.0.8802.1.1.2.1.4.1.1
    
       LLDP-MIB::lldpRemChassisIdSubtype.41429900.1.1 = INTEGER: macAddress(4)
       LLDP-MIB::lldpRemChassisId.41429900.1.1 = Hex-STRING: 00 22 6B xx xx xx
       LLDP-MIB::lldpRemPortIdSubtype.41429900.1.1 = INTEGER: interfaceName(5)
       LLDP-MIB::lldpRemPortId.41429900.1.1 = STRING: "g2"
       LLDP-MIB::lldpRemPortDesc.41429900.1.1 = STRING: Ethernet Interface
       LLDP-MIB::lldpRemSysName.41429900.1.1 = STRING:
       LLDP-MIB::lldpRemSysDesc.41429900.1.1 = STRING: 24-port 10/100 + 4-Port Gigabit Switch with CLI and WebView
       LLDP-MIB::lldpRemSysCapSupported.41429900.1.1 = BITS: 20 00 00 00 bridge(2)
       LLDP-MIB::lldpRemSysCapEnabled.41429900.1.1 = BITS: 20 00 00 00 bridge(2)
    
    Полезные утилиты: NeDi, SNMP::Info::LLDP
    
     
    ----* Превращение Cisco Catalyst 6500 в кабельный тестер (доп. ссылка 1)   Автор: Gleb Poljakov  [комментарии]
     
    Некоторые карты для Cisco Catalyst имеют встроенный "кабельный тестер" - Time
    Domain Reflectometry (TDR). TDR может использоваться для определения обрывов в
    кабеле, неверно обжатых коннекторов, повреждений изоляции и др.
    
    TDR поддерживается следующими медными линейными картами:
       WS-X6748-GE-TX (48 port CEF720 10/100/1000 line card)  
       WS-X6548-GE-TX/45AF (48 port CEF256 10/100/1000 line card)
       WS-X6148A-GE-TX/45AF (48 port Classic 10/100/1000 line card)
       WS-X6148-GE-TX/45AF (48 port Classic 10/100/1000 line card)
       WS-X6148A-RJ-45/45AF (48 port Classic 10/100 line card)
    
    Для тестирования кабеля необходимо выполнить две команды:
    
    1. Первая - команда на тестирование порта:
    
        6K-LV2-CL3# test cable-diagnostics tdr interface g1/3
    
        TDR test started on interface Gi1/3
        A TDR test can take a few seconds to run on an interface
        Use 'show cable-diagnostics tdr' to read the TDR results.
    
    
    2. Вторая - вывод данных тестирования:
    
        6K-LV2-CL3# show cable-diagnostics tdr interface g1/3
    
        TDR test last run on: March 5 10:22:06
        Interface Speed Pair Cable length Distance to fault Channel Pair status
       
        Gi1/3 1000 1-2 1 +/- 6 m N/A Pair B Terminated
        3-4 1 +/- 6 m N/A Pair A Terminated
        5-6 1 +/- 6 m N/A Pair C Terminated
        7-8 1 +/- 2 m N/A Pair D Short
    
    в данном тесте пара 7-8 оказалась оборвана.
    
    Ссылки:
     http://www.cisco.com/en/US/prod/collateral/switches/ps5718/ps708/prod_white_paper0900aecd805457cc.html
    
     
    ----* Маршрутизатор Cisco как PPTP клиент (доп. ссылка 1)   Автор: BETEP  [комментарии]
     
    Задача: заставить маршрутизатор Cisco с ios 12.4 работать в качестве pptp-клиента. 
    В данном примере 172.28.254.21 - pptp-сервер, а myusername и mypassword -
    соответственно имя пользователя и пароль.
    Адреса интерфейс получает по dhcp.
    
    
        service internal
        !
        no ip gratuitous-arps
        ip cef
        !
        ip multicast-routing
        vpdn enable
        !
        vpdn-group 1
        request-dialin
        protocol pptp
        rotary-group 1
        initiate-to ip 172.28.254.21
        !
        !
        interface FastEthernet 0/0
        ip dhcp
        !
        interface Dialer1
        mtu 1450
        ip address negotiated
        ip pim dense-mode
        encapsulation ppp
        dialer in-band
        dialer idle-timeout 0
        dialer string 123
        dialer vpdn
        dialer-group 1
        ppp pfc local request
        ppp pfc remote apply
        ppp encrypt mppe auto
        ppp chap hostname myusername
        ppp chap password 0 mypassword
        !
        ip forward-protocol nd
        ip route 0.0.0.0 0.0.0.0 Dialer1
        ip route 172.28.254.21 255.255.255.255 FastEthernet0/0
        !
        !
        dialer-list 1 protocol ip permit
        !
        end
    
     
    ----* Подборка команд для диагностики Cisco (доп. ссылка 1)   Автор: Konstantin Mironov  [комментарии]
     
    Общие команды
    
       sh ip traffic - всё о трафике через Cisco
       sh controllers ethernet-controller gi1/0/1 phy - информация о SFP модуле в определенном порту
       show vlan internal usage - показать используемые vlan
       sh inventory raw - в 4924 информацию о воткнутом SFP похоже посмотреть можно только так.
       sh ip protocols - всё о динамической маршрутизации
    
    BGP
    
       sh ip bgp neighbors 192.168.1.3 advertised-routes - показать что bgp отдает соседу.
    
    Диагностика проблем с TCAM, ASIC
    
       sh platform ...
       sh platform tcam utilization - место в TCAM
    
    Диагностика проблем с интефейсами/памятью/CPU
    
       sh controllers cpu-interface
       sh controllers utilization - загрузка интерфейсов в процентах. Плюс загрузка фабрики свитча
       sh controllers tcam
       sh controllers tcam asic
       sh controllers ethernet-controller phy
       sh controllers ethernet-controller port-asic statistics
       sh controllers ethernet-controller port-asic configuration
       sh controllers ethernet-controller gigabitEthernet 1/0/1
    
    Interface Commands
    
       show interfaces description
       show interfaces counters protocol status
       show interfaces summary
       show interfaces accounting
       sh interfaces stats - статистика по интерфейсам, метод коммутации
       sh interfaces switching - скрытая команда. Более подробно чем stats.
       sh interface switchport - для диагностики vlan
       show interface trunk - для диагностики vlan
    
    SDM
    
       sh sdm prefer
    
    CDP
    
       show cdp neighbors
       show cdp neighbors detail - тут так же показывается версия IOS у соседа
       show cdp entry * version - IOS соседа
       show cdp entry * protocols - протоколы
    
    Multicast
    
       sh ip multicast
       sh ip multicast interface vlan 104
       sh ip interface vlan 104
    
    PIM troubleshooting
    
       sh ip mroute
       sh ip pim interface
       sh ip pim rp [mapping]
       sh ip rpf
       sh ip pim interface vlan 25
       sh ip pim neighbor
    
    IGMP troubleshooting
    
       sh ip igmp
       sh ip igmp group
       sh ip igmp interface
       ip igmp join-group
    
     
    ----* Получение информации о VLAN на Cisco по SNMP   Автор: Трушкин Вячеслав  [комментарии]
     
    Первый интересующий нас факт: наличие тегирования фреймов на порту как такового 
    (switchport mode trunk для конфигурирования в CLI). Для этого справшиваем этот
    OID: 1.3.6.1.4.1.9.9.46.1.6.1.1.14.
    Значение 1 соответствует включенному тегированию, значение 2 - порт имеет
    какой-то другой режим, отличный от trunk.
    
    Информация, получаемая по snmp, остается актуальной только в том случае, если порт, 
    о котором мы спашиваем устройство, сконфигурирован. (Опять же прошу не путать
    определения порта и интерфейса.)
    Чтобы узнать фреймы какой ВЛС не тегируются на порту и принимаются в
    девственном виде (это я так описал native vlan),
    нужно спросить OID 1.3.6.1.4.1.9.9.46.1.6.1.1.5.N, где N -- полный номер порта
    (включает модуль, адаптер и непосредственно номер порта).
    
    Задачей сложнее является определение того, какие именно вланы разрешены на порту устройства. 
    Как известно, каждый vlan имеет идентификатор, значение которого выбирается из
    диапазона от 1 до 4095 (12 бит).
    Если 4096 разделить на четыре, то получим четыре диапазона идентификаторов: 1-1023, 1024-2047, 
    2048-3071 и 3071-4095. С этими знаниями мы можем спросить о наличии ВЛС на
    порту у следующих OID'ов:
    
       1.3.6.1.4.1.9.9.46.1.6.1.1.4 для диапазона 1-1023
       1.3.6.1.4.1.9.9.46.1.6.1.1.17 1024-2047
       1.3.6.1.4.1.9.9.46.1.6.1.1.18 2048-3071
       1.3.6.1.4.1.9.9.46.1.6.1.1.19 3071-4095
    
    Каждый запрос по OID'у, указанному выше, вернет информацию о вланах в виде
    HEX-строки для каждого порта.
    Расшифровка этой строки следующая: каждый N-ый бит (считаем биты слева направо) соответствует 
    идентификатору vlan'а в своем диапазоне. Наличие этого бита говорит о том, что
    на порту используется
    соответствующий влан. Например, для того, чтобы узнать о наличии vlan'а 3100, мы должны спросить 
    OID 1.3.6.1.4.1.9.9.46.1.6.1.1.19, и посмотреть на значение 29 бита. Его значение, равное 1, 
    говорит нам о том, что на порту разрешен vlan 3100.
    
    Хорошая ссылка: http://tools.cisco.com/Support/SNMP/do/BrowseOID.do
    
     
    ----* Конфигурация маршрутизатора Cisco по TFTP не имея пароля   Автор: Константин Брызгалов  [комментарии]
     
    Если Вам попался в руки не сконфигурированный маршрутизатор cisco БЕЗ шлейфа 
    для конфигурирования через последовательный порт - можно попробовать
    сконфигурировать устройство через tftp.
    
    1.  Подключаем устройство (например через кроссовер кабель) к интерфейсу своего компьютера.
    
    2.  Если у Вас windows - программой tftpd32 (by Jounin) отдаем устройству IP адрес по dhcp.
    
    3. Программой wireshark определяем, какие файлы для конфигурации просит устройство по tftp.
    
    4. Тем же tftpd32 по tftp отдаем устройству файл следующего содержания( в моем
    случае был запрос на файл cisconet.cfg):
    
       enable password cisca
       ip rcmd source-interface FastEthernet0/0
       no ip domain-lookup
       interface FastEthernet0/0
        ip address 192.168.8.64 255.255.255.0
        access-list 10 permit 192.168.8.1
       line vty 0 1
        password 111
        access-class 10 in
        login
        transport input telnet
       end
    
    По логам в  tftpd32 определяем момент, когда cisco забрал конфиг файл.
    Ждем немного и заходим на него через telnet с паролем 111, 
    переходим в привелигированный режим с паролем cisca. 192.168.8.1 адрес интерфейса компьютера, 
    192.168.8.64 - адрес устройства.
    
     Если у Вас на компьютере unix подобная ОС, то все проще при той-же последовательности действий.
    
    Проверено на нулевом cisco 2611( IOS Version 12.2(8)T5).
    На других версиях IOS ( или конфигурациях cisco) интерфейсы могут иметь иное
    название - какое, - можно
    подсмотреть (tcpdump, wireshark) в содержимом пакетов от cisco при загрузке и
    автоконфигурировании устройства.
    
     
    ----* Выполнение консольных команд Cisco в web-браузере   Автор: Дармидон  [комментарии]
     
    Довольно часто требуется посмотреть информацию, которая не умещается на экране. 
    Например, конфигруация или поднятые Virtual интерфейсы. Гораздо удобнее посмотреть это в браузере. 
    
    Базовая страница: https://xxx.xxx.xxx.xxx/level/15/exec/-
    
    Чтобы вывести текущую конфигурацию, добавляем к базовой странице "/show/running-config", получаем:
    
      https://xxx.xxx.xxx.xxx/level/15/exec/-/show/running-config/CR
    
    где xxx.xxx.xxx.xxx - IP адрес Cisco, 15 - уровень доступа.
    
    На этой страничке вы можете ввести любую команду консоли. 
    Причем, если вы введете, например, "show processes cpu ?" - Cisco вам выдаст
    список доступных команд с описанием.
    
    HTTPS доступ можно включить через глобальную опцию конфигурации:
    
       ip http secure-server
    
     
    ----* Копирование Cisco running-config с помощью net-snmp утилит   Автор: Бородин Олег  [комментарии]
     
    Ниже приведен рабочий скрипт для копирования running-config 
    с маршрутизатора Cisco 2811 на BSD tftp/ftp сервер с помощью пакета net-snmp.
    
    Для tftp ccCopyProtocol = 1, для ftp - 2. Возможен транспорт scp sftp, но их не проверял.
    
    #!/bin/sh
    #
    community=private
    router=192.168.2.2
    tftp=192.168.100.1
    file=routerA.conf
    user=user
    pass=password
    
    
    # ccCopyProtocol = tftp
    snmpset -v1 -c $community $router .1.3.6.1.4.1.9.9.96.1.1.1.1.2.111 i 1
    
    # ccCopySourceFileType = runningConfig
    snmpset -v1 -c $community $router .1.3.6.1.4.1.9.9.96.1.1.1.1.3.111 i 4
    
    #  ccCopyUserName = $user
    snmpset -v1 -c $community $router .1.3.6.1.4.1.9.9.96.1.1.1.1.7.111 s $user
    
    # ccCopyUserPassword = $pass
    snmpset -v1 -c $community $router .1.3.6.1.4.1.9.9.96.1.1.1.1.8.111 s $pass
    
    # ConfigFileType = networkFile
    snmpset -v1 -c $community $router .1.3.6.1.4.1.9.9.96.1.1.1.1.4.111 i 1
    
    # ccCopyServerAddress = $tftp
    snmpset -v1 -c $community $router .1.3.6.1.4.1.9.9.96.1.1.1.1.5.111 a "$tftp"
    
    # ccCopyDestFileType = $file
    snmpset -v1 -c $community $router .1.3.6.1.4.1.9.9.96.1.1.1.1.6.111  s $file
    
    # ccCopyEntryRowStatus = active
    snmpset -v1 -c $community $router .1.3.6.1.4.1.9.9.96.1.1.1.1.14.111 i 1
    
    #snmpset -v1 -c $community $router .1.3.6.1.4.1.9.9.96.1.1.1.1.14.111 i 4
    
    # timeout for exec
    sleep 10
    
    # scheck 
    snmpwalk -v1 -c $community $router  .1.3.6.1.4.1.9.9.96.1.1.1.1.10.111
    
    # ccCopyEntryRowStatus = destroy
    snmpset -v1 -c $community $router .1.3.6.1.4.1.9.9.96.1.1.1.1.14.111 i 6
    #EOF
    
     
    ----* Ренумерация VLAN на Cisco (доп. ссылка 1)   Автор: Анджей  [комментарии]
     
    Провайдер по тем или иным причинам отдает мне 802.1Q ethernet транк с несколькими вланами. 
    Естественно, что план нумерации vlan у провайдера и у меня не совпадает. 
    
    Пример преобразования  соответствующих vlan на коммутаторе:
    
       interface GigabitEthernet1/5
       description bla-bla-bla
       switchport
       switchport trunk encapsulation dot1q
       switchport trunk allowed vlan 1264-1266
       switchport trunk allowed vlan add 1356,1360-1364
       switchport mode trunk
       switchport nonegotiate
       switchport vlan mapping enable
       switchport vlan mapping 1362 1264
       switchport vlan mapping 1363 1265
    
     
    ----* Одна из причин зависания портов на коммутаторе Cisco Catalist   [обсудить]
     
    После многократного передергивания интерфейс перестает работать.
    
    show interface FastEthernet0/15
    показывает причину (err-disabled):
    
       FastEthernet0/15 is down, line protocol is down (err-disabled) 
    
    Более подробную информацию смотрим:
       show interfaces status err-disabled
       show log | include FastEthernet0/15
    
    Видим, например: link-flap или loopback.
    
    Для того чтобы интерфейс вновь заработал достаточно выполнить:
    
       conf
       interface FastEthernet0/15
       shutdown
       no shutdown
    
    Для отключения err-disabled:
       no errdisable detect cause loopback 
    
     
    ----* Логирование изменений конфигурации маршрутизатора Cisco (доп. ссылка 1)   Автор: pablo  [комментарии]
     
    Ниже приведен вариант организации слежения за изменением конфигурации, 
    в лог сохраняется информация о том, кто и какие именно команды вводил. 
    Как это выглядело раньше? 
    Кто-то зашел на железяку и внес какие-то изменения. Об этом в логе останется
    информация следующая информация:
    
       Mar 1 00:12:15.675: %SYS-5-CONFIG_I: Configured from console by one on vty0 (10.10.10.1)
    
    И всё!
    
    С некоторой версии ios появилась возможность посмотреть кто и что конкретно сделал.
    Для этого необходимо добавить в конфигурацию следующие строки:
    
       archive
       log config
       logging enable
       notify syslog
       hidekeys
    
    
    logging enable - писать лог. По умолчанию выключено.
    notify syslog - писать лог локально или посылать также на syslog сервер
    hidekeys - не записывать в лог пароли
    
    Теперь процесс логина и изменения отобразится примерно следующим образом
    (Легко определить что в гости заходил пользователь one и настроил интерфейс FastEthernet1/0):
    
       Mar 1 00:18:18.839: %PARSER-5-CFGLOG_LOGGEDCMD: User:one logged command:!exec: enable
       Mar 1 00:18:58.003: %PARSER-5-CFGLOG_LOGGEDCMD: User:one logged command:interface FastEthernet1/0
       Mar 1 00:19:11.023: %PARSER-5-CFGLOG_LOGGEDCMD: User:one logged command:ip address 192.168.1.1 255.255.255.0
       Mar 1 00:19:13.715: %PARSER-5-CFGLOG_LOGGEDCMD: User:one logged command:no shutdown
       Mar 1 00:19:15.687: %LINK-3-UPDOWN: Interface FastEthernet1/0, changed state to up
       Mar 1 00:19:16.687: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet1/0, changed state to up
    
     
    ----* Объединение сетевых интерфейсов на Cisco (включение EtherChannel) (доп. ссылка 1)   Автор: shooter  [обсудить]
     
    1. в IOS'е: в конфигурации интерфейса дается командочка:
       (config-if)# port group номер [distribution source|destination]
    
       где номер - это номер группы портов или номер etherchnnel'а, а значение дистрибьюшна - это метод 
       распределения трафика по хвостам - значение XOR-функции от MAC-адресов источника либо назначения;
    
    2. в set-based свичах: собственно, etherchannel включается командой
       (enable) set port channel mod/ports mode {on|off|desirable|auto}
    
       где порты задаются в виде, например, 3/1-4 (третий модуль, порты с первого по четвертый), 
       а моды - это, собственно, режимы портов для распознавания их специальным протоколом 
       объединения портов; если ты уверен, что тебе нужен etherchannel, задай мод on и не заморачивайся;
    
    метод распределения трафика задается командой:
       (enalble) set port channel all distributoin {ip|mac} [source|destination|both]
    
       all - в том смысле, что для всех etherchannel'ов
       both - значит, что XOR'иться будут и адреса источника, и назначения, 
       ip|mac - выбор, по каким адресам распределять трафик.
    
    
    Примеры EtherChannel соединения двух коммутаторов Catalyst:
       http://www.cisco.com/warp/public/473/89.html
       http://www.ciscosystems.cd/warp/public/473/135.html
    
     
    ----* Решение проблем с транком на новых Cisco 2950 (доп. ссылка 1)   Автор: Иванов Александр  [комментарии]
     
    Во-первых, приготовьтесь к тому, что про ISL можно забыть. Да-да! Cisco в новых
    коммутаторах 2950 отказалась
    от своего-же детища. Так что для тех, у кого есть Cisco 19хх (там как-раз из
    транков только ISL) - это проблема,
    связать 19хх и 2950 транком можно только при наличии между ними устройства понимающего dot1q и ISL.
    
    На 2950 с версией Cisco IOS Release 12.1(14)EA1 есть проблемы при работе транка
    dot1q в умолчательной
    конфигурации, а так как там это единственно возможный транк, то это большие проблемы.
    
    Первым делом на Cisco 2950 IOS Release 12.1(14)EA1 нужно выполнить
    такую команду:
         #dot1x system-auth-control
    
    Перезагрузить Cisco и настроить транки с vlan'ами...
    Радоваться жизни.
    Да, можно ещё IOS поменять :)
    
     
    ----* Как почистить подвисшую vty сессию заблокировавшую вход на Cisco (доп. ссылка 1)   Автор: Alexandre Snarskii  [обсудить]
     
    Если на cisco невозможно зайти telnet'ом, ssh или rsh и "clear line" и "clear
    line vty" не помогает.
    (Telnet DoS: http://www.opennet.ru/base/fire/1093711089_1345.txt.html)
    
    Найти tcb (tcp control block) этого соединения и почистить его на 
    уровне tcp-соединения:
    
       #show tcp brief 
       TCB       Local Address           Foreign Address        (state)
       447236F0  192.168.10.131.23       remote.host.removed.32781   ESTAB
    
       #clear tcp tcb 447236F0
       [confirm]Connection closed by foreign host.
    
     
    ----* Тестирование модемов на сервере доступа Cisco (доп. ссылка 1)   [обсудить]
     
    back-to-back тест:
        #test modem back-to-back нач_слот/нач_порт кон_слот/кон_порт
        #show modem test
    Накопительная статистика по работе модемов:
        #show modem call-stats
    Тестирование при загрузке:
        #modem startup-test
    
     
    ----* Как поднять туннель между Cisco и Linux   [комментарии]
     
    Linux (192.168.2.1):
       /sbin/ip tunnel add tunl1 mode ipip remote 192.168.1.1
       /sbin/ifconfig tunl1 192.168.3.2 pointopoint 192.168.3.1 netmask 255.255.255.252 mtu 1500
    
    Cisco (192.168.1.1):
      interface Tunnel0
        ip address 192.168.3.1 255.255.255.252
        ip mtu 1500
        tunnel source 192.168.1.1
        tunnel destination 192.168.2.1
        tunnel mode ipip
    
     
    ----* Как запретить вывод в логи Cisco ненужных сообщений (доп. ссылка 1)   [обсудить]
     
    interface Serial0/0
      no logging event link-status
      no logging event dlci-status-change
      no logging event subif-link-status
    
     
    ----* Использование в FreeBSD IEEE 802.1Q VLAN'ов совместно с Cisco Catalyst Switch   [комментарии]
     
    В конфигурации FreeBSD ядра:
        pseudo-device vlan 20 # VLAN support (для динамической генерации в новых версиях - 20 можно не писать)
    Поднимаем VLAN вручную (где 28 - vlan id на свиче, fxp0 - интерфейс воткнутый в свитч):
        ifconfig vlan0 inet 192.168.1.3 netmask 255.255.255.0 vlan 28 vlandev fxp0
    Прописываем в /etc/rc.conf:
      cloned_interfaces="vlan0"
      ifconfig_vlan0="inet 192.168.1.3 netmask 255.255.255.0 vlan 28 vlandev fxp0"
    На коммутаторе Cisco Catalyst:
        interface FastEthernet0/1  # линк к FreeBSD
            switchport mode trunk
        interface FastEthernet0/2
            switchport access vlan 28
    
     
    ----* Как включить доступ к Cisco с определенного хоста по rsh.   [обсудить]
     
    ip rcmd rsh-enable                                                              
    ip rcmd remote-host test 192.168.1.1 test
    ip rcmd remote-host admin 192.168.1.2 admin enable
    ip rcmd remote-host local_username remote_addr remote_username enable
    
     
    ----* Как в IOS настроить временную зону и переход на летнее время.   [комментарии]
     
    clock timezone TYUM 5
    clock summer-time TYUMS recurring last Sun Mar 3:00 last Sun Oct 3:00
    
     
    ----* Как пересылать логи с Cisco в syslog   Автор: LS  [комментарии]
     
    На Cisco:
        router(config)# logging x.x.x.x
        router(config)# logging source-interface fastethernet 0/0
        router(config)# logging facility local0
    В syslog.conf (syslogd нужно запускать с ключем -r):
        local0.* /var/log/cisco.log
    
     
    ----* Как подключиться к Cisco через последовательный порт   [комментарии]
     
    cu -l /dev/cuaa1 -s 9600
    Выход из cu: ~.
    
     
    ----* Как установить точное время на системных часах.   [комментарии]
     
    Для unix:
        в раз в час запускать через крон: ntpdate 194.186.254.22 195.2.64.5
    Для Cisco IOS:
       ntp clock-period 17180070 
       ntp server 195.2.64.5 version 2
       ntp server 194.186.254.22 version 2
    
     
    ----* Заметки по работе с файлом конфигурации Cisco IOS   [комментарии]
     
    Просмотреть текущий рабочий файл конфигурации:
    show running-config
    Посмотреть файл конфигурации устанавливаемый после перезагрузки:
    show startup-config
    Запустить систему автоматического интерактивного конфигурирования:setup
    Сохранить текущий рабочий конфиг в NVRAM (чтобы изменения восстановились после перезагрузки):
    copy running-config startup-config
    Загрузить конфиг загружаемый по умолчанию:
    copy startup-config running-config
    Скопировать рабочий конфиг на tftp сервер:
    copy running-config tftp
    Загрузить IOS с удаленного tftp сервера, а не из флэша:
    boot system tftp
    Скопировать содержимое флэша на удаленный tftp сервер:
    copy flash tftp
    Обновить содержимое флэша с tftp сервера:
    copy tftp flash
    
     
    ----* Шпаргалка по командам специфичным для Cisco 7600 (доп. ссылка 1)   Автор: Mar Loreto A. Apuhin  [обсудить]
     
    show catalyst [Catalyst 6000 info]
    show cwan [Catalyst WAN info]
    show diagnostic result [Diagnostics]
    show diagnostic result [Diagnostics]
    show fabric [Crossbar switching data]
    show fm interface <interface-id> [Feature Manager]
    show ibc br [Traffic to CPU]
    show inventory [Equipment inventory]
    show idprom module n [IDPROM info]
    show mac-address-table [MAC]
    show mls [Multilayer switching]
         show mls statistics  
         show mls netflow ip nowrap  
         show mls status [undocumented]
    show module [Linecard info]
    show platform [hardware]
    show power [Power info]
         show platform hardware pfc mode  
    show tcam [TCAM info]
         show tcam detail  
    show upgrade fpd [Field Programmable Device upgrade]
    attach n [Connect to SUP]
    hw-module [Reset of power-cycle specific module]
    remote command switch sho xxxx [Connect to SUP]
    ipc-cons n [Connect to Flexwan - undocumented]
    
     
    ----* PPPoE сервер на Cisco с авторизацией через Radius (доп. ссылка 1)   Автор: kukachik  [комментарии]
     
    сделано на Cisco 7507, коммутатор Catalyst 5000 все интерфейсы FE
    Помимо предоставления фиктивных адресов через Radius, создан VLAN с реальными
    адресами для тех клиентов, которым в силу определенных причин необходимы
    реальные адреса.
    
    Первым делом разрешите на cisco Radius:
    
    aaa authentication login default local
    aaa authentication ppp default group radius
    aaa authorization exec default local !запрет использования Radius для exec
    aaa authorization network default group radius
    aaa accounting network default start-stop group radius
    
    Разрешите VPN:
    
    vpdn enable
    
    Создайте группу:
    
    vpdn-group 1
    accept-dialin
    protocol pppoe
    virtual-template 1
    
    Создайте сабинтерфейсы для VLAN на внутреннем Ethernet интерфейсе:
    
    interface FastEthernet0/0.1
    description PPTP clients
    encapsulation dot1Q 2
    ip address 192.168.0.1 255.255.255.0
    no ip redirects
    ip nat inside
    pppoe enable
    
    interface FastEthernet0/0.2
    encapsulation dot1Q 2
    ip address 81.ххх.ххх.ххх 255.255.255.240
    
    Добавьте ip nat outside на Internet интерфейсе
    
    Создайте Virtual-Template1
    
    interface Virtual-Template1
    ip unnumbered FastEthernet0/0.1
    ip nat inside
    ppp authentication chap pap callin
    
    Добавьте использование функции NAT overload на Internet интерфейсе для адресов из access-list 1
    
    ip nat inside source list 1 interface FastEthernet1/0 overload
    access-list 1 permit 192.168.2.0 0.0.0.255 !для этих адресов разрешить NAT
    
    На этом интерфейсе живет Radius сервер:
    
    ip radius source-interface FastEthernet0/0.2
    
    Это его настройки:
    
    radius-server configure-nas
    radius-server host 81.ххх.ххх.ххх auth-port 1812 acct-port 1813
    radius-server retransmit 3
    radius-server timeout 30
    radius-server key xxxxxxxxxxxxxxxxx
    
    P.S. Radius у меня сам выдает IP вида 192.168.2.ххх по имени пользователя. Если
    вам это не подходит то сделайте:
    ip local pool PPPoE 192.168.2.2 192.168.2.254
    
     

       AAA, контроль dial-up пользователей

    ----* Как по SNMP скинуть dialup пользователя с линии (Cisco AS)   [комментарии]
     
    Скинуть пользователя по заданному порту (N) можно через OID:
            1.3.6.1.4.1.9.9.150.1.1.3.1.5.N
            snmpset as-1.test.ru private .1.3.6.1.4.1.9.9.150.1.1.3.1.5.N i 1
    Соспоставить логин с номером порта можно через OID:
            1.3.6.1.4.1.9.9.150.1.1.3.1.2
    Или из FAQ: snmpset -v1 as-1.test.ru private .1.3.6.1.4.1.9.2.9.10.0 i $line
    
     
    ----* Как настроить Radius так чтобы в пакете Acct-Start был ip-address ceccии, а то он передается только в пакете Acct-Stop   Автор: Nachko Halachev  [комментарии]
     
    aaa acounting update newinfo
    
     
    ----* Как заставить Cisco обращаться к Radius сразу после ввода login, не выдавая запроса на ввод пароля ?   [комментарии]
     
    На Cisco:
        radius-server optional passwords
    Если необходимо организовать переброс UUCP пользователей, то лучше остановиться на схеме 
    Login/Password/Password, т.е. авторизируем на Cisco и пробрасываем через rlogin на UUCP сервер.
    Схемы Login/Password можно добиться добавив IP Cisco в /etc/hosts.equiv, но делать это 
    крайне не рекомендуется.
    
     

       ACL, ограничение доступа, безопасность

    ----* Инсталляция сертификатов X.509 CA в Cisco IOS для DynDNS (доп. ссылка 1)   Автор: Бородин Олег  [обсудить]
     
    Для того чтобы IOS мог проверить цепочку доверия при создании TLS/SSL
    соединения для HTTPS необходимо установить X.509 CA сертификаты.
       
    Наиболее простой путь, чтобы выяснить какие сертификаты необходимы - создать
    TLS/SSL соединение к реальной системе:
    
       openssl s_client -showcerts -host dyn.dns.he.net -port 443
    
    Вывод будет содержать данные об используемых сертификатах:
    
       CONNECTED(00000004)
       depth=0 /C=US/ST=CA/L=Fremont/O=Hurricane Electric/OU=Secure Services/CN=dyn.dns.he.net/emailAddress=dnsadmin@he.net
       verify error:num=18:self signed certificate
       verify return:1
       depth=0 /C=US/ST=CA/L=Fremont/O=Hurricane Electric/OU=Secure Services/CN=dyn.dns.he.net/emailAddress=dnsadmin@he.net
       verify return:1
       ---
       Certificate chain
        0 s:/C=US/ST=CA/L=Fremont/O=Hurricane Electric/OU=Secure Services/CN=dyn.dns.he.net/emailAddress=dnsadmin@he.net
          i:/C=US/ST=CA/L=Fremont/O=Hurricane Electric/OU=Secure Services/CN=dyn.dns.he.net/emailAddress=dnsadmin@he.net
       ---
       Server certificate
       -----BEGIN CERTIFICATE-----
       MIIFtjCCA54CCQC5vsyLyslykjANBgkqhkiG9w0BAQUFADCBnDELMAkGA1UEBhMC
       ...
       BBV9BRUtZTDY6D39PmUzJhs0GQuBlZHRWNM=
       -----END CERTIFICATE-----
       subject=/C=US/ST=CA/L=Fremont/O=Hurricane Electric/OU=Secure Services/CN=dyn.dns.he.net/emailAddress=dnsadmin@he.net
       issuer=/C=US/ST=CA/L=Fremont/O=Hurricane Electric/OU=Secure Services/CN=dyn.dns.he.net/emailAddress=dnsadmin@he.net
       ---
    
    Далее, подключаемся к Cisco IOS, создаем новую точку доверия (CA trustpoint),
    копируем в терминал и инcталлируем сертификат:
    
       $ ssh router
       login:
       password:
       
       cisico# conf term
       cisico(config)# crypto pki trustpoint TEST
       cisico(ca-trustpoint)# revocation-check none
       cisico(ca-trustpoint)# enrollment terminal pem
       cisico(ca-trustpoint)# exit
       cisico(config)# crypto pki authenticate TEST
       
       Enter the base 64 encoded CA certificate.
       End with a blank line or the word "quit" on a line by itself
       
       -----BEGIN CERTIFICATE-----
       MIIFtjCCA54CCQC5vsyLyslykjANBgkqhkiG9w0BAQUFADCBnDELMAkGA1UEBhMC
       ...
       BBV9BRUtZTDY6D39PmUzJhs0GQuBlZHRWNM=
       -----END CERTIFICATE-----
       quit
       Certificate has the following attributes:
              Fingerprint MD5: C9D04C92 B9A32172 B48C1110 054E3CF6
             Fingerprint SHA1: 3FDE18F7 33EA46C2 CE737287 01FCFFA0 FCF40D06
       
       % Do you accept this certificate? [yes/no]: yes
       Trustpoint CA certificate accepted.
       % Certificate successfully imported
       cisico(config)# exit
       
       cisico# write
    
    Проверяем:
    
       cisico# show crypto pki trustpoints TEST
    
       Trustpoint TEST:
           Subject Name:
           e=dnsadmin@he.net
           cn=dyn.dns.he.net
           ou=Secure Services
           o=Hurricane Electric
           l=Fremont
           st=CA
           c=US
                 Serial Number (hex): 00B9BECC8BCAC97292
           Certificate configured.
       
       cisico# show crypto pki certificates TEST
    
       CA Certificate
         Status: Available
         Certificate Serial Number (hex): 00B9BECC8BCAC97292
         Certificate Usage: General Purpose
         Issuer:
           e=dnsadmin@he.net
           cn=dyn.dns.he.net
           ou=Secure Services
           o=Hurricane Electric
           l=Fremont
           st=CA
           c=US
         Subject:
           e=dnsadmin@he.net
           cn=dyn.dns.he.net
           ou=Secure Services
           o=Hurricane Electric
           l=Fremont
           st=CA
           c=US
         Validity Date:
           start date: 05:48:52 KLD Mar 26 2011
           end   date: 05:48:52 KLD Mar 23 2021
         Associated Trustpoints: TEST HE
         Storage: nvram:dnsadminhene#7272CA.cer
    
    Теперь можно использовать HTTPS в DynDNS-методах Cisco IOS:
    
       ip ddns update method DDNS-METH-HE
        HTTP
         add https://host.somedomain.org:password123@\
           dyn.dns.he.net/nic/update?hostname=host.somedomain.org&myip=<a>
       
       interface Dialer0
        ip ddns update DDNS-METH-HE
    
    Аналогично с другими поставщиками DynDNS-услуг.
    
     
    ----* Сброс пароля на коммутаторе Cisco Catalyst 2950   Автор: Аноним  [комментарии]
     
    Шаги, которые необходимо предпринять, для сброса забытого пароля на коммутаторе
    Cisco Catalyst 2950:
    
    1. Подключиться к консоли на коммутаторе с помощью кабеля COM-RJ45 и любого
    терминального клиента, например, Putty или HyperTerminal, входящего в
    стандартную поставку Windows, хотя у меня он подвисал где-то в середине
    процесса, а поначалу и просто не хотел коннетиться.
    
    Параметры терминального соединения:
       - бит в секунду (бод): 9600 
       - бит данных: 8 
       - четность: нет 
       - стоп-бит: 1 
       - контроль передачи: Xon/Xoff 
    
    2. Отключить кабель питания коммутатора.
    
    3. Нажать и удерживать кнопку Mode на коммутаторе, снова подключить кабель питания к коммутатору.
    
    4. Чтобы предотвратить автоматическую загрузку коммутатора (произойдет через 15
    секунд), нажать break-последовательность (Ctrl+Break в HyperTerminal).
    
    5. После загрузки и появления строки приглашения набрать команду flash_init.
    
    6. Набрать команду load_helper.
    
    7. Набрать команду "dir flash:"  (ошибка многих статьей указание набирать "dir
    flash", нужно именно на конце ":"). Появится список файлов, содержащихся во
    flash-памяти коммутатора, среди них должен быть файл конфигурации - config.text.
    
    8. Набрать команду rename flash:config.text flash:config.old для переименования
    конфигурационного файла.
    
    9. Набрать команду boot.
    
    10. В конце процесса загрузки нажать n, чтобы начать процесс установки.
    
    11. Набрать enable для входа в привилегированный режим, набрать команду rename
    flash:config.old config.text.
    
    12. Набрать команды: configure terminal, no enable secret (для сброса пароля,
    если он был установлен), enable password cisco (устанавливаем новый пароль cisco).
    
    13. Нажать Ctrl+Z, набрать команду write memory для сохранения параметров.
    
    Таким образом вся операция заняла минут 15-20, из них больше половины времени
    пришлось на уговоры HyperTerminal
    
     
    ----* Заведение пользователя в Cisco IOS, умеющего менять Access List'ы.   Автор: Andrew KOlchoogin  [комментарии]
     
    В заметке представлен набор конфигурационных команд 'privilege' в Cisco IOS,
    создающих пользователя, который мог бы менять Access List'ы на Cisco, не
    являясь на ней администратором.
    
    Пользователь имеет уровень привилегий 8 - просто так, число такое в голову пришло.
    
       !
       username remote privilege 8 secret 5 ****
       !
       privilege exec level 8 configure terminal
       privilege configure level 8 ip access-list extended
       privilege configure level 8 ip access-list standard
       privilege ipenacl all level 8 deny
       privilege ipenacl all level 8 permit
       privilege ipenacl all level 8 no deny
       privilege ipenacl all level 8 no permit
       !
    
    Ввиду особенностей работы "разделялки привилегий" на Cisco IOS в конфигурации будет следующее:
    
       !
       username remote privilege 8 secret 5 ****
       !
       privilege ipenacl all level 8 deny
       privilege ipenacl all level 8 permit
       privilege ipenacl all level 8 no deny
       privilege ipenacl all level 8 no permit
       privilege ipenacl level 8 no
       privilege configure level 8 ip access-list extended
       privilege configure level 8 ip access-list standard
       privilege configure level 8 ip access-list
       privilege configure level 8 ip
       privilege exec level 8 configure terminal
       privilege exec level 8 configure
       !
      
    
     
    ----* Принципы работы PIX/ASA firewall (доп. ссылка 1)   Автор: Misha Volodko  [комментарии]
     Часто firewall представляется неким черным ящиком который просто фильтрует проходящие пакеты. Данная заметка поможет понять, что именно происходит при фильтрации и в какой последовательности.

    Что происходит с пакетом попадающим внутрь PIX/ASA firewall, по каким параметрам принимается решение пропускать пакет дальше или нет?

    Прежде всего, замечу, что минимальными требованиями к пакету являются:

    • настроенная трансляция адресов между интерфейсами. Конечно, это требование можно отключить с помощью команды no nat-control, однако поведение по умолчанию именно такое;
    • политика доступа (access-list) разрешающая доступ.

    Минимальные условия это конечно здорово, но жизнь была бы слишком скучна, правда? :)

    Попробуем разобраться, что происходит на каждом шаге. К сожалению я не нашел подобной информации на сайте производителя. Зато под рукой оказалась замечательная книга "Cisco ASA PIX and FWSM Handbook" из которой и почерпнута это информация.

    1. Initial Checking

    Базовые проверки на целостность пакета, допустимые опции и прочее. Именно на этом этапе проводится проверка Reverse Path Forwarding про которую я уже рассказывал.

    Отмечу, что RPF будет полноценно работать только в случае спуфинга адресов между интерфейсами. В классическом случае outside - ASA - inside спуфинг на outside интерфейсе определить он не сможет.

    2. Xlate lookup (outbound)

    Именно сейчас проверяется одно из минимальных условий - трансляция адресов между интерфейсами. Совершенно неважно будет это статическая трансляция one to one или динамическая с применением overload.

    Сначала firewall попытается найти уже существующую трансляцию (можно посмотреть по show xlate), в случае неудачи пытается создать, если конечно политика это предусматривает.

    Этот шаг происходит на разных этапах в случае входящего/исходящего соединения. Проверка осуществляется на втором шаге в случае исходящего соединения. Этому есть логичное объясниение - адрес источника будет переписан и именно он должен фигурировать в дальнейших проверках (acl).

    Повторюсь. Это поведение можно выключить используя no nat-control. Однако, до версии прошивки 7.1 этого сделать было нельзя.

    Также именно здесь firewall проверяет такие параметры как:

    • лимиты на количество активных соединений;
    • лимиты на количество полу-открытых соединений (embryonic);
    • таймауты на соединение.

    3. Connection lookup

    Поскольку firewall у нас "умный" и знает, что такое stateful фильтрация, ему необходимо когда-то проверять состояние соединения. Почему бы не на этом этапе? :)

    Литературы по stateful фильтрации достаточно, описывать еще раз не буду.

    4. ACL lookup

    Именно на этом этапе происходит что-то знакомое. Как видно из названия проверяется политика доступа - поиск соответствующего access-list

    По умолчанию никаких acl не применено. Трафик разрешен с более безопасного интерфейса на менее безопасный. Уровень безопасности определяется значением security level.

    5. Xlate lookup (inbound)

    Происходит та же проверка, что и на шаге 2. Но только для входящего трафика.

    6. Uauth lookup

    В случае если firewall используется как cut-through authentication proxy на этом шаге проверяются логин/пароль пользователя для его аутентификации.

    Если это не первое соединение инициируемое пользователем проверяется таймер аутентификации.

    7. Inspection

    На последнем шаге осуществляется инспекция протокола. Конкретные действия выполняемые в этом случае очень сильно зависят от инспектируемого протокола.

    Про самые интересные постараюсь рассказать в следующих заметках.

     
    ----* Защита маршрутизатора Cisco от DoS атак. (доп. ссылка 1)   [обсудить]
     
    Резюме статьи http://www.informit.com/articles/article.asp?p=345618
    Диагностика:
        Оценка загрузки CPU
           show processes cpu
           show processes cpu history
           sh int switching
    
        Слежения за счетчиками на ACL
           clear access-list counters N
           show access-list N
     
       Сброс статистики срабатываний ACL в syslog:
           access-list 100 deny icmp any any echo reply log-input
    
       Netflow
           interface N
              ip route-cache flow  или ip route-cache distributed 
           ip flow-export IP UDP_port
           show ip cache flow
           Code Red Worms
               show ip cache flow | include 0050 
           Smurf Attacks
               show ip cache flow | include 0000
           clear ip flow stats
    
       TCP SYN Flood Attacks
            access-list 100 tcp permit tcp any any
            ip tcp intercept list 100
            ip tcp intercept mode {intercept | watch}
            ip tcp intercept watch-timeout {seconds}
            ip tcp intercept finrst-timeout {seconds}
            ip tcp intercept connection-timeout {seconds}
            ip tcp intercept max-incomplete high {N}
            ip tcp intercept max-incomplete low {N}
            ip tcp intercept drop-mode {oldest | random}
            show tcp intercept statistics
            show tcp intercept connections 
            debug ip tcp intercept
    
    Защита:
       Cisco Express Forwarding (CEF) Switching:
           scheduler interval Num_of_milliseconds
           scheduler allocate Num_of_milliseconds_of_interrupts Num_of_milliseconds_of_no_interrupts
       
       TCP SYN Flood Attacks
            Синтаксис
            access-list N tcp permit tcp any any
            ip tcp intercept list N
            ip tcp intercept mode {intercept | watch}
            ip tcp intercept watch-timeout {seconds}
            ip tcp intercept finrst-timeout {seconds}
            ip tcp intercept connection-timeout {seconds}
            ip tcp intercept max-incomplete high {N}
            ip tcp intercept max-incomplete low {N}
            ip tcp intercept drop-mode {oldest | random}
            show tcp intercept statistics
            show tcp intercept connections 
            debug ip tcp intercept
    
           Пример:
           access-list 100 tcp permit tcp any host 192.1.1.1 eq 80
           access-list 100 tcp permit tcp any host 192.1.1.2 eq 25
           ip tcp intercept list 100
           ip tcp intercept mode watch
           ip tcp intercept watch-timeout 20
           ip tcp intercept connection-timeout 120
           ip tcp intercept max-incomplete high 600
           ip tcp intercept min-incomplete low 500
           ip tcp intercept one-minute high 800
           ip tcp intercept one-minute low 600
    
       CBAC (Context-Based Access Control) и DoS атаки
          Синтаксис:
           ip inspect tcp synwait-time {seconds}
           ip inspect tcp finwait-time {seconds}
           ip inspect tcp idle-time {seconds}
           ip inspect udp idle-time {seconds}
           ip inspect dns-timeout {seconds}
           ip inspect max-incomplete high {number}
           ip inspect max-incomplete low {number}
           ip inspect one-minute high {number}
           ip inspect one-minute low {number}
           ip inspect tcp max-incomplete host {number} block-time {minutes}
    
           Пример:
           ip inspect tcp synwait-time 20
           ip inspect tcp idle-time 60
           ip inspect udp idle-time 20
           ip inspect max-incomplete high 400
           ip inspect max-incomplete low 300
           ip inspect one-minute high 600
           ip inspect one-minute low 500
           ip inspect tcp max-incomplete host 300 block-time 0
    
       Rate Limit:
           interface N
               no ip unreachables
    
           ip icmp rate-limit unreachable [df] {milliseconds}
           Например: ip icmp rate-limit unreachable 1000
    
           interface N
               rate-limit {input | output} [access-group [rate-limit] acl-index] {bps} {burst_normal}
                              {burst_max} conform-action {action} exceed-action {action}
           Пример 1:
           interface serial0  
               rate-limit output access-group 100 64000 4000 4000  conform-action transmit exceed-action drop
          access-list 100 permit icmp any any echo
          access-list 100 permit icmp any any echo-reply
         
          Пример 2:
          access-list 100 permit tcp any host eq www established
          access-list 101 permit tcp any host eq www
          interface serial0
              rate-limit output access-group 100 1544000 64000 64000
                             conform-action transmit exceed-action drop
              rate-limit output access-group 101 64000 16000 16000
                             conform-action transmit exceed-action drop 
    
       Мелочи:
           no ip directed-broadcast
           no service tcp-small-servers 
           no service udp small-servers
    
     
    ----* Как привязать ACL в Cisco к промежутку времени.   [обсудить]
     
    time-range night-time                     
       periodic weekdays 0:00 to 8:00                                                  
    ip access-list extended night-limit
       permit ip any 192.168.1.140 0.0.0.3 time-range night-time
     
    
     
    ----* Как на Cisco отфильтровать вирусы по содержанию пакетов. (доп. ссылка 1)   [комментарии]
     
    ip cef
    class-map match-any http-hacks
       match protocol http url "*default.ida*"
       match protocol http url "*x.ida*"
       match protocol http url "*cmd.exe*"
       match protocol http url "*root.exe*"
    policy-map mark-inbound-http-hacks
       Router(config-pmap)#class http-hacks
       Router(config-pmap)#set ip dscp 1
    access-list 101 deny ip any any dscp 1 log
    access-list 101 permit ip any any
    Внешний интерфейс:
    interface Ethernet1/0
        service-policy input mark-inbound-http-hacks
    Внутренний интерфейс:
    interface Ethernet1/1
         ip access-group 105 out
    Проверка:
    show policy-map interface e1/0
    
     
    ----* Как включить доступ на Cisco через ssh (доп. ссылка 1)   [комментарии]
     
    hostname имя_хоста
    ip domain-name доменное_имя
    crypto key generate rsa
    ip ssh time-out 120
    ip ssh authentication-retries 3
    line vty 0 4 
      transport input telnet ssh 
    !
    show crypto key mypubkey rsa
    
     
    ----* Какие команды IOS использовать на Cisco для защиты от некоторых DoS атак ?   [обсудить]
     
      no ip source-route
      no cdp run
      no ip unreachables
      no ip proxy-arp
      no ip redirects
      no ip directed-broadcast  - Защита от Smurf атак
    Настроить Anti-spoofing ACL.
    
     
    ----* Как правильно на Cisco заблокировать ping хостов в моей сети.   [комментарии]
     
    ip access-list extended e1-in
      ! Allow fragmentation needed messages (type 3 code 4)
       permit icmp any 192.168.0.0 0.0.255.255 packet-too-big
      ! Allow outbound ping and MS style traceroute (type 0)
       permit icmp any 192.168.0.0 0.0.255.255 echo-reply
      ! Uncomment to allow ping to the inside net (type 8)
      ! permit icmp any 192.168.0.0 0.0.255.255 echo
      ! Uncomment to allow traceroute
      ! permit icmp any 192.168.0.0 0.0.255.255 ttl-exceeded
    
     
    ----* Как установить пароль для доступа на Cisco   [комментарии]
     
    Установка шифрованного пароля для входа в привелегированный режим:
         enable secret <пароль>
    Установка пароля для доступа с консоли:    
         (config)#line console 0
         (config-line)#login
         (config-line)#password [пароль]
    Установка пароля для входа через telnet:
         (config)#line vty 0 4
         (config-line)#login
         (config-line)#password [пароль]
    
     

       VoIP

    ----* Запуск Linux Skype 4.0.0.8 под управлением FreeBSD (доп. ссылка 1)   [комментарии]
     
    Как известно порт net/skype уже несколько лет не обновлялся, а предлагаемая
    в порте версия Skype 2.1 не позволяет совершать видеовызовы клиентов,
    пользующихся новыми выпусками Skype для Windows. В списке рассылки freebsd-emulation
    опубликована
     инструкция по запуску  Linux-версии  Skype 4.0.0.8 во FreeBSD.
    
    Устанавливаем следующие Linux-библиотеки, которые можно найти в составе порта  emulators/linux_base-c6:
    
       lib/ld-2.12.so
       lib/ld-linux.so.2
       lib/libgcc_s-4.4.6-20110824.so.1
       lib/libgcc_s.so.1
       lib/libdl-2.12.so
       lib/libdl.so.2
       lib/libglib-2.0.so.0
       lib/libglib-2.0.so.0.2200.5
       lib/libc-2.12.so
       lib/libc.so.6
       lib/libpthread-2.12.so
       lib/libpthread.so.0
       usr/lib/libstdc++.so.6
       usr/lib/libstdc++.so.6.0.13
    
    
    В makefile порта emulators/linux_base-c6 комментируем строку:
    
       CONFLICTS=linux_base-gentoo* linux_base-f* linux-glib2-*
    
    и выполняем
     
       make patch
    
    После этого копируем собранные библиотеки в /compat/linux
    Ставим символическую ссылку libtiff.so.3 на libtiff.so.4. 
    
    Замена библиотек, вместо установки порта emulators/linux_base-c6, необходима
    для сохранения совместимости с linux-f10-flashplugin. Если потребности в
    запуске Flash нет, можно просто установить порт emulators/linux_base-c6 без
    ручного копирования.
    
    Устанавливаем переменную compat.linux.osrelease в 2.6.18:
    
       sysctl compat.linux.osrelease=2.6.18
    
    Для обеспечения поддержки видеовызовов заменяем в коде ядра FreeBSD
    заголовочный файл linux_videodev2.h, скопировав новый вариант из порта  multimedia/linux_v4l2wrapper-kmod:
    
            cd /usr/ports/multimedia/linux_v4l2wrapper-kmod
            make patch
            mv -i /sys/compat/linux/linux_videodev2.h{,.bak}
            cp -i work/linux_v4l2/linux_videodev2.h /sys/compat/linux
    
    После этого пересобираем ядро FreeBSD.
    
     
    ----* Набор номера на Cisco IP Phone 7960/7940 из скрипта   Автор: Alex Samorukov  [комментарии]
     
    Решил поделиться скриптом для набора номера на аппаратах Cisco IP Phone
    7960/7940 (возможно, работает и на других с аналогичной прошивкой). Зачем это
    может быть нужно? Я это использую для интеграции с callto:// links и
    интеграцией со своим телефонным справочником. Скрипт работает через telnet, так
    что вы должны включить его на телефоне. Набор номера использует команду test,
    которая служит для эмуляции нажатия кнопок на аппарате. Пауза (с зависимостью
    от длинны номера) требуется для того, чтобы телефон не сходил с ума.
    
    Надеюсь, кому-то это скрипт тоже пригодится.
    
       #!/usr/bin/perl
    
       use Net::Telnet;
       use Time::HiRes;
    
       # cisco phone host name
       my $host='192.168.0.1';
       # cisco phone password
       my $password='cisco';
       # mute on a dial 0/1
       my $mute=0;
    
       my $sleeptime=.2;
       my $prompt='/> $/';
    
       my $argc = @ARGV;
       if ($argc!=1){
           print "Usage: call.pl <number>\\n";
           exit;
       }
       my $number=@ARGV[0];
    
       if($number!~/^[0-9*#]+$/) {
           print "Error: wrong characters in the numer\\n";
           exit 2;
       }
       $telnet = new Net::Telnet ( Timeout=>3, Errmode=>'die');
       # connecting
       $telnet->open($host);
       $telnet->waitfor('/Password :$/i'); 
       $telnet->print($password); 
       $telnet->waitfor($prompt);
       
       $telnet->print('test open');
       $telnet->waitfor($prompt);
       $telnet->print('test key spkr');
       $telnet->waitfor($prompt);Time::HiRes::sleep($sleeptime);
       if($mute){
           $telnet->print('test key mute');
           $telnet->waitfor($prompt);Time::HiRes::sleep($sleeptime);
       }
       $telnet->print("test key ".$number."#");
       $telnet->waitfor($prompt);Time::HiRes::sleep((length($number)+1)*$sleeptime);
       $telnet->print('test close');
       $telnet->waitfor($prompt);
       $telnet->close($host);
    
     
    ----* Телефонная книга Asterisk для eyeBeam 1.x   Автор: desenix  [комментарии]
     
    Итак, есть Asterisk (использовался 1.10 beta) и программный VoIP-телефон
    eyeBeam 1.x, связь с книгой соответственно осуществляется через WebDav. Для
    eyeBeam 1.5.x не подходит, так как другой формат записей и сохранять через
    WebDav он не умеет (видимо писала другая команда).
    
    
    Настройки софтфона:
    
       Server-side Storage:
    	Storage method: WebDAV
    	Use SIP credentials: +
    	Root URL: http://webdav.example.local/webdav/
    	WebDAV pool time: 600
    
    Так как все пользователи будут в одном каталоге, их файлы имеют разные имена,
    теоретически возможна порча одним пользователем, файла телефонной книги другого.
    
    Ещё нам понадобиться Apache с модулем WebDAV, его конфигурация:
    
       <VirtualHost *:80>
           ServerName webdav.example.local
           ServerAdmin webmaster@example.local
           DocumentRoot /server/www/WEBDAV
           ErrorLog "/server/www/WEBDAV/error.log"
    
           <Directory /server/www/WEBDAV/>
               AllowOverride None
               Order deny,allow
               deny from all
           </Directory >
    
           <Directory /server/www/WEBDAV/webdav/>
               Options Indexes MultiViews
               AllowOverride None
               Order allow,deny
               allow from all
           </Directory>
    
           DavLockDB /server/www/WEBDAV/DavLock
           <Location /webdav/>
               DAV on
               AuthType Basic
               AuthName "WebDav"
               AuthUserFile /server/www/WEBDAV/paswd
               Require valid-user
           </Location>
       </VirtualHost>
    
    Создаём директорию /server/www/WEBDAV/webdav/ или в другом месте по желанию,
    назначаем владельцем пользователя из под которого работает Apache. Файл паролей
    создавать не надо, его создаст скрипт, о котором далее.
    
    Создаём там где удобно файл phonebook.pl, его необходимо запускать после
    добавления/удаления пользователя из Asterisk, как это сделать автоматически не
    нашёл, поэтому запускаю руками.
    Скрипт написан немного коряво, так как пишу на Perl время от времени и по справочникам.
    
       #!/usr/bin/perl
       use POSIX;
    
       # путь к файлу пользователей Asterisk (должен существовать)
       $srccfg="/etc/asterisk/users.conf";
       # путь к файлу паролей webdav (создаётся автоматически, перезаписывается)
       $paswdfile="/server/www/WEBDAV/paswd";
       # путь к файлам профилей с телефонными книгами пользователей (создаётся автоматически, перезаписывается)
       $phbookfiles="/server/www/WEBDAV/webdav";
       # домен SIP, используется при генерации телефонных книг
       $sipdomain="example.local";
    
       # суффикс телефонной книги eyeBeam в формате XML, для webdav  (константа, не менять!)
       $phbooksuf="resource-list.xml";
       # суффикс для файла с правилами (константа, не менять!)
       $phrulesuf="presence-rules.xml";
       # путь для временных файлов
       $tmpath="/var/tmp";
       # владелец файлов, от которого выполняется Apache ( автоматически  
       # назначается создаваемым файлам телефонной книги и файлу паролей )
       $apacheuser="apache.apache";
       # приложение для генерации файла паролей.
       $htpasswd="htpasswd";
    
       open(SF, "$srccfg") || die;
    
       $flag=0;
       @number=();
       @name=();
       @pasw=();
       $cnt=0;
       $phonetext="";
       while ($line = <SF>)
            {
            $st = $line=~s/^\[(.*)\].*[\n\r]*/\1/g;
            if($st) { 
                 $flag=1; 
                 $number[$cnt]=$line;  
            }
    
            $st = $line=~s/^fullname\s*=\s*([^\n\r]*)\s.*/\1/g;
            if($st && $flag) { 
                 $name[$cnt]=$line; 
                 $flag=$flag+1;
                 $st = $number[$cnt]=~m/general/g;
                 if($st) { $flag=0; }
            }
    
            $st = $line=~s/^secret\s*=\s*([^\n\r]*)\s.*/\1/g;
            if($st && $flag) { 
                 $pasw[$cnt]=$line; 
                 $flag=$flag+1; 
            }
    
            if($flag>=3){ 
                $flag=0;
                   $phonetext = $phonetext."    \\r\n\      ".$name[$cnt]."\\r                                                                                                                                                              \n\    \r\n";
                    #print("\\                                                                                                                                                              n\r\".$name[$cnt]."\\n\r\\n\r");
        
                    #print "pasword=$pasw[$cnt]\r\n";
    
                    if($cnt==0){ system $htpasswd, "-bc", $paswdfile, $number[$cnt], $pasw[$cnt]; }
                    else{ system $htpasswd, "-b", $paswdfile, $number[$cnt], $pasw[$cnt]; }
                    $cnt=$cnt+1;
                    }
            }
       close(SF);
    
       # chown
       system "chown", $apacheuser, $paswdfile;
    
       $phonemask1="\<display\-name\>PhoneBook\<\/display\-name\>\r\n";
       $phonemask2="\<\/list\>";
       $phonemask = '\<display\-name\>PhoneBook\<\/display\-name\>.*?\<\/list\>';
       $cntt=0;
       while($cntt<$cnt){
          $fphbook=$phbookfiles."/".$number[$cntt].".". $sipdomain.".".$phbooksuf;
          $fphrule=$phbookfiles."/".$number[$cntt].".". $sipdomain.".".$phrulesuf;
          $cntt=$cntt+1;
          if( -e $fphbook){ print "Update: $fphbook\r\n";
             open(SF, "$fphbook") || die "Can't open file read $fphbook";
             @var = <SF>;
             close(SF);
             $var = join('',@var);
             $st = $var =~ s/\<display\-name\>PhoneBook\<\/display\-name\>.+?<\/list>/$phonemask1$phonetext$phonemask2/si;
             print "RES:$st\r\n";
             if($st) {
                    system "chmod", "666",$fphbook;
                    open(SF, ">$fphbook") || die "Can't open file write $fphbook";
                    print SF $var;
                    close(SF);
                    system "chmod", "644",$fphbook;
             }#if
          }else{ # файл не существует, создадим его
               print "Create: $fphbook\r\n";
               open(SF, ">$fphbook") || die;
               print SF  "\\r\n";
               print SF  "\\r\n";
               print SF  "  \\r\n";
               print SF  "    \PhoneBook\\r\n";
               print SF  "$phonetext";
               print SF  "  \\r\n";
               print SF  "  \\r\n";
               print SF  "    \Private\\r\n";
               print SF  "  \\r\n";
               print SF  "  \\r\n";
               print SF  "    \Choose\\r\n";
               print SF  "  \\r\n";
               print SF  "\\r\n";
               close(SF);
               # chown
               system "chown", $apacheuser, $fphbook;
          }
    
          if( ! -e $fphrule){
              print "Create: $fphrule\r\n";
              open(SF, ">$fphrule") || die;
              print SF  "\\r\n";
              print SF  "\\r\n";
              print SF  "\\r\n";
              close(SF);
              # chown
              system "chown", $apacheuser, $fphrule;
          }
    
       #print "$fphbook\r\n";
       }#while 
    
    Нюансы:
    1. Для данного софтфона, книга подгружается и сохраняется сама, по указанному таймауту.
    
    2. В справочнике появляется группа PhoneBook, в ней контакты Asterisk, если
    туда добавить что-то из софтфона, при следующем обновлении будет затёрто.
    Поэтому для иных контактов можно создавать другие группы (прямо в софтфоне) и в
    них добавлять свои контакты. Так для этого специально скриптом создаётся пустая
    группа Personal.
    
    PS: Желающие могут доработать скрипт, например создать отдельно группы
    конференций, служебную (голосовая почта и т.п.)
    
     
    ----* Донабор номера по одной цифре и организация гудка после 8/9 в Asterisk (доп. ссылка 1)   Автор: Alex/AT  [комментарии]
     
    Нижеизложенный пример конфигурации Asterisk позволяет обеспечить вывод гудка
    после набора "8" или "9", как на городском телефоне, и решить проблему со
    временем ожидания вызова (некоторые пользователи не успевают набрать номер, но
    если увеличить задержку, другие жалуются на излишне долгий вызов) через
    организацию донабора номера по одной цифре.
    
    
       [upats]
       ; номера "УПАТС"
       exten => 100,1,Dial(SIP/Local100,,tT)
       exten => 100,n,Congestion()
       exten => 100,n,Hangup()
       exten => 101,1,Dial(SIP/Local101,,tT)
       exten => 101,n,Congestion()
       exten => 101,n,Hangup()
    
       ; экстренные службы
       exten => _0[1-4]!,1,Dial(SIP/external/${EXTEN})
       exten => _0[1-4]!,n,Congestion()
       exten => _0[1-4]!,n,Hangup()
       exten => _112!,1,Dial(SIP/external/${EXTEN})
       exten => _112!,n,Congestion()
       exten => _112!,n,Hangup()
       exten => _911!,1,Dial(SIP/external/${EXTEN})
       exten => _911!,n,Congestion()
       exten => _911!,n,Hangup()
    
       ; набор номера между странами через "810", к сожалению, длина номера произвольная :(, 
       ; и решение на эти номера не сработает - номер придется набирать быстро; 
       ; выход во внешний мир - через "8" на внешнем операторе
       exten => _810X!,1,Dial(SIP/external/8${EXTEN:1},,tT)
       exten => _810X!,n,Congestion()
       exten => _810X!,n,Hangup()
    
       ; набор номера через "8", выход во внешний мир - через "8" на внешнем операторе
       exten => _8NXXXXXXXXX!,1,Dial(SIP/external/8${EXTEN:1},,tT)
       exten => _8NXXXXXXXXX!,n,Congestion()
       exten => _8NXXXXXXXXX!,n,Hangup()
    
       ; набор городского номера через "9", выход на городские номера прямой на внешнем операторе
       exten => _9NXXXXXX!,1,Dial(SIP/external/${EXTEN:1},,tT)
       exten => _9NXXXXXX!,n,Congestion()
       exten => _9NXXXXXX!,n,Hangup()
      
       ; обработка донабора в случае, если абонент ничего вменяемого не набрал
       exten => _X!,1,Set(X_PREDIGITS=${EXTEN})
       exten => _X!,n,Set(X_ORIGCONTEXT=${CONTEXT})
       exten => _X!,n,Set(X_REPEATS=1)
       exten => _X!,n,Goto(more,s,1)
    
       ; а сюда подаем в случае полной засады
       exten => i,1,Congestion()
       exten => i,n,Hangup()
    
       ; а это, собственно, процедура донабора
    
       [more]
       ; проверка прогресса вызова
       exten => s,1,GotoIf($["${X_PROGRESS}" = "1"]?tone)
       exten => s,n,Set(X_PROGRESS=1)
       exten => s,n,Answer()
       exten => s,n(tone),GotoIf($["${X_TONE}" = "2"]?wait)
       exten => s,n,GotoIf($["${X_TONE}" = "1"]?check)
    
       ; нужно проиграть гудок?
       exten => s,n,GotoIf($[${LEN(${X_PREDIGITS})} > 1]?setstop)
       exten => s,n,GotoIf($[$["${X_PREDIGITS:0:1}" != "9"] & $["${X_PREDIGITS:0:1}" != "8"]]?setstop)
    
       ; проигрываем гудок после "8", "9"
       exten => s,n,PlayTones(425/1000)
       exten => s,n,Set(X_TONE=1)
       exten => s,n,Goto(wait)
    
       ; нужен ли еще гудок?
       exten => s,n(check),GotoIf($[${LEN(${X_PREDIGITS})} > 1]?stop)
       exten => s,n,Goto(wait)
    
       ; прекращаем гудеть
       exten => s,n(stop),StopPlayTones()
       exten => s,n(setstop),Set(X_TONE=2)
       exten => s,n,Goto(wait)
    
       ; ждем цифру (5 - интервал, который ждем перед выходом)
       exten => s,n(wait),WaitExten(5)
       exten => _X!,1,Goto(${X_ORIGCONTEXT},${X_PREDIGITS}${EXTEN},1)
       exten => t,1,Set(X_REPEATS=$[${X_REPEATS}-1])
    
       ; не успели?
       exten => t,n,GotoIf($[${X_REPEATS} >= 0]?i,1)
       exten => t,n,Goto(s,1)
    
       ; сброс линии если не успели
       exten => i,1,Congestion()
       exten => i,n,Hangup()
    
     
    ----* Решение проблемы с крахом Linux-клиента Skype (доп. ссылка 1)   [комментарии]
     
    Сегодня многие пользователи Skype отметили падение Skype-клиента для Linux
    при попытке соединения, с последующей невозможностью его повторного запуска.
    Представители Skype признали наличие проблемы и обещали оперативно её устранить.
    
    Эмпирическим путем было выявлено, что проблему можно решить удалив файл
    shared.xml в служебной директории Skype.
    
    Для решения проблемы достаточно выполнить:
       mv ~/.Skype/shared.xml ~/.Skype/shared~.xml
    
     
    ----* VoIP-звонки из web-браузера с использованием siprtmp   Автор: Александр  [комментарии]
     
    Столкнулся с необходимостью внедрить sip-телефон в браузер. На просторах
    Интернета больше всего рассказывают о решении на базе  red5 и red5phone,
    но  оно мне показался слегка монструозным и недостаточно надежным. Скажем так,
    меня не устроило соотношение времени развертывания и требуемых аппаратных
    ресурсов к уровню качества, беспроблемности поддерживания и масштабируемости. К
    тому же наблюдались проблемы при интеграции в веб-проект.
    
    Еще немного поискав в Интернете нашел проект siprtmp. Делает по сути то же
    что и red5, но написан на python и имеет гибкий веб-интерфейс.
    
    По сути веб-интерфейс siprtmp - это небольшое приложение на флеш, управляемое с
    помощью JavaScript или другого языка программирования, посредством вызова
    встроенных функций приложения и обработки событий. Имеет возможность
    встраиваться в другие флеш-приложения.
    
    Запуск сервера производится такими манипуляциями:
    
       svn checkout http://p2p-sip.googlecode.com/svn/trunk/ p2p-sip-read-only
       svn checkout http://rtmplite.googlecode.com/svn/trunk/ rtmplite-read-only
       cd ./rtmplite-read-only
       PYTHONPATH=../p2p-sip-read-only/src:.
       export PYTHONPATH
       python ./siprtmp.py
    
    Может понадобиться указать IP-адрес, который будет указываться при общении с
    вашей ip-pbx, это можно сделать при помощи ключа "-е ip". Для отладки есть ключ -d.
    
    В данной версии велика вероятность проявления ошибки, при которой будет
    невозможно совершать исходящие звонки. Лечится при помощи добавления
    комментария на строку 217 в файле  p2p-sip-read-only/src/std/rfc3261.py. Данная
    ошибка скоро со слов разработчика скоро будет устранена.
    
    При настройке sip-сервера для работы с siprtmp, пользователям, которые будут
    звонить через веб, необходимо разрешить использовать только кодек speex,
    например в Asterisk это делается так:
    
      disallow = all
      allow = speex
    
    На сайте разработчика можно найти пример телефона и подробное описание.
    Думаю значение полей понятно и без описания. Также данное решение может
    использоваться для видео-звонков и конференций. Главное не забудьте разрешить
    флеш-приложению использовать аудио устройства вашего компьютера.
    
    Официальная страница сервера: http://code.google.com/p/siprtmp/
    Официальная страница флеш-клиента: http://code.google.com/p/flash-videoio/
    Еще одна страница флеш-клиента: http://myprojectguide.org/p/flash-videoio/
    
    В данный момент совместно с разработчиком проекта осуществляются попытки
    создать полноценный демон из siprtmp.py и побороть необходимость выполнения
    "export PYTHONPATH=../p2p-sip-read-only/src:.".
    
     
    ----* Организация прямого SIP-соединения компьютеров при помощи GNU SIP Witch (доп. ссылка 1)   [комментарии]
     
    Проект GNU SIP Witch позволяет напрямую связать несколько компьютеров,
    предоставив возможность прямой отправки и приёма SIP-звонков через интернет,
    без использования внешних SIP-сервисов и шлюзов, а также давая возможность
    соединения машин, доступ в сеть которых организован через транслятор адресов
    (NAT). Выступая в роли посредника, GNU SIP Witch может быть установлен как на
    локальной машине, на которой запускается SIP-клиент, так и на сервере, позволяя
    обеспечить работу сразу для нескольких машин в локальной сети. Все операции
    обработки и кодирования медиапотоков осуществляются на стороне SIP-клиента, GNU
    SIP Witch занимается лишь согласованием SIP-соединений, обеспечивает простейшие
    операции проброса канала связи до абонента и маршрутизации вызовов по
    URI-идентификаторам абонентов, что делает программу легковесной и не
    требовательной к ресурсам.
    
    Рассмотрим процесс установки и настройки GNU SIP Witch в Ubuntu Linux для
    организации прямых звонков через интернет, используя такие SIP-клиенты, как
    Twinkle Softphone и SIP Communicator.
    
    Установим GNU SIP Witch, который присутствует в стандартном репозитории Ubuntu и Debian:
    
       sudo apt-get install sipwitch sipwitch-plugin-forward 
    
    автоматически в систему будут установлены библиотеки libexosip2-4, libosip2-4,
    libsipwitch0 и libucommon2.
    
    Конфигурация сервера:
    
    Активируем в настройках плагин forward, если планируем задействовать функции
    для перенаправления соединений для Asterisk или FreeSwitch. В
    /etc/default/sipwitch заменяем
    
       PLUGINS="none"
    
    на 
    
       PLUGINS="forward"
    
    или PLUGINS="auto" для загрузки всех доступных плагинов.
    
    Добавляем себя в группу sipwitch:
    
       sudo usermod -aG sipwitch myname
    
    
    Настройка регистратора SIP Witch
    
    Основная конфигурация SIP Witch находится в файле /etc/sipwitch.conf, в котором
    описны настройки SIP-стека, план нумерации абонентов и маршрутизация.
    
    Наиболее важные настройки в блоке <registry>:
    
    <prefix> - задает дополнительный префикс локальной нумерации абонентов.
    Рассмотрим пример присвоения абонентам трехзначных номеров из диапазона
    100-699. Блок <range> определяет диапазон доступных номеров. Блок <mapped>
    задает максимальное число пользовательских агентов, которые могут быть
    зарегистрированы на сервере.
    
       <prefix>100</prefix>
       <range>600</range>
       <mapped>700</mapped>
    
    Если сервер планируется использовать для осуществления звонков в другие
    SIP-сети, например через задействование Asterisk или FreeSwitch, то следует
    указать параметр <realm>, который определит уникальный идентификатор сервера.
    Для осуществления вызова абонентов Asterisk в качестве realm нужно прописать
    значение, указанное в конфигурации sip.conf Asterisk-сервера, например:
    
       <realm>Asterisk</realm>
    
    иначе, можно указать любой другой идентификатор.
    
    Настройка SIP-стека
    
    Рассмотрим блок <stack> в файле /etc/sipwitch.conf, в котором определяются
    такие параметры как сетевой интерфейс и номер порта для привязки. Большинство
    настроек можно оставить по умолчанию, обратить внимание стоит на параметры
    <mapped> и <localnames>.
    
    В <mapped> задается марсимальное число одновременных телефонных вызовов,
    которое sipwitch может обработать. При превышении данного лимита попытки
    подключения приведут к выводу сигнала "занято". Для обеспечения возможности
    одновременной работы всех абонентов, с учетом того, что в каждом локальном
    вызове фигурирует два локальных номера, значение <mapped> можно установить как
    половину от величины <mapped> из секции <registry>.
    
    В <localnames> задаются поддерживаемые имена хостов (аналогичные тем, что
    указаны в настройке "domain" VoIP-клиента twinkle), по умолчанию принимаются
    все имена.
    
    Например:
    
       <localnames>sip.test.ru, server.local</localnames>
    
    Для ограничения доступа к серверу только абонентов локальной сети, следует указать:
    
       <restricted>local</restricted>
       <trusted>local</trusted>
    
    Список локальных подсетей можно указать в блоке <access>, например:
    
       <access>     
          <local>172.16.59.0/24</local>
       </access>
    
    Настройка маршрутизации в SIP Witch
    
    SIP Witch может использоваться для установки на несколько узлов, позволяя
    построить большую сеть, каждый сервер в которой обслуживает  абонентов со своей
    нумерацией (например, можно соединить территориально разнесенные офисы предприятия).
    
    Указание информации о дополнительных серверах и задание правил перераправления
    вызовов производится в секции <routing>.
    
    Например, для перенаправления обращений по номерам с 200 по 299 на другой
    SIP-сервер с именем server2.local можно использовать следующее правило:
    
       <routing>
         <redirect pattern="2xx" server="server2.local"/>
       </routing>
    
    Для перенаправления обращений к номерам "3xx" на удаленный сервер можно использовать правило:
    
       <redirect pattern="3xx" target="sip:local@myserver.somewhere"/>
    
    
    Резервирование номеров для заданных пользователей
    
    
    Для привязки номеров к абонентам и определения их параметров в директории
    /etc/sipwitch.d следует создать файл c описанием абонентов. В простейшем виде
    создадим /etc/sipwitch.d/test.xml в котором заведем несколько номеров:
    
    
       <provision>
          <user id="логин1">
            <secret>пароль</secret>
            <extension>101</extension>
            <display>Отображаемое имя абонента 1</display>
          </user>
          <user id="логин2">
            <digest>хэш пароля</digest>
            <extension>102</extension>
            <display>Отображаемое имя абонента 2</display>
          </user>
        </provision>
    
    В поле id указывается логический идентификатор пользователя, например можно
    указать логин или email. В поле secret/digest задается пароль/хэш для доступа.
    В поле extension указывается телефонный номер абонента. В поле display
    указывается имя которое будет отображаться при звонке. Перенаправление вызова
    можно указать через блок <forward>.
    Для формирования хэша пароля можно использовать утилиту (-realm  можно не
    указывать, тогда будет использован realm текущего сервера):
    
       sipdigest -realm Реалм_сервера логин пароль
    
    Управление сервисом SIP Witch
    
    Запускаем sipwitch:
    
       sudo /etc/init.d/sipwitch start
    
    Для управления сервисом нужно использовать команду sipwitch, например:
    
    Вывод списка активных звонков:
       sipwitch calls
    
    Список зарегистрировавшихся клиентов:
    
       sipwitch registry
    
    Статус работы:
    
       sipwitch status
    
    Статистика по обслуживаемым звонкам:
    
       sipwitch stats 
    
    Применение изменений в файлах конфигурации:
    
       sipwitch reload
    
    
    Логи
    
    В процессе работы создается три основных лога:
    
    
    /var/log/sipwitch.log - лог для ошибок и системных событий
    /var/log/sipwitch.stats - почасовая статистика звонков
    /var/log/sipwitch.calls - полный список всех звонков
    
    Для ротации логов в систему установлен файл /var/logrotate.d/sipwitch
    Для формирования почасовой статистики используется скрипт /etc/cron.hourly/sipwitch
    
    Подключение SIP-клиентов
    
    Для осуществления звонков подойдет любой SIP-совместимый клиент, для примера настроим Twinkle:
    
       sudo apt-get install twinkle
    
    В процессе заполнения профиля, указываем приведенный в секции <user id="xxx">
    идентификатор (логин) в поле имени пользователя и имени аутентификации, в поле
    домена вводим sip.test.ru или server.local, в поле realm указываем содержимое
    поля <realm> (в нашем случае Asterisk). Во вкладке "безопасность" включаем
    шифрование ZRTP/SRTP.
    
    Соединяемся и проверяем:
    
       sipwitch registry
    
        ext user  type profile    use expires address
        101 test1   user *   0    3580 127.0.0.1:5061
        found 1 entries active of 600
    
     
    ----* Русскоговорящий будильник/напоминаловка для Asterisk (доп. ссылка 1)   Автор: cr80  [комментарии]
     
    В Asterisk есть штатный будильник - напоминаловка, если вы загляните в
    директорию /var/lib/asterisk/agi-bin, то увидите что-то похожее на wakeup.php.
    Вещь не плохая, но хочу предложить Вашему вниманию, более продвинутую версию
    русскоговорящего будильника. В нашем случае, Вы можете отправлять голосовые
    сообщения как сами себе, так и на любые другие номера. Причем задавать дату
    можно как в четком виде ГГММДД ЧЧММ, так и в неявном виде, через 10 минут от
    текущего времени, или через 3-и дня от текущей даты.
    
    Концепция будильника следующая, пользователь вводит со своего телефона
    комбинацию цифр вида *0*X*Y*Z, где
    
    X - дата, когда необходимо озвучить сообщение
    Y - время, когда необходимо озвучить сообщение
    Z - номер, на который необходимо позвонить для проигрывания сообщения
    
    
    Возможные варианты значения X (дата, когда проигрывать напоминание)
    
    0 - Звонить сегодня
    От 1 до 99 - Позвонить через 1-99 дней
    ГГГГММДД - Позвонить в конкретную дату
    
    Возможные варианты значения Y (время, когда проигрывать напоминание)
    
    0 - Звонить в это время (не работает с текущим днем)
    От 1 до 999 - Звонить через 1-999 минут
    ЧЧММ - Звонить в конкретное время
    
    Возможные варианты значения Z (номер куда будем отправлять напоминание)
    
    0 - Номер с которого звонят
    zzz -Локальный номер (у меня 3-значные номера)
    zzzzzzzzzzzzzzzzz - Внешний номер, может быть любым!
    
    Примеры:
    
    *0*0*120*0  - позвонить через 2-а часа  на свой телефон, и озвучить
    надиктованное сообщение (не забыть выключить суп!).
    
    *0*20101231*2300*777 - позвонить 31 декабря 2010 года в 23.00 на номер 777 и
    озвучить поздравление с новым годом!
    
    *0*30*1500*78123090607 - позвонить через 30 дней  в 15.00 на номер 78123090607
    и озвучить сообщение (пора оплачивать счета)!
    
    *0*20110308*0*1234567 - позвонить 8 марта 2011 года в текущее время на номер
    1234567 и озвучить поздравление с праздником!
    
    Думаю, концепция ввода даты, времени  и номера, куда необходимо позвонить для
    напоминания вам ясна. Теперь перейдем к технической реализации нашей задачи.
    
    
    В файле extensions.conf мы должны описать наш экстеншен!
    
       exten => _*0*X.,1,Answer
       exten => _*0*X.,n,AGI(reminder.agi)
       exten => _*0*X.,n,Hangup
    
    Таким образом, все набранные номера, которые начинаются с *0* попадают в наш
    контекст и включают скрипт reminder.agi
    
    Далее опишем контекст go - он запускается call файлом в момент когда происходит
    дозвон до абонента с целью озвучить надиктованное сообщение.
    
       exten => go,1,NoOp("Будильничег")
       exten => go,n,AGI(reminder_listen.agi)
       exten => go,n,HagnUp
    
    ну и теперь самое интересное, это наши скрипты
    
    /var/lib/asterisk/agi-bin/reminder.agi
    
       #!/usr/bin/perl
       use Asterisk::AGI;
       use POSIX;
       use File::Copy;
       use Time::Local;
       use Date::Calc qw (Add_Delta_Days);
    
       $AGI = new Asterisk::AGI;
       my %input = $AGI->ReadParse();
    
       $trunk="megatrank";
       # начало отсчета с 1900 года, значение year - смещение от 1900 года
       $datesec=time;
       #chomp($datesec);
       # получаем значение exten и заносим в переменную $digit - 
       # это то что набрал пользователь на своем телефоне, далее мы 
       # разберем по частям эти цифры с целью понять что хотел сказать 
       # пользователь (когда и куда звонить)
       $digit = $AGI->get_variable('EXTEN');
       # на всякий случай, выдергиваем номер звонящего
       $src = $AGI->get_variable('CALLERID(num)');
       #регулярным выражением выдергиваем значения даты времени и номера звонящего
       $digit =~ /^\*0\*(\d+)\*(\d+)\*(\d+)/;
       $wdate=$1;
       $wtime=$2;
       $wnum=$3;
    
       # вводим маленькую функцию для озвучки ошибки набора, что бы
       # несколько раз не писать один и тот же код!
       # обратите внимание, я взял звуковые файлы с http://ivrvoice.ru/downloader
       # и перекинул их  в Asterisk в папку /var/lib/asterisk/sounds/ru11 !
       sub digit_error {
          $AGI->exec('Wait',"1");
          $AGI->exec('Playback',"ru11/an-error-has-occured");
          $AGI->exec('Playback',"ru11/check-number-dial-again");
          exit 0;
       }
       # звуковые файлы в директории digits мною были заменены с 
       # английского на русский аналог, все с того же сайта. На самом 
       # деле это не совсем верно, по идее Астериск должен цеплять 
       # русские файлы после переопределения глобальной переменной LANG, 
       # однако сходу у меня не получилось, потому исправил ситуацию 
       # простым копированием файлов.
       # Данная функция, корректно для нашего чисто русского слуха, озвучивает день!
       sub say_day {
          $sayday=$_[0];
          if ("$sayday" < 20) {
             $AGI->exec('Playback',"digits/h-$sayday\\n");
          } elsif ( 20 < "$sayday" and  "$sayday" < 30 ) {
             $sayday=~/\d(\d)/;
             $AGI->exec('Playback',"digits/20");
             $AGI->exec('Playback',"digits/h-$1\\n");
          } elsif ( "$sayday" == 20 ) {
             $AGI->exec('Playback',"digits/h-20n");
          } elsif ( "$sayday" == 30 ) {
             $AGI->exec('Playback',"digits/h-30n");
          } else {
             $AGI->exec('Playback',"digits/30");
             $AGI->exec('Playback',"digits/h-1\\n");
          }
       }
    
       # берем локальное время и разбиваем на переменные
       ($sec2,$min2,$hour2,$mday2,$mon2,$year2,$wday2,$yday2,$isdst2)=localtime($datesec);
       # не забываем к году прибавить 1900 а к месяцу единичку
       $tmpyear2=$year2+1900;
       $tmpmon2=$mon2+1;
       # для проверки работы скрипта выводим на экран информацию, когда у нас задание стартовало.
       $AGI->exec('NoOp',"Старт_задания_$tmpyear2.$tmpmon2.$mday2\_в_$hour2:$min2");
       #####
       # если пользователь ввел в поле дата 8 цифр, значит он имел ввиду четкую дату!
       if (length($wdate) eq "8") {
          $wdate =~ /(\d{4})(\d{2})(\d{2})/;
          $timestamp1 = timelocal($sec2,$min2,$hour2,$3,$2-1,$1-1900);
          # если ввел 0 - значит имел ввиду что запустить будильник сегодня
       } elsif ($wdate eq "0") {
          $timestamp1=$datesec;
          # если ввел 2-х значное число, значит имел ввиду что пускть задание через сколько то дней.
       } elsif (length($wdate) ge "1" and length($wdate) le "2" and $wdate ne "0") {
          $timestamp1=$datesec + $wdate*86400;
          # ну а если ерунду ввел, значит говорим ему об этом в мягкой форме и отключаемся
       } else {
          &digit_error;
       }
       # обратите внимание, я не делал проверку на правильность ввода 
       # даты, т.е. система проверяет, кол-во дней в месяце, месяцев в 
       # году, что не есть хорошо, но на мой взгляд это не критично!
       ####
       # Та же операция с временем
       if (length($wtime) eq "4") {
          $wtime =~ /(\d{2})(\d{2})/;
          $timestamp=$timestamp1-(localtime($datesec))[2]*3600-(localtime($datesec))[1]*60+($1*3600)+($2*60);
       } elsif ($wtime eq "0") {
          $timestamp=$timestamp1+60;
       } elsif (length($wtime) ge "1" and length($wtime) le "3") {
          $timestamp=$timestamp1+$wtime*60;
       } else {
          $AGI->exec('NoOp',"Не_верно_задано_время");
          &digit_error;
       }
       ####
    
       ($sec1,$min1,$hour1,$mday1,$mon1,$year1,$wday1,$yday1,$isdst1)=localtime($timestamp);
       $mon_sound="mon-$mon1";
       $mon1++;
       $year1=1900+$year1;
    
       # В результате хитрых и не очень операций, получаем время, когда 
       # необходимо позвонить нашему абоненту!
       $AGI->exec('NoOp',"Выполнение_задачи_$year1.$mon1.$mday1\_в_$hour1:$min1");
    
       ####
       # если же дата выполнения задачи ранее текущей даты, значит 
       # пользователь ошибся при вводе даты и времени
       if ($timestamp le $datesec) {
          $AGI->exec('NoOp',"Дата_задания_меньше_текущего_времени!");
          &digit_error;
       }
       ####
       # проделываем похожую операцию с номером куда будем звонить, при 0 
       # - звоним сами себе, если длина введенных цыфр от 3-х до 4-х, 
       # значит это локальный звонок,  если ни то не другое, пользователь 
       # имел ввиду что звоним на внешний номер!
       if ( $wnum eq "0" ) {
          $ch="SIP/$src";
          $dst="$src";
       } elsif ( length($wnum) eq "4" or length($wnum) eq "3") {
          $ch="SIP/$wnum";
          $dst="$wnum";
       } else {
          $ch="SIP/$wnum\@$trunk";
          $dst="$wnum";
       }
    
       #формируем имя файла для звонка
       $records="$year1$mon1$mday1\-$hour1$min1-$dst";
       $filename="/var/lib/asterisk/sounds/records/$records.sln";
    
       CICLE3:
       # Приятный женский голос говорит - оставьте сообщение после 
       # сигнала, затем нажмите решетку или повесьте трубку. Вешать 
       # трубку не следует, т.к. нам необходимо будет подтвердить запись, 
       # потому необходимо после надиктованного сообщения нажать решетку
       $AGI->exec('Playback',"ru11/vm-intro");
       $AGI->exec('Record',"records/$records.sln||10");
    
       CICLE2:
       # Тут мы озвучиваем само сообщение и куда и когда оно будет отправлено
       $AGI->exec('Playback',"ru11/vm-soobshenie");
       $AGI->exec('Playback',"ru11/na-nomer");
       $AGI->exec('SayDigits',"$dst");
       $AGI->exec('Playback',"digits/at");
       $AGI->exec('Playback',"digits/day-$wday1");
       &say_day($mday1);
       $AGI->exec('Playback',"digits/$mon_sound");
       $AGI->exec('Playback',"digits/at");
       $AGI->exec('SayNumber',"$hour1");
       $AGI->exec('Playback',"ru11/hours");
       $AGI->exec('SayNumber',"$min1");
       $AGI->exec('Playback',"ru11/minutes");
       $AGI->exec('Playback',"records/$records");
    
       # ввели счетчик возварата к прослушки или записи, что бы пользователь не заигрывался.
       $count++;
       if ($count eq "5") {  $AGI->exec('Playback',"ru11/goodbye");  
       unlink($filename); exit 0; }
    
       # подтверждаем запись (нажмите 1-н что бы принять сообщение 2-а 
       # что бы прослушать, 3-и что бы записать его заново)
       $AGI->exec('Read',"rep|ru11/vm-review|1||1|5");
       $rep = $AGI->get_variable("rep");
    
       if ( $rep eq "2" ){
          goto CICLE2;
       } elsif ( $rep eq "3" ) {
          unlink($filename);
          goto CICLE3;
          # если пользователь вводит 1-н, тем самым подтверждая запись, 
          # ему говорить что сообщение записано и формируется call файл в 
          # контексте wakeup экстеншен go, максимальное количество 
          # попыток дозвона 3, время ожидания на проводе 60 сек. Так же 
          # говорим что CallID у нас подменяется на NOTE (напоминание), 
          # это нужно для локальных телефонов с дисплеем, что бы можно 
          # было понять от кого звонок и передаем переменную в астериск 
          # date, говорящую когда была сделана запись, а так же 
          # переменную с именем файла, который будем слушать.
       } elsif ( $rep eq "1" ) {
          $AGI->exec('Playback',"ru11/vm-msgsaved");
          open (CALL,  "> /tmp/$records");
          print CALL  "Channel:$ch\nContext:wakeup\nExtension:go
            \nPriority:1\nMaxRetries:3\nRetryTime:60\nWaitTime:60
            \nCallerID:NOTE<$src>\nSet:date=$datesec\nSet:src=$src
            \nSet:records=$records\n";
          close (CALL);
    
          # меняем атрибуты файла, что бы астериск при чтении директории 
          # outgoing не запускал сразу после перемещения нашего call файла процесс дозвона.
          utime($timestamp,$timestamp,"/tmp/$records");
          move("/tmp/$records","/var/spool/asterisk/outgoing/$records");
          $AGI->exec('Playback',"ru11/goodbye");
          exit 0;
       }
       # попрощались и удалили временный файл.
       $AGI->exec('Playback',"ru11/demo-moreinfo");
       unlink($filename);
       exit 0;
    
    
    Скрипт рабочий, у Вас могут возникнуть сложности только с модулями, в таком
    случае идем на http://search.cpan.org/  и качаем необходимые модули.
    
    Обратите внимание все записанные файлы хранятся в директории
    /var/lib/asterisk/sounds/records в формате sln - при создании директории
    поменяйте правильно права, иначе работать не будет!
    
    Сообщение записали, теперь нужно бы его прослушать.
    
    Итак скрипт ./reminder_listen.agi
    
       #!/usr/bin/perl
       use Asterisk::AGI;
       use POSIX;
       use File::Copy;
       use Time::Local;
    
       $AGI = new Asterisk::AGI;
       my %input = $AGI->ReadParse();
       $count=0;
       sub say_day {
          $sayday=$_[0];
          if ("$sayday" < 20) {
             $AGI->exec('Playback',"digits/h-$sayday\\n");
          } elsif ( 20 < "$sayday" and  "$sayday" < 30 ) {
             $sayday=~/\d(\d)/;
             $AGI->exec('Playback',"digits/20");
             $AGI->exec('Playback',"digits/h-$1\\n");
          } elsif ( "$sayday" == 20 ) {
             $AGI->exec('Playback',"digits/h-20n");
          } elsif ( "$sayday" == 30 ) {
             $AGI->exec('Playback',"digits/h-30n");
          } else {
             $AGI->exec('Playback',"digits/30");
             $AGI->exec('Playback',"digits/h-1\\n");
          }
       }
    
       # Получаем от Asterisk данные о том, откуда поступило напоминание, 
       # имя звукового файла и дата когда была сделана запись.
    
       $src = $AGI->get_variable('src');
       $records = $AGI->get_variable('records');
       $filename="/var/lib/asterisk/sounds/records/$records";
       $date = $AGI->get_variable('date');
    
       ($sec1,$min1,$hour1,$mday1,$mon1,$year1,$wday1,$yday1,$isdst1)=localtime($date);
       $mon_sound="mon-$mon1";
    
       CICLE1:
       # Начинаем грузить нашего абонента информацией откуда был сделан 
       # звонок, когда и что собственно от него хотели!
       $AGI->exec('Playback',"ru11/vm-from-phonenumber");
       $AGI->exec('SayDigits',"$src");
    
       $AGI->exec('Playback',"digits/at");
       $AGI->exec('Playback',"digits/day-$wday1");
       &say_day($mday1);
       $AGI->exec('Playback',"digits/$mon_sound");
       $AGI->exec('Playback',"digits/at");
       $AGI->exec('SayNumber',"$hour1");
       $AGI->exec('Playback',"ru11/hours");
       $AGI->exec('SayNumber',"$min1");
       $AGI->exec('Playback',"ru11/minutes");
    
       $AGI->exec('Playback',"records/$records");
       # В конце концов ошарашенного таким напором абонента мы 
       # переспрашиваем, хочет ли он еще раз прослушать наше сообщение, 
       # если да то у него еще в запасе 4-ре раза прослушки, далее цикл 
       # прервется и система ему скажет goodbye, удалит файл и повесит трубку.
       $AGI->exec('Read',"rep|ru11/vm-repeat|1||1|5");
       $rep = $AGI->get_variable("rep");
       if ( $rep eq "5" ){
          $count++;
          $AGI->exec('NoOp',"$count");
          if ($count eq "3") {
            $AGI->exec('Playback',"ru11/goodbye");  
            unlink($filename); exit 0; 
          }
          goto CICLE1;
       }
       unlink($filename);
       exit 0;
    
    Вот собственно и все. Как мог подробно изложил информацию. Конечно во многих
    местах код можно более изящно написать, но данная система работает довольно стабильно.
    
     
    ----* Использование Voice-VLAN на Cisco Catalyst для IP-телефона Nortel (доп. ссылка 1)   Автор: Gleb Poljakov  [комментарии]
     
    Как удалось выяснить и опробовать на практике, Cisco Catalyst может передавать
    информацию о Voice-VLAN на IP-телефоны Nortel.
    
    Для этого на коммутаторе достаточно включить протокол LLDP и прописать
    voice-vlan на порту телефона:
    
       #conf t
       #lldp run
       #int fa1/0/1
       #switchport voice-vlan 10
    
    И конечно нужно чтобы на телефоне тоже был включен LLDP, указано тэгировать
    Voice-VLAN и конфигурировать его автоматически. Также на телефоне необходимо
    отключить тэгирование в Data-VLAN.
    
    Тестирование проводилось на коммутаторе Catalyst 3750-24TS (IOS 12.2(46)) и
    телефонах Nortel 1110 и 1120.
    
    Ссылки:
    
    * Michael McNamara - LLDP with Cisco 3750 (http://blog.michaelfmcnamara.com/2009/01/lldp-with-cisco-3750/)
    * LLDP-MED and Cisco Discovery Protocol (http://www.cisco.com/en/US/technologies/tk652/tk701/technologies_white_paper0900aecd804cd46d.html)
    
  • Configuring LLDP and LLDP-MED (http://http//www.cisco.com/en/US/docs/switches/lan/catalyst3750/software/release/12.2_46_se/configuration/guide/swlldp.html)
  •  
    ----* Архивирование VoIP разговоров   Автор: Pavel Pogodin  [комментарии]
     
    Установка oreka ( http://sourceforge.net/projects/oreka/ ) записи разговоров на Debian lenny.
    Oreka представляет собой систему для записи аудио потоков VoIP SIP, Cisco Skinny (SCCP), 
    raw RTP или принимаемых через звуковую карту. Есть web-интерфейс для поиска и
    прослушивания записей из базы.
    
    
      apt-get install subversion 
      apt-get install sox g++ libtool libxml2-dev liblog4cxx9-dev libace-dev \
         libboost-dev libpcap0.8-dev libxerces-c2-dev libsndfile1-dev automake
      svn co https://oreka.svn.sourceforge.net/svnroot/oreka/trunk oreka
      cd oreka/orkbasecxx/
      cat /usr/share/aclocal/libtool.m4 >>aclocal.m4
      automake -a 
      libtoolize --force
      make -f Makefile.cvs
      На ошибки не обращаем внимание и повторяем последние две команды.
      automake -a 
      make -f Makefile.cvs
    
    Ну вот, теперь можно собирать 
    
      ./configure
      make
      make install
      cd ../orkaudio/
      cat /usr/share/aclocal/libtool.m4 >>aclocal.m4 
      libtoolize --force
      automake -a
      make -f Makefile.cvs 
      Повторяем последние две команды
      automake -a
      make -f Makefile.cvs 
      ./configure
      make
      make install
    
     orkaudio debug
    
     
    ----* SIP Линк между Cisco 2811 и Asterisk   Автор: urpyLLIKa  [комментарии]
     
    На Cisco делаем следующее
    
    voice service voip 
     allow-connections h323 to h323
     allow-connections h323 to sip
     allow-connections sip to h323
     allow-connections sip to sip
     redirect ip2ip
     sip
      registrar server expires max 3600 min 3600
      redirect contact order best-match
      no call service stop
    
    Делаем преобразование номера (убираем префикс 70)
    
    translation-rule 70
     Rule 0 700 0
     Rule 1 701 1
     Rule 2 702 2
     Rule 3 703 3
     Rule 4 704 4
     Rule 5 705 5
     Rule 6 706 6
     Rule 7 707 7
     Rule 8 708 8
     Rule 9 709 9
    
    Описываем куда будем отсылать звонки если наберем префикс 70
    
    dial-peer voice 116 voip
     corlist outgoing call-longdistance
     destination-pattern 70...
     progress_ind setup enable 3
     translate-outgoing called 70
     session protocol sipv2
     session target ipv4:XXX.XXX.XXX.XXX:5060
     session transport udp
     dtmf-relay rtp-nte
     codec g711ulaw
     fax rate 9600
     fax protocol pass-through g711alaw
     clid substitute name
     no vad 
    
    где XXX.XXX.XXX.XXX - Asterisk
    
    sip-ua 
     authentication username <USER> password <password>
     nat symmetric check-media-src
     retry invite 3
     retry response 3
     retry bye 3
     retry cancel 3
     retry options 0
     timers trying 1000
     sip-server ipv4:xxx.xxx.xxx.xxx
    
    где xxx.xxx.xxx.xxx - Asterisk, <USER> - авторизация на Asterisk-е, <password>
    - пароль на Asterisk-е
    
    
    
    На Asterisk
    
    <users.conf>
    [DO2]
    allow = ulaw
    context = DID_DO2
    dialformat = ${EXTEN:1}
    hasexten = yes
    hasiax = no
    hassip = yes
    host = yyy.yyy.yyy.yyy
    port = 5060
    registeriax = no
    registersip = yes
    secret = <pass>
    trunkname = Custom - DO2
    trunkstyle = customvoip
    username = <user>
    disallow = alaw,gsm,ilbc,g726,adpcm,speex,lpc10,g729
    md5secret = <md5_pass>
    insecure = port,invite
    canreinvite = no
    
    yyy.yyy.yyy.yyy - Cisco
    <user> - пользователь
    <pass> - пароль
    <md5_pass> - пароль в MD5
    
    <extensions.conf>
    DO2 = SIP/DO2
    [numberplan-custom-1]
    plancomment = DialPlan1
    include = default
    comment = _2XXXX!,1,default,standard
    include = default
    exten = _02XXX,1,Macro(trunkdial,${DO2}/${EXTEN:2})
    comment = _02XXX,1,DO2,standard
    
    [DID_DO2]
    include = default
    include = default
    include = default
    
    [numberplan-custom-2]
    include = default
    plancomment = DialPlan2
    exten = _2XXX!,1,Macro(trunkdial,${trunk_1}/${EXTEN:0})
    comment = _2XXX!,1,d1,standard
    
    рестартуем Астериск. 
    
    При наборе префикса 02 с Астериска будет производиться проброс на Cisco. 
    При наборе 70xxx со стороны Cisco проброс будет производиться на Asterisk. 
    Для упрощения конфигурирования, можно воспользоваться утилитой asterisk-gui 
    (/usr/ports/www/asterisk-gui для BSD like ports)
    
     
    ----* Пропуск звонка без идентификатора номера вызывающего абонента в пакете АОН через CISCO 5350   Автор: Вячеслав Калинин  [обсудить]
     
    Эта заметка, возможно, окажется полезной начинающим. Настраивая шлюз 5350, 
    столкнулся со следующей проблемой - звонок отлично проходил во все стороны, 
    но если при звонках с ТФОП в пакете АОН отсутствовал идентификатор абонента А, 
    звонок заворачивался на модемный пул CISCO 5350.
    
    Такая ситуация встречалась например, при звонках с сотового телефона у которого
    включена услуга анти-АОН,
    а так же при звонках с некоторых АТС, в частности из Горно-Алтайска.
    
    Решение вопроса оказалось очень простым - для пропуска таких звонков, 
    необходимо во входящем диал-пире установить answer-address T:
    
    dial-peer voice 20 pots
     description #Incoming from POTS
     huntstop
     answer-address T
     incoming called-number .T
     direct-inward-dial
     port 3/0:D
     forward-digits all
    
    В случае отсутствия answer-address T, звонок без АОН проключается на модемный пул. 
    Регулярное выражение Т подразумевает любое количество цифр, включая 0, 
    что соответствует и случаю отсутствия идентификатора вызывающей стороны.
    
     
    ----* VoIP, односторонняя слышимость на шлюзах cisco (доп. ссылка 1)   Автор: Anton V. Yuzhaninov  [комментарии]
     
    Иногда проблемы с односторонней слышимостью возникают из за того, что выключен роутинг, 
    поэтому его стоит включать на VoIP-шлюзах cisco:
       ip routing
    
    Если это не помогло, то что смотреть дальше написано в документе
    
    Troubleshooting One Way Voice Issues (http://www.cisco.com/en/US/tech/tk652/tk698/technologies_tech_note09186a008009484b.shtml)
    
     

       Настройка маршрутизации (BGP, OSPF, RIP)

    ----* Обеспечение работы IPv6 через создания туннеля на маршрутизаторе Cisco (доп. ссылка 1)   Автор: Евгений Кузнецоff  [комментарии]
     
    Сначала пройдем регистрацию на сайте Hurricane Electric - http://tunnelbroker.net/register.php
    
    Регистрация не сложная и не займет много времени. Логинимся там же на сайте и
    создаём туннель (Create Regular Tunnel). Указываем свой текущий адрес в IPv4
    формате и выбираем ближайший к нам сервер.
    
    Нам выделят две IPv6-подсети /64. По идее, там можно запросить и /48.
    
    На маршрутизаторе:
    
       enable
    
    вводим свой пароль
    
       conf t
       ipv6 unicast-routing
       interface Tunnel0
       description IPv4 to IPv6 tunnel
       no ip address
       ipv6 enable
       ipv6 address 2001:XXX:XX:XXX::2/64 <- Выданный Вам IPv6 адрес
       tunnel source AA.BB.CC.DD <- Ваш текущий IPv4 адрес
       tunnel destination 216.66.80.90 <- адрес сервера-шлюза в IPv4 формате (смотрите ближайший до Вас)
       tunnel mode ipv6ip
       ipv6 route ::/0 Tunnel0
       ipv6 dns server-address 2001:470:20::2 <- Сервер имен от Hurricane Electric для разрешения IPv6 имен
       end
    
       write mem
    
    В принципе этого достаточно - Cisco видит IPv6 сеть и имеет доступ к IPv6 ресурсам.
    
       cisco#ping 2a00:1450:8005::93
       Type escape sequence to abort.
       Sending 5, 100-byte ICMP Echos to 2A00:1450:8005::93, timeout is 2 seconds:
       !!!!!
       Success rate is 100 percent (5/5), round-trip min/avg/max = 52/53/56 ms
    
    Для открытия доступа к IPv6 для компьютера из локальной сети, следует добавить
    к конфигурации интерфейса смотрящего в локальную сеть (скажем fe0/1) следующее:
    
       int fe0/1
       ipv6 address 2001:XXX:ZZ:XXX::1/64 <- Выданный Вам IPv6 адрес из второй подсети /64
       ipv6 nd prefix 2001:XXX:ZZ:XXX::
    
    Соответственно, интерфейсу того ПК, который мы хотим выпустить по IPv6 мы
    назначим адрес 2001:XXX:ZZ:XXX::2/64 и шлюз 2001:XXX:ZZ:XXX::1 В качестве
    сервера имен для IPv6 укажем 2001:470:20::2
    
     
    ----* Организация 2 каналов с ISP: пример конфигурации BGP без возможности приема full view   Автор: macho  [комментарии]
     
    Конфигурация маршрутизатора Cisco:
    
       router bgp 5****
        no synchronization
        bgp log-neighbor-changes
        bgp deterministic-med
        network 9*.*.*.* mask 255.255.255.0
        neighbor 2*.*.*.* remote-as 3216
        neighbor 2*.*.*.* description #sov_PEER-2#
        neighbor 2*.*.*.* version 4
        neighbor 2*.*.*.* send-community
        neighbor 2*.*.*.* soft-reconfiguration inbound
        neighbor 2*.*.*.* route-map map-AS3216-in in
        neighbor 2*.*.*.* route-map map-AS3216-out out
        neighbor 3*.*.*.* remote-as 8615
        neighbor 3*.*.*.* description #cnt_PEER-1#
        neighbor 3*.*.*.* version 4
        neighbor 3*.*.*.* send-community
        neighbor 3*.*.*.* soft-reconfiguration inbound
        neighbor 3*.*.*.* route-map map-AS8615-in in
        neighbor 3*.*.*.* route-map map-AS8615-out out
        distance bgp 180 200 200
        no auto-summary
       !
       ip forward-protocol nd
       !
       ip bgp-community new-format
       ip as-path access-list 1 permit _6451[2-9]_
       ip as-path access-list 1 permit _645[2-9][0-9]_
       ip as-path access-list 1 permit _64[6-9][0-9][0-9]_
       ip as-path access-list 1 permit _65[0-9][0-9][0-9]_
       !         
       ip prefix-list bogons description #bogus nets#
       ip prefix-list bogons seq 15 permit 0.0.0.0/8 le 32
       ip prefix-list bogons seq 20 permit 127.0.0.0/8 le 32
       ip prefix-list bogons seq 25 permit 192.0.2.0/24 le 32
       ip prefix-list bogons seq 30 permit 10.0.0.0/8 le 32
       ip prefix-list bogons seq 35 permit 172.16.0.0/12 le 32
       ip prefix-list bogons seq 40 permit 192.168.0.0/16 le 32
       ip prefix-list bogons seq 45 permit 169.254.0.0/16 le 32
       ip prefix-list bogons seq 50 permit 192.42.172.0/24 le 32
       ip prefix-list bogons seq 55 permit 198.18.0.0/15 le 32
       ip prefix-list bogons seq 60 permit 192.88.99.0/24 le 32
       ip prefix-list bogons seq 65 permit 224.0.0.0/4 le 32
       ip prefix-list bogons seq 70 permit 240.0.0.0/4 le 32
       !
       ip prefix-list def_perfix description #deny def_net#
       ip prefix-list def_perfix seq 15 permit 0.0.0.0/0 le 32
       !
       ip prefix-list our_perfix description #our net#
       ip prefix-list our_perfix seq 15 permit 9*.*.*.0/24 le 32
    
    
       route-map map-AS3216-out permit 100
        match ip address prefix-list our_perfix
        set as-path prepend 5**** 5**** 5****
       !
       route-map map-AS3216-out deny 110
        match ip address prefix-list def_perfix
       !
       route-map map-AS8615-out permit 100
        match ip address prefix-list our_perfix
       !
       route-map map-AS8615-out deny 110
        match ip address prefix-list def_perfix
       !
       route-map map-AS8615-in deny 100
        description #filter private ASs#
        match as-path 1
       !
       route-map map-AS8615-in deny 110
        description #filter bogons#
        match ip address prefix-list bogons
       !
       route-map map-AS8615-in permit 200
        set local-preference 200
        set community 5****:8615
       !
       route-map map-AS3216-in deny 100
        description #filter private ASs#
        match as-path 1
       !
       route-map map-AS3216-in deny 110
        description #filter bogons#
        match ip address prefix-list bogons
       !         
       route-map map-AS3216-in permit 200
        set local-preference 100
        set community 5****:3216
    
    1. Договариваемся с провайдерами на анонсирование в вашу AS 0/0
    
    2. Манипулируем количеством повторов своего номера AS в "set as-path prepend
    5**** 5**** 5****" для направления входящего трафика.
    
       route-map map-AS3216-out permit 100
        match ip address prefix-list our_perfix
        set as-path prepend 5**** 5**** 5****
    
    3. Настраиваем маршрут назначения для исходящего трафика через "set
    local-preference 100", чем больше цифра, тем больше шанс попасть маршруту в таблицу.
    
       route-map map-AS3216-in permit 200
        set local-preference 100
        set community 5****:3216
    
    4. В итоге определили направления потоков информации, а точнее присутствие в
    таблице 0/0 от другого провайдера.
    
     
    ----* 200M поток и BGP FullView через cisco2811 + L3 свич в авральной ситуации   Автор: fantom  [комментарии]
     
    Предыстория:
    "вдруг" отвалился пограничный маршрутизатор, переваривавший BGP FullView (далее
    FV) и 200M интернета.
    Поехать на объект, разбираться что с ним - времени минимум часа 1,5-2 уйдёт,
    если что-то серьёзное, то ещё больше.
    
    На том же объекте стоит cisco 2811 (768Мб RAM), и если FV она еще примет, то
    200М ну никак не осилит.
    
    После примерно 5 минут размышлений решаю попробовать разрулить все это это 2-мя
    устройствами: cisco 2811 и L3 свичем.
    
    Порядок действий:
    
    1.Звоню апстриму, благо люди знакомые и понимающие - договариваюсь, чтобы на мой линк повесили 
    подсеть /29 вместо /30, дают подсетку 1.1.1.0/29 1.1.1.1 - на их стороне;
    1.1.1.2 - на моей для BGP.
    
    2.На L3 свиче приземляю нужный VLAN и прописываю IP 1.1.1.3/29 (L3 свич в моей
    сети участвует по OSPF-у).
    
    3.На  cisco 2811 настраиваем BGP, ключевой момент:
    
       router bgp xxx
       neighbor 1.1.1.1 route-map UP-1-OUT out
    
       route-map  UP-1-OUT permit 100
       match ip address prefix-list My-Networks
       set ip next-hop 1.1.1.3
    
    My-Networks - prefix-list в котором перечислены префиксы, для которых подставлять нужный  next-hop.
    
    Весь исходящий трафик лично я перенаправил через другой канал, оконченный на другой железке.
    
    И последний штрих - обеспечиваем отказоустойчивость, если вдруг наш L3 свитч
    перестаёт маршрутизировать
    (с недорогими моделями такое вполне может случиться) то надо как-то обеспечить
    работоспособность канала,
    было много идей и с условным анонсированием, и с редистрибуцией из другого
    протокола, но все это было
    как-то громоздко и неудобно. Решение нашлось простое и изящное - использовать VRRP !
    
    Итак на ip интерфейсе свича настраиваем vrrp группу 1 на ip 1.1.1.3 с приоритетом например 100, 
    а на cisco 2811 на соответствующем интерфейсе vrrp группу 1 на ip 1.1.1.3 с
    приоритетом например 50.
    
    для cisco выглядит так:
    
       int fast0/0.<n>
       vrrp 1 ip 1.1.1.3
       vrrp 1 priority 50
    
    Для полноты картины, дабы не "завалить" маршрутизатор в случае отказа L3 свича
    или разрыва с ним связи,
    настраиваем на порту свича, куда включён маршрутизатор, шейпер на величину
    приемлемую для маршрутизатора,
    в моем случае я настроил 40 Мбит.
    
    
    Итог.
    
    Схема проработала несколько дней (пока ремонтировали блок питания на отказавшем
    маршрутизаторе), практически без проблем.
    
    Преимущества:
    
    * такая схема может переварить трафика довольно много, при отсутствии трафика через cisco 2811 
    (напомню, что исход полностью ушёл в другой канал, в этот попало примерно 3-4% - те подсети, 
    которых не было в анонсах второго апстрима) практически производительность свича.
    * быстро и дешево.
    * довольно высокая отказоустойчивость, свич L3 и маршрутизатор могут быть
    разнесены вообще по разным
    площадкам, в общем есть пространство для маневров.
    
    Из недостатков:
    
    * нельзя снять netflow со свича, ибо мой не умеет этого.
    * недорогие L3 свичи не умеют отдать по snmp трафик по IP интерфейсу,
    определить сколько потребляется
    интернета можно только косвенными путями.
    
     
    ----* Почему при использовании туннеля возникают проблемы с некоторыми хостами. (доп. ссылка 1)   [комментарии]
     
    Выход - поставить на интерфейсе туннеля MTU 1500, вместо 1476.
    Проблема возникает при попытке протолкнуть пакет размером 1500 байт 
    с выставленным DF (don't fragment запрещена фрагментация) битом через интерфейс 1476 байт. 
    Другие решения:
    interface ethernet0 
     ip policy route-map clear-df 
    route-map clear-df permit 10 
     match ip address 101 
     set ip df 0 
    access-list 101 permit tcp 10.1.3.0 0.0.0.255 any 
    
    или
    interface tunnel0 
     ip tcp adjust-mss 1436
    
     
    ----* Как удлиннить путь, для переброса трафика на другой канал.   [комментарии]
     
    router bgp 111
     bgp router-id 1.1.1.1
     network 1.2.3.0
     neighbor 2.2.2.2 route-map SETPATH out
     neighbor 2.2.2.2 remote-as 222
     neighbor 2.2.2.2 next-hop-self
     neighbor 2.2.2.2 soft-reconfiguration inbound
     neighbor 2.2.2.2 distribute-list 60 out
    route-map SETPATH permit 10
      set as-path prepend 111 111 111
    Искуственно удлиняем путь через 222 добавления текущего номера AS (111).
    
     
    ----* Как проверить работу BGP peer'ов   [обсудить]
     
    show ip bgp neighbors
    show ip bgp summary
    
     
    ----* Изменяю конфигурацию BGP на Cisco, но похоже изменения не вступают в силу. Как сделать reset BGP сессий ?   [комментарии]
     
    clear ip bgp [ip peer'а или * для всех]
    
     

       Ограничение и учет трафика на Cisco

    ----* Организация traffic-shape'инга на cisco   Автор: Yuri A. Kabaenkov  [комментарии]
     
    Задача: урезать входящий траффик для клиента 192.168.0.1 до 128Kbit/s на маршрутизаторе cisco.
    Решение:
    На маршрутизаторе вводим следующие команды
     в режиме conf t
    access-list 145 permit ip any host 192.168.0.1
    далее врежиме конфигурации интерфейса
    traffic-shape group 145 128000 7936 7936 1000
    теперь все режется.
    
     
    ----* Включение и сбор ipaccounting   Автор: Yuri A. Kabaenkov  [комментарии]
     
    На cisco выполнить следующие команды в режиме configure terminal:
    ip rcmd rsh-enable
    ip rcmd remote-host hellman 192.168.0.1 hellman2 enable
    где hellman имя пользователя на циске,
    hellman2 имя пользователя на машине 192.168.0.1 с которой забирается статистика.
    Настройка статистики:
    в режиме конфигурации интерфейса с которого хотим снимать статистику
    ip accounting output-packets
    Для сбора и обработки на машине 192.168.0.1 из-под пользователя hellman2 выполнить:
    /usr/bin/rsh -l hellman cisco clear ip accounting checkpoint
    /usr/bin/rsh -l hellman cisco clear ip accounting
    /usr/bin/rsh -l hellman cisco sh ip accounting checkpoint
    output этих команд будет статистика ip accounting.
    
     
    ----* Тест характеристик транзитного канала, проходящего через маршрутизатор Cisco (доп. ссылка 1)   Автор: fantom  [комментарии]
     
    Собственно ситуация проста и банальна, транзит подключили, маршрутизатор (на
    схеме - R2) на удаленном узле поставили, ping побежал... И тут вполне резонный
    вопрос - соответствует ли канал заявленным характеристикам?
    
    Если бы за R2 стоял какой-то сервер, где можно было iperf запустить - проблема
    решилась бы быстро, но там на данный момент ничего кроме собственно самого R2
    нет, ехать почти 200 км тоже не очень хочется, а примерное представление о
    качестве сервиса получить надо.
    
    
    
    Возникла одна простая идея - между R1 и R2 поднять 2 туннеля, на R1 поместить
    их в разные VRF и в VRF 1 добавить интерфейс с Server 1, а в VRF 2
    соответственно интерфейс с Server 2, слегка поднастроить маршрутизацию и по
    получившейся петле прогнать трафик с сервера 1 на сервер 2.
    
    ВАЖНО! ТРАНЗИТНЫЙ КАНАЛ ДОЛЖЕН БЫТЬ СИММЕТРИЧНЫМ, т.е. с одинаковой скоростью в обоих направлениях
    
    Реализация 
    
    Выбираем номера VLAN-ов и IP-ы для линков:
    Т.к. подсеть 172.19.0.0/16 у меня нигде не используется, ее и выберем для тестов
    
       S1 -- R1 vlan 101 172.19.1.0/30
       S2 -- R1 Vlan 102 172.19.4.0/30
    
       R1 -- R2 Tun1 172.19.2.0/30
       R1 -- R2 Tun2 172.19.3.0/30
    
    
    Конфигурация серверов (OS CentOS)
    
    Настроим сервера
    
    Server 1:
    
       vconfig add eth0 101
       ifconfig eth0.101 172.19.1.1/30
       route add -net 172.19.0.0/16 gw 172.19.1.2
    
    Server 2:
    
       vconfig add eth0 102
       ifconfig eth0.101 172.19.4.1/30
       route add -net 172.19.0.0/16 gw 172.19.4.2
    
    Конфигурация маршрутизаторов
    
    R1
    
       !
       ip vrf serv_1 
        rd 111:111
       !
       ip vrf serv_2 
        rd 111:222
       !
       interface Loopback1
        description For_Tun1
        ip address 172.19.101.1 255.255.255.255
       !
       interface Loopback1
        description For_Tun2
        ip address 172.19.102.1 255.255.255.255
       !
       interface Tunnel1
        ip vrf forwarding serv_1
        ip address 172.19.2.1 255.255.255.252
        keepalive 10 3
        tunnel source 172.19.101.1
        tunnel destination 172.19.101.2
       !
       interface Tunnel2
        ip vrf forwarding serv_2
        ip address 172.19.3.1 255.255.255.252
        keepalive 10 3
        tunnel source 172.19.102.1
        tunnel destination 172.19.102.2
       !
       interface FastEthernet0/0.101
        description Server_1
        encapsulation dot1Q 101
        ip vrf forwarding serv_1
        ip address 172.19.1.2 255.255.255.252
       !
       interface FastEthernet0/0.102
        description Server_2
        encapsulation dot1Q 102
        ip vrf forwarding serv_2
        ip address 172.19.4.2 255.255.255.252
       !
       ip route vrf serv_2 172.19.1.0 255.255.255.0 172.19.2.2 
       ip route vrf serv_2 172.19.2.0 255.255.255.0 172.19.2.2
       ip route vrf serv_1 172.19.3.0 255.255.255.0 172.19.1.2 
       ip route vrf serv_1 172.19.4.0 255.255.255.0 172.19.1.2
    
    R2
    
       ip vrf tranzit 
        rd 111:333
       !
       interface Loopback1
        description For_Tun1
        ip address 172.19.101.2 255.255.255.255
       !
       interface Loopback1
        description For_Tun2
        ip address 172.19.102.2 255.255.255.255
       !
       interface Tunnel1
        ip vrf forwarding tranzit
        ip address 172.19.2.2 255.255.255.252
        keepalive 10 3
        tunnel source 172.19.101.2
        tunnel destination 172.19.101.1
       !
       interface Tunnel2
        ip vrf forwarding tranzit
        ip address 172.19.3.2 255.255.255.252
        keepalive 10 3
        tunnel source 172.19.102.2
        tunnel destination 172.19.102.1
       !
       ip route vrf tranzit 172.19.1.0 255.255.255.0 172.19.2.1 
       ip route vrf tranzit 172.19.4.0 255.255.255.0 172.19.3.1
    
    Настройки интерфейсов для транзита и маршрутизации глобальной не показаны
    
    Все, теперь трафик c Server 1 на Server 2 и обратно (точнее трафик с IP
    172.19.1.1 на 172.19.4.1) будет проходить по маршруту:
    
       Server 1 <-VLAN_101-> R1(vrf serv_1) <-Tun1-> R2(vrf tranzit) <-Tun2-> R1(vrf serv_2) <-VLAN_102-> Server 2
    
    Можно запускать iperf, или гонять любой иной трафик, строить графики загрузки и делать выводы :) 
    
    
    PS. Возникла еще одна необходимость подобной проверки R2 - cisco 2811; транзитный канал 35Мбит.
    
    1. ttcp - cisco 2811 при 5Мбит уходит в 100% CPU.
    2. Через 2 тунеля с VRF-ом - все 35М были успешно "переварены" с CPU в районе
    50-90% (сильно разнился PPS т.к. канал забивали то большими то мелкими пакетами).
    
    Вывод - ttcp ограничено применим в cisco реализации так как вся обработка уходит на процессор.
    
     
    ----* Инструмент подобный tcpdump на Cisco (доп. ссылка 1)   Автор: Misha Volodko  [комментарии]
     
    1. Cisco PIX/ASA
    
    ciscoasa(config)#access-list inside_test permit icmp any host 192.168.1.1
    ciscoasa(config)#capture inside_interface access-list inside_test interface inside
       The user pings the inside interface of the ASA (ping 192.168.1.1). This output is displayed.
    ciscoasa#show capture inside_interface
       1: 13:04:06.284897 192.168.1.50 > 192.168.1.1: icmp: echo request
    
    
    2. Cisco router
    
    Создаем ip access-list которым будем "ловить" интересующий нас трафик.
    
       routerA(conf)# access-list 111 permit ip 10.10.10.0 0.0.0.255 10.10.15.0 0.0.0.255
       routerA(conf)# access-list 111 permit ip 10.10.15.0 0.0.0.255 10.10.10.0 0.0.0.255
    
    Запускаем команду на выполнение и смотрим результат:
    
       routerA# debug ip packet 111 detail
    
          IP packet debugging is on (detailed) for access list 111
    
          Mar 1 00:10:32.975: IP: tableid=0, s=10.10.10.5 (FastEthernet0/0), d=10.10.15.1 (Serial2/0), routed via FIB
    
    Это решение не работает с fast-switching (ip route-cache). 
    
     
    ----* Как привязать MAC-адрес к порту на Cisco Catalyst (доп. ссылка 1)   Автор: Citrin  [комментарии]
     
    interface FastEthernet0/2
    port security max-mac-count 1
    port security action shutdown
    !
    interface FastEthernet0/3
    port security max-mac-count 3
    port security action shutdown
    !
    Маки запоминаются сами. Чтоб почистить то что киска запомнила нужно 
    сделать clear port-security насколько помню. 
    
     
    ----* Копирование трафика на сторонний порт в Cisco Catalyst (доп. ссылка 1)   Автор: Skiv  [комментарии]
     
    conf t
    Switch(config)# monitor session session source interface1 both
    Switch(config)# monitor session session destination interface2
    где interface1 это "реальный порт"
         interface2 это "порт для мониторинга"
         both значит что будет прослушиваться весь трафик (и туда и обратно), но можно поставить и rx или tx. 
    
     
    ----* Как зажать трафик на одном из интерфейсов маршрутизатора Cisco   [обсудить]
     
         interface Serial0
            traffic-shape rate 128000 8000 8000 1000
    или
         interface Serial1
            rate-limit output 128000 8000 8000 conform-action transmit   exceed-action drop
    traffic-shape - только исходящий трафик, rate-limit - входящий или исходящий.
    
     
    ----* Управление приоритетом трафика на Cisco (доп. ссылка 1)   [комментарии]
     
    Предотвращаем монополизацию канала сессиями с большим трафиком (WFQ вместо FIFO).
      interface Serial0
         fair-queue
    RED/WRED (Random early detect)
       interface Ethernet0
          random-detect
          hold-queue 200 out
    Определение более приоритетного трафика (уменьшаем приоритет ftp).
       interface Serial0
          priority-group 1
       !
       priority-list 1 protocol ip medium udp domain
       priority-list 1 protocol ip low tcp ftp
       priority-list 1 protocol ip low tcp ftp-data
    Ограничиваем вес трафика в очереди (75% - WWW, 5% - DNS, и 20% остальное)
       interface Serial0
          custom-queue-list 1
       !
       queue-list 1 protocol ip 1 tcp www
       queue-list 1 protocol ip 2 udp domain
       queue-list 1 default 3
       queue-list 1 queue 1 byte-count 7500
       queue-list 1 queue 2 byte-count 500
       queue-list 1 queue 3 byte-count 2000
    Правила применимы только для исходящего трафика.
    
     
    ----* Как ограничить пропускную способность для ICMP пакетов на Cisco (защита от DDoS) (доп. ссылка 1)   [обсудить]
     
    interface xy
       rate-limit output access-group 2020 3000000 512000 786000 conform-action transmit exceed-action drop
    access-list 2020 permit icmp any any echo-reply
    Плюс "ip verify unicast reverse-path" на входящий интерфейс.
    
     
    ----* Как обнулить статистику на счетчиках интерфейса   [комментарии]
     
    clear counters [интерфейс]
    
     

     Версия для печати





    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру