понедельник, 29 сентября 2008 г.

Подружим Cisco IP Phone и Asterisk

Самый попурярный канал Asterisk, используемый в качестве канала подключения для клиентов это, конечно, SIP. Существует масса недорогих программных и аппаратных SIP-телефонов, легко интегрируемых в Asterisk. Но что делать, если нам в наследство (или в подарок!) достался один из замечательных VoIP-телефонов производства Cisco Systems, который в большинстве своём работают по собственному протоколу SCCP?


У меня так в руках оказался Cisco 7902, но без CallManager-а. Вот и решил проверить работоспособность аппарата с помощью Asterisk.

В Asterisk изначально есть канал skinny, однако рекомендуется всё-таки использовать более совершенный chan-sccp-b. Сообщается, что поддерживаются также устройства:

  • 12 — Cisco IP Phone 12SP+
  • 30 — Cisco IP Phone 30VIP
  • 7902 — Cisco IP Phone 7902G
  • 7905 — Cisco IP Phone 7905G - Fully supported
  • 7910 — Cisco IP Phone 7910
  • 7912 — Cisco IP Phone 7912G
  • 7920 — Cisco IP Wireless Phone 7920 - All basic features
  • 7935 — Cisco IP Conference Station 7935
  • 7936 — Cisco IP Conference Station 7936 - Fully supported
  • 7940 — Cisco IP Phone 7940 - Fully supported
  • 7941 — Cisco IP Phone 7941 - Initial Support
  • 7960 — Cisco IP Phone 7960 - Fully supported
  • 7961 — Cisco IP Phone 7961 - Initial Support / Reported to work
  • 7970 — Cisco IP Phone 7970 - Fully supported
  • 7971 — Cisco IP Phone 7971 - Fully supported
  • 7961GE
  • 7941GE
  • 7911
  • 7980 — Cisco IP Communicator
  • 7985
  • 7914 — Cisco IP Phone 7960 with 1 or 2 7914 addons
  • ata — Cisco ATA
  • KIRK — Kirk is a wireless phone that uses sccp

Его и поставим.
Сходим на страницу проекта, скачаем последнюю версию (в моём случае это chan_sccp_20071213.tar.gz).
# wget "http://downloads.sourceforge.net/chan-sccp-b/chan_sccp_20071213.tar.gz?modtime=1197572506&big_mirror=0"
# tar xf chan_sccp_20071213.tar.gz


Соберём модуль:

# cd chan_sccp_20071213/
# make
sh ./create_config.sh "/usr/include"
Creating config file
====================
Checking Asterisk version...
* found asterisk 1.4
Build PARK functions (y/n)[n]?y
Build PICKUP functions (y/n)[n]?y
Use realtime functionality (y/n)[n]?y
* found 'struct ast_channel_tech'
* found 'ast_bridged_channel'
* found 'struct ast_callerid'

<...>
Now compiling .... sccp_softkeys.c 558 lines
Now compiling .... sccp_socket.c 394 lines
Now compiling .... sccp_indicate.c 329 lines
Linking chan_sccp.so

Последняя строка говорит нам о том, что модуль собрался и готов к использованию. а нам это и надо, устанавливаем его простым копированием (туда, где модули Астериска, у меня в примере - по умолчанию).

cp chan_sccp.so /usr/lib/asterisk/modules/

Установили, теперь нужно убедить Asterisk в использовании его вместо стандартного. Для этого в /etc/asterisk/modules.conf пишем:

noload => chan_skinny.so
load => chan_sccp.so
Теперь необходимо создать конфиг модуля по образу и подобию со страницы описания. Добпвляем телефоны (аппараты - по MAC-адресу) и линии (номера - по екстеншену). В extensions.conf корректируем диалплан чтобы приходили входящие вызовы.

Ну и осталось дело за малым. Но немаловажным! TFTP-сервер.
У меня дистрибутив Gentoo, поэтому установка свелась к следующему:
# emerge net-ftp/tftp-hpa
# mkdir /tftproot
# /etc/init.d/in.tftpd start
# rc-update add in.tftpd default

В /tftproot должен находиться хотя бы XmlDefault.cnf.xml содержанием:

<callManager>
<ports>
<ethernetPhonePort>2000</ethernetPhonePort>
</ports>
<processNodeName>IP Астериска</processNodeName>
</callManager>
</member>
</members>
</callManagerGroup>
</Default>

Также для каждого аппарата можно положить свой конфиг с именем типа SEP.cnf.xml. Необходимость - только если особое время/язык прошивки. Пример тут.

MAC-адрес написан на каждом телефоне на обратной стороне. Cisco IP Communicator использует MAC используемой сетевой карты.

среда, 24 сентября 2008 г.

Ad-hoc сеть средствами Windows

Многие частенько задумываются, как быстро связать два устройства на базе Windows (типичный пример - два ноутбука) по Wi-Fi. Бывает, что сходу и не вспомнишь/не угадаешь в галочках в настройках и свойствах.
Делаю шпаргалку..

Итак.. Вся разница только в том, что Ad-hoc в отличие от инфраструктуры - не клиент-серверная архитектура (клиент-сервер, конечно, немного не из этой оперы, однако суть та же). Это точка-точка. Соответственно нужно настроить на обоих концах wifi-адаптеры и должно заработать. Microsoft нас обрадовала тем, что можно сделать ad-hoc соединение проще, а именно:
- настроить на одном устройстве подключение;
- найти его другим устройством (если конечно включено вещание SSID);
- вбить необходимые настройка на втором адаптере.
То есть та же схема, что и при работе с точками доступа.

Сейчас настроим первое устройство. Для этого по большому счёту нужно просто добавить беспроводную сеть на первом устройстве, указать, что это точка-точка. Адаптер заработает сразу.

Для этого перейдём в сетевые подключения (обычно Пуск-Настройка-Сетевые подключения).


Там на беспроводном подключении - правой кнопкой - в контекстное меню Свойства.
В появившемся окне перейдём на вкладку Беспроводные сети.


Нужно Добавить новую сеть.


Появляется окно для настройки новой беспроводной сети, где нам следует придумать имя для сети (SSID - идентификатор), не забыть поставить галочку "это прямое подключение компьютер-компьютер", и выбрать ключ шифрования. Рекомендую использовать WPA.. Так, на всякий случай. Там только один нюанс - ключ может быть 5 или 13 символов.


Жмём ОК.
После этого наша сеть появится в беспроводных соединениях.


Потом на другом устройстве ищем эту сеть в беспроводном окружении (если не выключено вещание SSID). И подключаемся как к обычной точке доступа. Или повторяем процедуру, непосредственно вбив настройки, повторяя все пункты точно так же, подключение установится само.

Небольшое замечание - Wi-Fi устанавливает соединение 1 и 2го уровня, IP-адреса следует настроить вручную, чтобы увидеть другое устройство в сети ping-ом (и остальными программами).

понедельник, 25 августа 2008 г.

Asterisk - бесплатное VoIP-ядро для IP-телефонии

Есть прекрасные сайты, работающие по принципу википедии, например http://voip-info.org, рассказывающие о том, что такое Asterisk и с чем его есть. Я хочу остановиться на паре подводных камней которые ждут тех, кто хочет поставить Asterisk впервые.

Итак, что мы имеем? Компьютер под управлением GNU/Linux, желание обзавестись своим мощным, да и ещё бесплатным софтсвичом, некривые руки и немного терпения.

Что нужно ещё? Ах да, немного знаний и инструментов. Инструменты будут простыми - исходные тексты Астериска с http://www.asterisk.org, пара библиотек (об этом подробнее ниже) и консолька нашего сервера.

Но сначала пару слов теории в качестве лирического отступления.

Asterisk является модульной системой, причём эта модульность во многом определяет его функциональность и работоспособность. Как и такие же модульные программы (MirandaIM, Foobar2000, Far...), при добавлении/удалении модулей с соответствующей настройкой, можно добиться совершенства. Своего совершенства, конечно.

Он поддерживает работу с различными протоколами VoIP, как широко распространёнными (H.323, SIP), так и менее используемые и специфические (собственные: IAX, IAX2; проприетарные, как SCCP (Cisco Skinny Client Control Protocol); ТФОП-основанные: Zap, VPB; специфические: MGCP, Agent, Local). В мире Asterisk соединения по какому-либо из протоколов называется каналом. Существует (я это особо подчеркну) коммутация вызовов из одного канала в другой, при этом конвертируя звуковой поток из одного кодека в другой. При переводе звонка (или объединения в конференции) можно без проблем подключить третий канал/кодек и так далее.

Таким образом, наши возможности кажутся безграничными. Главным в этой ситуации я скажу необходимость ответить для себя - что конкретно планируется. Это поможет избежать дополнительных настроек и вообще выполнять много лишней работы.

Астериск немного своеобразный продукт и многое что связано с его происхождением дало отпечаток на дальнейшую судьбу. Проект создавался и ведётся под крылом коммерческой компании Digium. Digium живёт за счёт разработки оборудования в качестве аппаратной платформы для Asterisk, в частности плат PSTN для возможности "приземлять" звонки из IP или наоборот, перенаправлять вызовы с обычных телефонов на VoIP. Однако из-за этого проект Asterisk распространяется по двойной лицензии, так что в нём могут присутствовать закрытые модули. Самый яркий пример - патентованный кодек G.729.


Итак, самый первый подводный камень - использование стандартного менеждера пакетов для установки Asterisk. Получаем версию двухлетней (а в gentoo на состояние 2008 года и того более) версию. С теми ещё косяками. Даже если и версия будет новая, все настройки будут по умолчанию, со всеми ненужными модулями. А самое страшное - с отсутствием нужных. Выход - скачать исходники (цылка), либо изменить дерево пакетов/портов для поддержки актуальной версии asterisk.

Так что качаем исходники, распаковываем.. Перед make есть возможность сделать одну нужную вещь, а именно: make menuitems. Обязательно заходим в менюшку, шаримся по пунктам. Смело удаляем ненужное (мы же уже почитали хоть немного http://voip-info.org и представляем в общих чертах, что нам нужно). Переходим к make.

Сделали ./configure, make, make install и, как нам посоветовали, make samples. В итоге посмотрели в /etc/asterisk и от изобилия новых конфигов плюнули на всю IP-телефонию и решили, что разбираться со всем этим проще всего будет как нибудь в другой раз.

Мой совет: стоит новые конфиги перенести в другое место, обратно вернуть только основное по одному, жестоко удаляя после копирования всё-всё лишнее (ибо будет мешать восприятию). У меня для начала было это:
asterisk.conf
extensions.conf
modules.conf
cdr.conf
sip.conf
h323.conf
[добавить]

Забыли про поддержку H.323! Ведь он частенько необходим. Оказалось, что в исходниках есть отличное README (channels/h323/README). Оно говорит о том, что перед процессом сборки Астериска нужно заюзать дополнительные библиотеки: PwLib и OpenH323. Причём только определённых версий, ибо можем получить кучу проблем на голову в виде ошибок компиляции. Там же расписан правильный порядок сборки Asterisk если необходимо использовать H323.

cd /path/to/pwlib./configure
make clean opt
cd /path/to/openh323
./configuremake clean opt
cd /path/to/asterisk/channels/h323
make opt
cd /path/to/asterisk
make install


Вот собственно самые основные грабли при установке Asterisk.

От себя добавлю что в идеале сделать пользователя, скажем asterisk и от него выполнять сборку, чтобы впоследствие иметь изолированный сервис от непривилегированного пользователя. А если выделить ему отдельную папку, например /asterisk, то будет удобно удалять/добавлять руками нужные модули (при небоходимости, конечно), и писать дополнительные приложения самостоятельно для интеграции с чем-либо.. но это уже совсем другая история.

четверг, 29 мая 2008 г.

Разделяем поток на два канала для squid

Мы все хотим экономить. В том числе и на Интернет-трафике. Типичная ситуация: организация из 30+ человек и 1 скоростной (и, соответственно, помегабайтный) канал в Интернет, отсутствие безлимитного подключения (потому что скорость его не позволит нормально работать никому). Итог: большие расходы на интернет-трафик.
Конечно, самый простой выход - считать трафик и выделять каждому пользователю по потребности. Иногда от этого страдает больше всего системный администратор. А он тут не при чем.
Итак, для решения проблемы решено подключить второй безлимитный канал на небольшой скорости. И отправить туда весь несущественный, но составляющий большую часть, трафик: картинки, видео, флешки и т.д.

Нам необходимо: сервер я двумя интерфейсами (у меня для лабы eth0 и tun1), работающий squid, фаервол iptables и пакет route2.
Пусть на eth0 (скоростной канал) IP 192.168.0.2/255.255.255.0 шлюз 192.168.0.1
tun1 (медленный) 172.16.1.2/255.255.255.252 шлюз 172.16.1.1 тип P-t-P

eth0 был настроен и работает, добавляем настройки для tun1
Прежде всего необходимо создать второй равнозначный маршрут по уполчанию. Для этого нужно создать вторую таблицу маршрутизации (потом нужный трафик мы перекинем в неё).
ip route flush table 2
ip route show table main \
>| grep -Ev ^default \
>| while read ROUTE ; \
> do ip route add table 2 $ROUTE; \
> done
ip route add default via 172.16.1.2 table 2

(или dev tun1, так как канал P-t-P)

Теперь перехватываем исходящие с IP 172.16.1.2 пакеты и:
- средствами iptables маркируем его:
iptables -t mangle -A OUTPUT -s 172.16.1.0/30 -j MARK --set-mark 2
- средствами route2 отправляем в таблицу 2
ip rule add fwmark 2 table 2
С помощью tcpdump можно посмотреть результат.

Средствами squid можно только назначить исходящий адрес, поэтому такие ухищрения. Вот кусок /etc/squid/squid.conf:

acl SLOW_DOWN urlpath_regex -i \.exe$
acl SLOW_DOWN urlpath_regex -i \.avi$
acl SLOW_DOWN urlpath_regex -i \.mp3$
acl SLOW_DOWN urlpath_regex -i \.jpg$
acl SLOW_DOWN urlpath_regex -i \.gif$
acl SLOW_DOWN urlpath_regex -i \.swf$
acl SLOW_DOWN urlpath_regex -i \.png$

tcp_outgoing_address 172.16.1.1 SLOW_DOWN
tcp_outgoing_address 192.168.0.2


Способ кривой, так как дифференцирует только на основании строки запроса. То есть txt или doc файл размером 700 мегабайт проскочит в быстрый канал. address.com/file - туда же вне зависимости от типа. Но address.com/fille.without.swf - в медленный.

четверг, 15 мая 2008 г.

Поднимаем tap0 и br0 при загрузке

Собственно, можно и скриптик сделать чтобы поднять tap0 и общединить его в мост с eth0. Однако я планирую частенько использовать gns3 в целях обучения, причём нужны связи с реальной сетью..


Debian-образные могут почитать нечто вроде руководства в файлике /usr/share/doc/bridge-utils/README.Debian.gz. Однако суть сводится к редактированию /etc/network/interfaces ручками
У меня получилось примерно так:

~# cat /etc/network/interfaces
auto lo
iface lo inet loopback

iface eth0 inet manual
auto eth0

auto tap0
iface tap0 inet manual
up ifconfig $IFACE up

auto br0
iface br0 inet static
bridge_ports eth0 tap0
address 192.168.1.12
netmask 255.255.255.0
gateway 192.168.1.1


Ключевая фраза выделена. Без неё система будет тупо ругаться, что такого устройства не обнаружено.

вторник, 13 мая 2008 г.

Проблема с соединением dynamips (в gns3) с реальной сетью

Даже разработчики dynagen согласились, что из-за отличий в реализациях winpcap и libpcap, на некоторых сетевых картах происходят косяки: из сети виртуальную сеть видно, но с того же компа - нет. Причём только под линуксом. tcpdump показывает arp трафик, но сетевая на него не отвечает.
На тех же версиях dynamips и gns3 под виндой - всё нормально.
Такая проблема меня постигла на ноуте HP Compaq nc6120.

~# lspci grep net
02:0e.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5705M_2 Gigabit Ethernet (rev 03)


Пробовал Ubuntu 7.10, 8.04, openSUSE 10.3, Debian 4.0.
Решение нашлось (как и предполагалось) на форуме 7200emu.hacki.at. Предлагается создать виртуальный интерфейс tap0, объединить его с eth0 в мост и с этой конструкцией работать. Прежде всего
~# apt-get install bridge-utils
...
Распаковывается пакет bridge-utils (из файла .../bridge-utils_1.2-1build1_i386.deb)...
Настраивается пакет bridge-utils (1.2-1build1) ...

(или через Symantic, кому как больше нравится).

Необходимо не забыть убрать IP на eth0.
Далее запускаем GNS3 от рута (хоть и образовательная программа, однако для работы с реальной сетью без администраторских полномочий не справиться). Делаем простейшую лабу из облака и маршрутизатора. Заходим в настройки облака. Выбираем вкладку NIO TAP. В поле вбиваем tap0. Кнопаем "Добавить" и "ОК". Соединяем фастэзернетом рутер с облаком, запускаем лабу.

Дальше поднимаем интерфейс и создаём мост:
~# ifconfig tap0 up #(сам он почему-то не поднимается)
~# ifconfig tap0
tap0 Link encap:Ethernet HWaddr 00:FF:BF:D6:C0:2B
inet6 addr: fe80::2ff:bfff:fed6:c02b/64 Диапазон:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

~# brctl addbr br0
~# ifconfig br0 172.16.1.13 netmask 255.255.0.0
~# brctl addif br0 tap0
~# brctl addif br0 eth0
~# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.0014c2dc56b9 no tap0
eth0

Настраиваем роутер и вуаля!

Перегрузились, а моста уже нет? Читаем тут...

понедельник, 12 мая 2008 г.

GNS3 - графический симулятор сети cisco

Про dynamips и dynagen поговорим в следующий раз. Отличные программы для обучения. Стоило ожидать, что рано или поздно для будет создан GUI для эмулятора cisco. Таковым стал GNS3. Радует, что для развёртывания какой-либо лабы не нужно знать как устроен и работает dynamips.

Есть версии и под win, и под linux. Однако под линуксом работает чутка пошустрее.
Лабы можно формировать как внутри системы, так и выводить связи наружу. Таким образом, даже не обязательно иметь железки чтобы научиться чему-либо, сделать и показать хоть и виртуальную, но работающую сеть cisco.
Работа с GNS3 не сложна. После установки и первого запуска не нужно лезть за документацией и глубоко в неё вчитываться. Интерфейс интуитивно понятен. Интерфейс поддерживает русский язык, так что немцам и французам (или у кого любой другой отличный от английского второй язык) особенно будет приятно. Сложность понимания первого запуска только лишь в том, что для запуска тестовой виртуальной сети всё-таки необходимо кое-что дополнительное: образы ПО IOS -ибо программный комплекс эмулирует аппаратную часть, используя реальный образ ПО. Однако GNS3 уже содержит в себе dynamips и все необходимые интерфейсы для управления им. Так что дополнительно найти придётся только пару образов IOS.
На сегодняшний день эмулируются следующие платформы: 1700, 2600, 2691, 3600, 3700, 7200. Что для ознакомления обычно достаточно. Поддержка платформ 2800/3800 пока отсутствует, поэтому сэмулировать VoIP-сеть не получится. Будем надеяться, что проект dynamips будет продолжать развиваться, потому что эти ограничения GNS3 - ограничения самого ядра эмуляции - динамипса.