понедельник, 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 - ограничения самого ядра эмуляции - динамипса.

воскресенье, 11 мая 2008 г.

Перенаправление диапазона tcp и udp портов на Cisco IOS.

Опробовано на Cisco ISR серий 800, 1800, 2800, 3800. Cкорее всего
будет работать также на других маршрутизаторах.

ip nat pool superpool 192.168.1.2 192.168.1.2 netmask 255.255.255.0 type rotary
ip nat inside destination list 101 pool superpool
access-list 101 permit udp any any range 1000 2000

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

Поднимаем ADSL с двумя pvc на Cisco 877.

Cisco 877 (и семейство 870 вообще) представляет собой маршрутизатор класса SMB (СБМ - средний и малый бизнес). Его позиционируют как устройство для удалённых пользователей, позволяющее создать VPN с центральным офисом чтобы работник мог работать дома. Однако его возможностей может хватить даже для создания небольшого VPN-концентратора, довольно функционального и стабильного маршрутизатора.
В моём случае получился относительно сложный случай: один местный провайдер (ЮТК Ростовэлектросвязь) предоставляет доступ и в Интернет, и к своей локальной сети серез ADSL. Организована связь довольно просто, однако для неподготовленного инженера задача окажется нетривиальной:
Организуются два канала pvc: один для доступа в Интернет, другой - сеть провайдера.
  • PVC0 (Интернет) работает в режиме PPPoE.
  • PVC1 (локальная сеть провайдера) - в режиме моста (RFC1483/2684 bridged). Может возникнуть вопрос почему, но это действительно необходимо. Левые пакеты можно зарезать акцесс-листами.
Основные моменты конфигурирования - настройка WAN-интерфейса и объединение двух интерфейсов в мост.
Так как у нас 2 PVC, то WAN-интерфейс (назвается он ATM1) необходимо поделить на два сабинтерфейса.
interface ATM0
no ip address
no atm ilmi-keepalive
dsl operating-mode auto
!
interface ATM0.1
point-to-point
pvc inet 0/1
pppoe-client dial-pool-number 1
!
!
interface ATM0.2
point-to-point
pvc zona 0/2
encapsulation aal5snap
!
bridge-group 2
!
Так как на pvc0 необходимо поднять PPPoE-клиент, поднимается логический интерфейс Dialer.
interface Dialer1
ip address negotiated
ip mtu 1492
ip nat outside
ip virtual-reassembly
encapsulation ppp
dialer pool 1
no cdp enable
ppp pap sent-username user password 7 pass
!
В локалку смотрит VLAN
interface Vlan1
no ip address
bridge-group 2
!
Для возможности объединения нескольких интерфейсов в мост необходимо поднять ещё один виртуальный интерфейс - BVI.
interface BVI2
ip address 192.168.1.1 255.255.255.0
ip nat inside
!