суббота, 2 августа 2014 г.

Настройка VoIP на устройствах cisco

Так вот, если у вас есть в наличии устройства cisco, поддерживающие VoIP, то решение проблемы лежит на поверхности :). Вам всего лишь остается скачать соответствующее ПО (а именно Cisco IP Communicator), установить его на компьютеры пользователей, немного настроить свое сетевое оборудование и вуаля :).
Как всегда, вдаваться в теорию не буду. Ее с лихвой можно найти на просторах всемирной паутины.
Для примера, я предлагаю попробовать организовать «телефонную» связь вот по такой схеме:


Итак, что мы имеем. Есть центральный офис, в котором расположен роутер (Central_Router) с поддержкой VoIP. Он подключен одним интерфейсом в локальную сеть, где имеется два vlan-а (Managers (Net_192.168.1.0/24) и Office (Net_192.168.2.0/24)). Соответственно, этот роутер является для них шлюзом по умолчанию. В этих vlan-ах находятся рабочие станции для проверки (Host_A и Host_B). На них установлен Cisco IP Communicator и заданы телефонные номера (№1001 и №2001 соответственно). Вторым концом роутер подключен к интернету.
Так же есть «очень» удаленный офис, в котором находится роутер Remote_Router. Он тоже поддерживает VoIP и у него есть два интерфейса (один для внутренней сети, один для интернета). Для удаленных пользователей есть выделенный vlan (Remote (Net_192.168.3.0/24)), в котором установлена станция для проверки Host_C с установленным Cisco IP Communicator и номером №3001, причем для этого пользователя организована двойная линия.
Для защиты нашего телефонного трафика при прохождении через интернет будем использовать GRE туннель. Это, конечно, проприетарный протокол, но он прост в настройке и, тем более, IPsec не поддерживает шифрование multicast. Для его организации используются Tunnel интерфейсы на роутерах (Tunnel0 (172.16.1.1) – на роутере Central_Router и Tunnel0 (172.16.1.2) – на роутере Remote_Router).
Одним из центральных «устройств» в телефонии cisco является Cisco Unified Communications Manager. Но он должен устанавливаться на отдельный сервер и стоит больших денег. Я предлагаю построить нашу «телефонную» сеть с помощью CME (Call Manager Express), который уже входит в состав IOS. Он имеет меньшее количество различных функций, но для небольшой компании вполне пригодится. Для задания IP-адреса, на который будут обращаться наши Cisco – телефоны (Cisco IP Communicator) будем использовать loopback интерфейсы (l0 (10.10.10.10) – на роутере Central_Router и l0 (20.20.20.20) – на роутере Remote_Router). Конечно, best practice считается создание отдельного vlan-а для телефонного трафика (vlan VOICE например), подключения в него IP телефонов cisco и так далее. Но так как у нас нет физических IP телефонов cisco, то и создавать этот vlan мы не будем.
Выход в интернет осуществляется, как обычно, через NAT.
    Для реализации схемы в среде GNS3 я использовал следующее:
  • 1. Center_Router, Internet router и Remote_Router – cisco 3640 с IOS версии c3640-jk9s-mz.124-16a;
  • 2. Switch_1 и Switch_2 – cisco с IOS версии c3745-advipservicesk9-mz[1].124-15.T6;
  • 3. Host_1, Host_2 и Host_3 – реализованы с помощью VirtualBox. Гостевая ОС Windows XP;
  • 4. На конечных станциях установлен Cisco IP Communicator version 7.0.2.0.
Цель – организовать «телефонную» сеть (VoIP) на оборудовании cisco между всеми конечными пользователями.
Приступим. Как обычно, настроим сетевую доступность. Начнем с коммутаторов.
Switch_1:

R4>en
R4#conf t
R4(config)#hostname Switch_1
Switch_1(config)#exit
Switch_1#vlan database – заходим в режим создания нужных vlan-ов;
Switch_1(vlan)#vlan 2 name Managers
Switch_1(vlan)#vlan 3 name Office
Switch_1(vlan)#exit
Switch_1#conf t
Switch_1(config)#int fa 1/0
Switch_1(config-if)#switchport mode access – определяем нужные порты в нужные vlan;
Switch_1(config-if)#switchport access vlan 2
Switch_1(config-if)#exit
Switch_1(config)#int fa 1/1
Switch_1(config-if)#switchport mode access
Switch_1(config-if)#switchport access vlan 3
Switch_1(config-if)#exit
Switch_1(config)#int fa 1/15
Switch_1(config-if)#switchport mode trunk – создаем trunk интерфейс в сторону роутера;
Switch_1(config-if)#switchport trunk encapsulation dot1q – назначаем ему инкапсуляцию;
Switch_1(config-if)#switchport trunk allowed vlan 1-2,3,1002-1005 –определяем, какие vlan-ы будут пропускаться в trunk (по желанию);
Switch_1(config-if)#exit
Switch_1(config)#exit
Switch_1#wr
Switch_1#

Switch_2:

R5>en
R5#conf t
R5(config)#hostname Switch_2
R5(config)#exit
Switch_2#vlan database
Switch_2(vlan)#vlan 2 name Remote
Switch_2(vlan)#exit
Switch_2#conf t
Switch_2(config)#int fa 1/0
Switch_2(config-if)#switchport mode access
Switch_2(config-if)#switchport access vlan 2
Switch_2(config-if)#exit
Switch_2(config)#int fa 1/15
Switch_2(config-if)#switchport mode trunk
Switch_2(config-if)#switchport trunk encapsulation dot1q
Switch_2(config-if)#switchport trunk allowed vlan 1-2,1002-1005
Switch_2(config-if)#exit
Switch_2(config)#exit
Switch_2#wr
Switch_2#

Теперь перейдем к роутерам. Начнем с Center_Router:

R1>en
R1#conf t
R1(config)#hostname Center_Router
Center_Router(config)#int loopback 0 – создаем loopback интерфейс;
Center_Router(config-if)#ip address 10.10.10.10 255.255.255.255 –задаем ему IP-адрес;
Center_Router(config-if)#exit
Center_Router(config)#int fa 0/0
Center_Router(config-if)#no shutdown
Center_Router(config-if)#exit
Center_Router(config)#int fa 0/0.2 – создаем sub-интерфейсы для ранее созданных vlan-ов и назначаем им соответствующие IP-адреса;
Center_Router(config-subif)#encapsulation dot1Q 2
Center_Router(config-subif)#ip address 192.168.1.1 255.255.255.0
Center_Router(config-subif)#ip nat inside – указываем, что данный интерфейс будет использоваться для NAT;
Center_Router(config-subif)#exit
Center_Router(config)#int fa 0/0.3
Center_Router(config-subif)#encapsulation dot1Q 3
Center_Router(config-subif)#ip address 192.168.2.1 255.255.255.0
Center_Router(config-subif)#ip nat inside
Center_Router(config-subif)#exit
Center_Router(config)#int fa 1/0
Center_Router(config-if)#ip address 1.1.1.1 255.255.255.252 – назначаем IP-адрес на интерфейсе, смотрящем в сторону интернета;
Center_Router(config-if)#no shutdown
Center_Router(config-if)#ip nat outside – определяем его как выходной интерфейс для NAT;
Center_Router(config-if)#exit
Center_Router(config)#int tunnel 0 – создаем интерфейс для GRE туннеля;
Center_Router(config-if)#ip address 172.16.1.1 255.255.255.0 –назначаем ему IP-адрес;
Center_Router(config-if)#tunnel source fa 1/0 – определяем «начало» GRE туннеля;
Center_Router(config-if)#tunnel destination 2.2.2.1 – определяем «конец» GRE туннеля;
Center_Router(config-if)#exit
Center_Router(config)#ip access-list extended For_NAT – создаем список доступа и определяем какие сети попадают под NAT;
Center_Router(config-ext-nacl)#permit ip 192.168.1.0 0.0.0.255 any
Center_Router(config-ext-nacl)#permit ip 192.168.2.0 0.0.0.255 any
Center_Router(config-ext-nacl)#exit
Center_Router(config)#ip nat inside source list For_NAT interface fa 1/0 overload – включаем NAT на роутере;
Center_Router(config)#ip route 0.0.0.0 0.0.0.0 1.1.1.2 – прописываем маршрут по умолчанию;
Center_Router(config)#ip route 192.168.3.0 255.255.255.0 tunnel 0 –прописываем маршрут в удаленную сеть через туннель GRE;
Center_Router(config)#exit
Center_Router#wr

Пока хватит. Перейдем на Internet_Router. На нем у нас будет совсем мало конфигурации:

R2>en
R2#conf t
R2(config)#hostname Internet_Router
Internet_Router(config)#int fa 0/0
Internet_Router(config-if)#ip address 1.1.1.2 255.255.255.252
Internet_Router(config-if)#no sh
Internet_Router(config-if)#exit
Internet_Router(config)#int fa 1/0
Internet_Router(config-if)#ip address 2.2.2.2 255.255.255.252
Internet_Router(config-if)#no sh
Internet_Router(config-if)#exit
Internet_Router(config)#exit
Internet_Router#wr
Internet_Router#

Теперь перейдем к Remote_Router:

R3>en
R3#conf t
R3(config)#hostname Remote_Router
Remote_Router(config)#int loopback 0
Remote_Router(config-if)#ip address 20.20.20.20 255.255.255.255
Remote_Router(config-if)#exit
Remote_Router(config)#int fa 0/0
Remote_Router(config-if)#no shutdown
Remote_Router(config-if)#exit
Remote_Router(config)#int fa 0/0.2
Remote_Router(config-subif)#encapsulation dot1Q 2
Remote_Router(config-subif)#ip address 192.168.3.1 255.255.255.0
Remote_Router(config-subif)#ip nat inside
Remote_Router(config-subif)#exit
Remote_Router(config)#int fa 1/0
Remote_Router(config-if)#ip address 2.2.2.1 255.255.255.252
Remote_Router(config-if)#no sh
Remote_Router(config-if)#ip nat outside
Remote_Router(config-if)#exit
Remote_Router(config)#int tunnel 0
Remote_Router(config-if)#ip address 172.16.1.2 255.255.255.0
Remote_Router(config-if)#tunnel source fa 1/0
Remote_Router(config-if)#tunnel destination 1.1.1.1
Remote_Router(config-if)#exit
Remote_Router(config)#ip access-list extended For_NAT
Remote_Router(config-ext-nacl)#permit ip 192.168.3.0 0.0.0.255 any
Remote_Router(config-ext-nacl)#exit
Remote_Router(config)#ip nat inside source list For_NAT interface fa 1/0 overload
Remote_Router(config)#ip route 0.0.0.0 0.0.0.0 2.2.2.2
Remote_Router(config)#ip route 192.168.1.0 255.255.255.0 tunnel 0
Remote_Router(config)#ip route 192.168.2.0 255.255.255.0 tunnel 0
Remote_Router(config)#exit
Remote_Router#wr
Remote_Router#

Остановимся и проверим, что у нас имеется на данный момент. Сделаем команду ping с Host_A на Host_B и Host_C:

    где:
  • 1 – Host_B из соседнего vlan «Office»;
  • 2 – Host_C из удаленного vlan «Remote»;
  • 3 – IP-адрес Internet_Router-а, смотрящий в сторону удаленного офиса.
Как видно на рисунке, сетевая доступность присутствует. Inter-vlan routing работает (1), туннель функционирует нормально (2) (если вы выключите интерфейс tunnel 0, то пинги проходить не будут), выход в интернет тоже есть (3).
Теперь приступим к настройке VoIP. Заходим на роутер Center_Router и добавляем следующую конфигурацию:

Center_Router>en
Center_Router#conf t
Center_Router(config)#telephony-service – заходим в режим настройки телефонных сервисов;
Center_Router(config-telephony)#max-ephones 10 – назначаем максимальное количество IP-телефонов, которое нам потребуется в нашей «телефонной» сети;
Center_Router(config-telephony)#max-dn 10 – назначаем максимальное количество «телефонных» линий;
Center_Router(config-telephony)#keepalive 15 – назначаем время, в течение которого CME будет ждать ответа от IP-телефона в случае обрыва связи, после которого он начнет попытку перерегистрации;
Center_Router(config-telephony)#system message VoIP from Cisco – задаем системное сообщение, которое будет отображаться на IP-телефоне (Cisco IP Communicator-е);
Center_Router(config-telephony)#ip source-address 10.10.10.10 port 2000 – задаем IP-адрес и порт (port 2000 – порт по умолчанию), на который будут обращаться IP-телефоны для регистрации;
Center_Router(config-telephony)#create cnf-files – указываем роутеру создавать файл конфигурации в формате XML, который затем будет скачан IP-телефонами;
Center_Router(config-telephony)#exit
Center_Router(config)#voice service voip – заходим в режим конфигурации голосового сервиса для задания инкапсуляции Voice over IP;
Center_Router(conf-voi-serv)#allow-connections h323 to h323 – включаем звонки между соответствующими типами конечных точек;
Center_Router(conf-voi-serv)#allow-connections h323 to sip
Center_Router(conf-voi-serv)#allow-connections sip to sip
Center_Router(conf-voi-serv)#allow-connections sip to h323
Center_Router(conf-voi-serv)#sip – заходим в режим конфигурирования SIP;
Center_Router(conf-serv-sip)#registrar server expires max 600 min 60 –устанавливаем минимальное время до перерегистрации IP-телефонов. Это надо для того, чтобы после перезагрузки CME, он сам автоматически перерегистрировал IP-телефоны, так как при перезагрузке, CME не сохраняет базу зарегистрированных IP-телефонов;
Center_Router(conf-serv-sip)#exit
Center_Router(config)#voice class codec 1 – создадим список поддерживаемых кодеков;
Center_Router(config-class)#codec preference 1 g711ulaw – указываем, в каком порядке какой кодек применять;
Center_Router(config-class)#codec preference 2 g711alaw
Center_Router(config-class)#codec preference 3 g729r8
Center_Router(config-class)#exit
Center_Router(config)#ephone-dn 1 – создаем первую логическую «телефонную» линию (directory number). Каждому телефону можно определить несколько таких логический линий со своими номерами;
Center_Router(config-ephone-dn)#number 1001 – задаем номер, который будет соответствовать этой линии;
Center_Router(config-ephone-dn)#name Host_A – задаем имя, которое будет отображаться при звонке на IP-телефоне;
Center_Router(config-ephone-dn)#exit
Center_Router(config)#ephone-dn 2
Center_Router(config-ephone-dn)#name Host_A
Center_Router(config-ephone-dn)#number 2001
Center_Router(config-ephone-dn)#name Host_B
Center_Router(config-ephone-dn)#exit
Center_Router(config)#ephone 1 – создаем первый IP-телефон;
Center_Router(config-ephone)#mac-address 0800.279D.D0F4 – задаем ему mac-address. Он будет использоваться в качестве уникального имени IP-телефона. Взять его можно из установок вашей сетевой карты на компьютере;
Center_Router(config-ephone)#type cipc – указываем тип IP-телефона. В нашем случае – это Cisco IP Communicator;
Center_Router(config-ephone)#button 1:1 – указываем IP-телефону, что первая клавиша на нем, будет соответствовать первой логической линии (directory number);
Center_Router(config-ephone)#exit
Center_Router(config)#ephone 2
Center_Router(config-ephone)#mac-address 0800.277E.9718
Center_Router(config-ephone)#type cipc
Center_Router(config-ephone)#button 1:2
Center_Router(config-ephone)#exit
Center_Router(config)#dial-peer voice 1 voip – для создания связи с удаленным офисом нам необходимо настроить соседство между CME. Заходим в соответствующий режим;
Center_Router(config-dial-peer)#destination-pattern 30.. – указываем, что если кто то набирает номер, начинающийся на «30», то отправлять его на соседний CME;
Center_Router(config-dial-peer)#session target ipv4:20.20.20.20 –прописываем, что телефонная сессия должна быть установлена через IP сеть и адрес удаленного CME 20.20.20.20;
Center_Router(config-dial-peer)#voice-class codec 1 – указываем, какие кодеки могут быть использованы для данной связи;
Center_Router(config-dial-peer)#exit
Center_Router(config)#ip route 20.20.20.20 255.255.255.255 tunnel 0 -прописываем дополнительный маршрут к loopback-интерфейсу соседнего CME через интерфейс Tunnel 0. Таким образом, мы заворачиваем телефонный трафик в GRE туннель;
Center_Router(config)#exit
Center_Router#wr

Переходим на Remote_Router и делаем следующие настройки:

Remote_Router>en
Remote_Router#conf t
Remote_Router(config)#telephony-service
Remote_Router(config-telephony)#max-ephones 10
Remote_Router(config-telephony)#max-dn 10
Remote_Router(config-telephony)#keepalive 15
Remote_Router(config-telephony)#system message VoIP from Cisco
Remote_Router(config-telephony)#ip source-address 20.20.20.20 port 2000
Remote_Router(config-telephony)#create cnf-files
Remote_Router(config-telephony)#exit
Remote_Router(config)#voice service voip
Remote_Router(conf-voi-serv)#allow-connections h323 to h323
Remote_Router(conf-voi-serv)#allow-connections h323 to sip
Remote_Router(conf-voi-serv)#allow-connections sip to sip
Remote_Router(conf-voi-serv)#allow-connections sip to h323
Remote_Router(conf-voi-serv)#sip
Remote_Router(conf-serv-sip)#registrar server expires max 600 min 60
Remote_Router(conf-serv-sip)#exit
Remote_Router(conf-voi-serv)#voice class codec 1
Remote_Router(config-class)#codec preference 1 g711ulaw
Remote_Router(config-class)#codec preference 2 g711alaw
Remote_Router(config-class)#codec preference 3 g729r8
Remote_Router(config-class)#exit
Remote_Router(config)#ephone-dn 1 dual-line – в отличие от прошлой конфигурации, этой командой мы указываем, что у нас будет двойная линия;
Remote_Router(config-ephone-dn)#number 3001
Remote_Router(config-ephone-dn)#name Host_C
Remote_Router(config-ephone-dn)#exit
Remote_Router(config)#ephone 1
Remote_Router(config-ephone)#mac-address 0800.279E.735C
Remote_Router(config-ephone)#type cipc
Remote_Router(config-ephone)#button 1:1
Remote_Router(config-ephone)#exit
Remote_Router(config)#dial-peer voice 1 voip
Remote_Router(config-dial-peer)#destination-pattern .... – так как локальных «телефонных» номеров у нас на удаленном офисе нет, то указываем отправлять все звонки на соседний CME;
Remote_Router(config-dial-peer)#session target ipv4:10.10.10.10
Remote_Router(config-dial-peer)#voice-class codec 1
Remote_Router(config-dial-peer)#exit
Remote_Router(config)#ip route 10.10.10.10 255.255.255.255 tunnel 0
Remote_Router(config)#exit
Remote_Router#wr
Remote_Router#

Настало время установить Cisco IP Communicator на компьютеры пользователей. Заходим на Host_A. Находим папку со скачанным ПО и запускаем файл *.exe. Появится следующее окно:


Нажимаем «Next»:


Соглашаемся с лицензией и нажимаем «Next»:


Здесь предлагают выбрать папку для установки программы. Выбираете нужное место и нажимаете «Next» (я оставил по умолчанию):


Предварительные параметры установки определены. Нажимаем «Install» и начнется процесс установки. По его окончании появится следующее финишное окно:


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


Нажимаем «Yes». После перезагрузки запускаем программу двойным щелчком по ярлыку. Откроется окно первоначальной настройки Cisco IP Communicator «Audio Tuning Wizard»:


Нажимаем «Next»:


Из выпадающих меню выбираем имеющиеся аудио устройства. Затем нажимаем «Next»:


Задаем уровень громкости наушников (колонок). Сначала нажимаем «Play», выставляем нужный уровень и нажимаем «Next»:


Здесь настраиваем параметры микрофона. Сначала нажимаем «Test», устанавливаем нужный уровень и затем нажимаем «Next»:


После настроек нажимаем «Finish». Теперь Cisco IP Communicator попытается зарегистрироваться на CME (наш роутер) и получить нужную конфигурацию, но у него ничего не получится (появится сообщение вида «Unable to reach to TFTP server»). Нажмите «OK» и вы попадете на страницу настройки параметров сети ( или, если программа загрузилась, то нажмите по ней правой клавишей мыши и выберите Preferences -- Network):

    где:
  • 1 – имя устройства (оно совпадает с mac-адресом компьютера);
  • 2 – задаем IP-адрес CME (Call Manager Express).
Как только вы это сделаете и нажмете на кнопку «OK», то у вас появится стандартный вид Cisco IP Communicator:


Ничего такой телефончик :). Видим, что кнопке №1 соответствует первая линия с номером 1001 (2). Присутствует также надпись (3), которую мы задавали при настройке роутера (CME) выше. Для дальнейших тестов я буду использовать компактный режим отображения Cisco IP Communicator. Переключиться в него можно через клавишу (1) на рисунке.
Тот факт, что телефон зарегистрировался на CME можно проследить и по системным сообщениям в консоли роутера. Посмотрим на Center_Router:

    где:
  • 1 – имя Cisco IP Communicator (совпадает с mac-адресом);
  • 2 – IP-адрес зарегистрированного Cisco IP Communicator.
Ну что, все вроде настроили. Теперь перейдем к проверкам. Для начала, позвоним с Host_A на Host_B. Выбираем пункт «NewCall» и набираем номер:


Звонок проходит, снимаем трубку и можно общаться :).
Теперь позвоним с Host_C на Host_A. После установки соединения с Host_A, ставим звонок на удержание и нажимаем на «NewCall» снова и набираем номер Host_B. Таким образом, мы проверим работу двойной линии, настроенной для Host_C:


Все работает!!! Видим, что первый звонок находится в режиме ожидания (1), второй в активном режиме. Точно так же можно проверить и в обратном порядке (позвонить на Host_C сначала с Host_A, затем с Host_B) и тоже все будет работать.
Теперь давайте отловим пакеты на Internet_Router и посмотрим на их содержимое (я буду ловить их на fa 0/0, смотрящем в сторону Center_Router, и инициировать звонок с Host_A на Host_C). Отловим, для примера, один системный пакет (первый по счету рисунок) и пакет, после установления телефонной сессии (второй по счету рисунок):

    где:
  • 1 – системный пакет установления логического канала для звонка;
  • 2 – навешивание параметров GRE – туннеля на первоначальный пакет;
  • 3 – «начальный» IP-адрес GRE – туннеля;
  • 4 – «конечный» IP-адрес GRE – туннеля;
  • 5 – имя хоста, с которого инициируется звонок;
  • 6 – локальный номер;
  • 7 – номер, на который устанавливается соединение.
    где:
  • 1 – используемый на данный момент кодек G.711.

Да, из рисунков видно, что на первоначальный пакет навешивается много дополнительных заголовков и так далее. Хочу отметить, что для нормального функционирования телефонной связи, при планировании ее использования, следует учитывать все эти заголовки. Так как они существенно увеличивают длину пакета и, если у вас небольшой канал, то существенно влияют на качество связи. Поэтому, всегда рядом с VoIP стоит и QoS, чтобы обеспечить требуемую полосу пропускания для телефонного трафика, но это уже мотивы для будущих постов :).
Ну что же, на этой радостной ноте я хочу закончить этот пост. Как всегда надеюсь, что он был вам интересен и познавателен. Хочу поблагодарить вас за внимание.

Источник: go-to-easyit.com/2012/05/voip-cisco.html

Комментариев нет:

Отправить комментарий