Новое руководство на эту тему расположено здесь: habr.com/ru/post/350460
В данной инструкции описано как с нуля установить и произвести первоначальную настройку компьютерной телефонии на базе «Asterisk» с подключением к услуге «iD Phone» компании «Казахтелеком».
Некоторые идеи я почерпнул из этой статьи: «Пошаговое руководство по привязке SIP-номера к Elastix (FreePBX, Asterisk) на примере провайдера Megaline iDPhone» (большое спасибо asdForever за это), но:
- во-первых, по указанной инструкции система у меня не заработала;
- во-вторых, не со всеми решениями в ней я согласен;
- в-третьих, мы будем настраивать не «Elastix», а «AsteriskNow»;
- в-четвертых, я постарался написать инструкцию максимально подробной — для людей мало разбирающихся в Linux-системах и в «Asterisk» (каковым я и сам являюсь).
Дано:
- Операционная система будет установлена с нуля. Использован будет дистрибутив «AsteriskNOW» — это операционная система «CentOS» с предустановленным программным обеспечением «Asterisk» и веб-интерфейсом для его управления «FreePBX». Другими словами в данной инструкции отсутствует блок, в котором была бы описана установка «Asterisk» на уже развернутой Linux-системе.
- «Казахтелеком» предоставляет услугу «iD Phone» не через Интернет, а подключая абонентов к своей специальной SIP-сети. Физически, конечно, это чаще всего один канал (ADSL или оптика) вместе с Интернет и/или «iD TV». Роутер же отдает предоставляемые услуги на разные порты. Считаем, что у нас уже есть настроенный роутер, который с одного порта отдает Интернет, а с другого — «iD Phone».
- Компьютер имеет две сетевых карты: одна из них смотрит в Интернет, другая — в SIP-сеть «Казахтелекома».
Задача:
Получить работающую IP-АТС, имеющую доступ в Интернет.
Решение:
Скачиваем «AsteriskNOW» отсюда: http://www.asterisk.org/downloads
Устанавливаем «AsteriskNOW»:
Скриншоты установки AsteriskNOW
Входим в систему под пользователем root и паролем, который задали при установке.
Для редактирования файлов я использую файловый менеджер «Midnight Commander». Для его установки необходимо дать следующую команду:
yum install mc
Эта команда сработает, если ваш компьютер уже получил доступ к Интернету. Это может не произойти по причинам описанным ниже. Тогда можно временно отключить сетевой кабель от интерфейса, который смотрит в SIP-сеть «Казахтелекома».
Соглашаемся на всё. Когда понадобиться отредактировать какой-нибудь файл, запускаем «Midnight Commander» командой:
mc
Добавим русский язык в операционную систему. Для этого сначала инсталлируем утилиту управления языковыми настройками:
yum install system-config-language
Устанавливаем русский язык. Для этого запускаем инсталлированную утилиту:
system-config-language
Скриншоты установки русского языка
Для того, чтобы изменения приняли силу, необходимо выйти из терминала и зайти в него снова. После этого, например, в «Midnight Commander» интерфейс станет на русском языке.
Проверяем, что работают оба сетевых интерфейса. Даем команду:
ifconfig
У меня такой вывод:
Вывод команды ifconfig по одному интерфейсу
eth0 Link encap:Ethernet HWaddr 00:15:5D:7B:4F:18
inet addr:192.168.0.52 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::215:5dff:fe7b:4f18/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5695 errors:0 dropped:0 overruns:0 frame:0
TX packets:3363 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:7623500 (7.2 MiB) TX bytes:241151 (235.4 KiB)
Interrupt:9 Base address:0xc000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 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:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Это обозначает, что активен только один интерфейс. Активируем второй интерфейс. Для этого необходимо отредактировать файл /etc/sysconfig/network-scripts/ifcfg-eth1. Значение параметра ONBOOT необходимо изменить с «no» на «yes».
Даем команду на перезапуск сетевых интерфейсов:
service network restart
Еще раз даем команду:
ifconfig
И получаем уже новый вывод:
Вывод команды ifconfig по двум интерфейсам
eth0 Link encap:Ethernet HWaddr 00:15:5D:7B:4F:18
inet addr:192.168.0.52 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::215:5dff:fe7b:4f18/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5981 errors:0 dropped:0 overruns:0 frame:0
TX packets:3503 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:7646872 (7.2 MiB) TX bytes:281444 (274.8 KiB)
Interrupt:9 Base address:0xc000
eth1 Link encap:Ethernet HWaddr 00:15:5D:7B:4F:19
inet addr:10.2.X.X Bcast:255.255.255.255 Mask:255.255.255.0
inet6 addr: fe80::215:5dff:fe7b:4f19/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2 errors:0 dropped:0 overruns:0 frame:0
TX packets:21 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:684 (684.0 b) TX bytes:4379 (4.2 KiB)
Interrupt:9 Base address:0xe000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 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:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Теперь видно, что активировались оба интерфейса. Разберемся, который из них куда смотрит.
eth0 получил адрес из подсети 192.168.0.X — это интерфейс, который смотрит в Интернет. Именно из этой подсети раздает адреса DHCP-сервер роутера.
eth1 получил адрес из подсети 10.X.X.X — это интерфейс, который смотрит в SIP-сеть «Казахтелекома». Именно из этой подсети раздает адреса DHCP-сервер «Казахтелекома».
А вот теперь мы приблизились к проблеме, которая мешает одновременному функционированию доступа к Интернету и к SIP-сети «Казахтелекома». Для лучшего понимания дадим команду:
route
Получаем вывод:
Вывод команды route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
10.2.X.0 * 255.255.255.0 U 0 0 0 eth1
link-local * 255.255.0.0 U 1002 0 0 eth0
link-local * 255.255.0.0 U 1003 0 0 eth1
default 10.2.X.1 0.0.0.0 UG 0 0 0 eth1
Какой вывод из этого можно сделать? На первый интерфейс у нас назначен шлюз по умолчанию 192.168.0.1 (IP-адрес роутера). Но вместе с получением IP-адреса на второй интерфейс от DHCP-сервера «Казахтелекома» приходит адрес шлюза, который перебивает установленный на первом интерфейсе. После этого весь Интернет-трафик начинает идти в SIP-сеть «Казахтелекома». Запомним адрес шлюза «Казахтелекома» — он нам может потребоваться дальше. В моем случае — 10.2.X.1.
Для устранения проблемы конфликта шлюзов заставим второй интерфейс получать от DHCP-сервера только те параметры, которые не помешают работе первого интерфейса. Для этого создаем файл /etc/dhclient-eth1.conf — это конфигурационной файл DHCP-клиента. В файл необходимо добавить следующие строки:
reject 192.168.0.1;
send host-name "asterisk";
request subnet-mask, broadcast-address, time-offset, host-name;
По поводу первой строки. Была у меня проблема с одним из роутеров D-Link — даже при отключенном DHCP-сервере роутер присваивал адрес на интерфейс, подключенный к SIP-сети «Казахтелекома». Первая строка конфигурационного файла запрещает интерфейсу eth1 получать IP-адрес от DHCP-сервера с адреса 192.168.0.1.
Итак, мы добились того, что шлюзом по умолчанию остается роутер. Это решение порождает другую проблему — часть трафика телефонии должна была бы уходить в SIP-сеть, но будет уходить в Интернет. Для нормального функционирования телефонии необходимо, чтобы в интерфейс SIP-сети уходил не только трафик, имеющий назначением подсеть 10.2.X.Х (в моем случае), а весь трафик для подсети 10.Х.Х.Х. Для этого создаем файл /etc/sysconfig/network-scripts/route-eth1 и добавляем в него следующую строку:
10.0.0.0/8 dev eth1
Иногда такой строки недостаточно. В Петропавловске, например, работает вышеуказанный вариант, а вот в Астане потребовалось явно указать адрес шлюза в подсеть «Казахтелекома». Делается это таким образом:
10.0.0.0/8 via 10.2.X.1 dev eth1
10.2.X.1 — это адрес шлюза «Казахтелекома» для моего случая. Такое решение мне не очень нравится, т.к. адрес своего шлюза «Казахтелеком» может поменять в любой момент, но как сделать лучше, я не знаю. По-идее, необходимо сначала каким-то образом получить адрес шлюза по DHCP, а потом уже создавать маршрут через этот адрес.
Настраиваем статический IP-адрес на интерфейсе, который смотрит в Интернет, и по совместительству в локальную сеть, где в будущем будут развернуты SIP-клиенты нашей IP-АТС. Для этого даем команду:
system-config-network
Скриншоты настройки статического IP-адреса
Даем команду на перезапуск сетевых интерфейсов:
service network restart
В дальнейшей настройки нашей IP-АТС мы будем неоднократно обращаться к имени SIP-сервера «Казахтелекома»: sip.telecom.kz. При текущей настройке нашего компьютера это имя разрешается в белый IP-адрес 92.46.61.21. Нам необходимо добиться того, чтобы это имя разрешалось в IP-адрес SIP-сети «Казахтелекома».
Сначала необходимо узнать внутренний IP-адрес сервера, который определен для вашего региона. Для этого открываем следующую страницу: http://idphone.kz/?page_id=1010. На ней есть таблица адресов Outbound Proxy при настройке услуги iD Phone через pvc 0/41. Именно в ней ищем необходимый нам адрес.
На всякий случай процитирую эту таблицу здесь:
Актау 10.0.0.44
Актобе 10.0.0.36
Алматытелеком 10.0.0.12
Астанателеком 10.0.0.20
Атырау 10.0.0.28
Караганда 10.0.0.148
Кокшетау 10.0.0.140
Костанай 10.0.0.129
Кызылорда 10.0.0.60
Павлодар 10.0.0.108
Петропавловск 10.0.0.116
Семей 10.0.0.92
Шымкент 10.0.0.68
Талды-Корган 10.0.0.84
Тараз 10.0.0.76
Уральск 10.0.0.52
Усть-Каменогорск 10.0.0.100
Жезказган 10.0.0.156
Теперь добавляем в файл /etc/hosts такую строку:
10.0.0.116 sip.telecom.kz
Это для Петропавловска (мой случай). Замените адрес 10.0.0.116 на соответствующий вашему региону.
Убеждаемся, что все работает правильно. Даем команду:
ping 8.8.8.8
Если пинг идет, значит компьютер имеет доступ к Интернету.
Даем команду:
ping ya.ru
Если имя разрешилось, значит DNS-работает корректно.
Даем команду:
ping 10.0.0.1
Если пинг идет, значит компьютер имеет доступ к SIP-сети «Казахтелекома». На момент написания статьи в «Казахтелекомовской» сети пинговались адреса 10.0.0.1, 10.0.0.2, 10.0.0.3. Но, на самом деле отсутствие пинга не может 100% говорить о том, что у вас проблемы с настройкой. Дело в том, что «Казахтелеком» может в любой момент закрыть пинг на своих серверах. Например, адрес 10.0.0.116 на момент написания статьи не пинговался.
Даем команду:
ping sip.telecom.kz
Если имя разрешается в тот адрес, что задали в файле /etc/hosts, значит настройка этого момента произведена верно. Как написано выше, пинг на sip.telecom.kz может не идти.
Произведем обновление модулей операционной системы. Для этого даем команду:
yum update
На все вопросы системы соглашаемся.
Мы закончили с настройкой операционной системы и теперь пришло время переходить к настройке «Asterisk». Для начала нам необходимо выяснить наши параметры подключения к SIP-серверу «Казахтелекома». Для этого идем в личный кабинет услуги «ID Phone»: https://cabinet.idphone.kz. Будьте внимательны: этот сайт открывается только для пользователей Интернета от «Казахтелекома». Т.е. если вы, например, счастливый пользователь проводного Интернета от «Билайна», то кабинет у вас не откроется.
В кабинете следуем к разделу с параметрами подключения:
Скриншоты пути до параметров подключения ID Phone
Значения в полях «Линия/Порт» и «Логин» у меня одинаковые. У вас тоже, скорее всего, т.к. поля эти для редактирования закрыты. Договоримся в дальнейшем это значение называть <SIP-логин>. Ну, а значение из поля «Пароль» будем называть <SIP-пароль>.
Открываем веб-интерфейс управления «Asterisk», который называется «FreePBX». Для этого на любом компьютере в локальной сети открываем веб-обозреватель и в адресной строке набираем адрес, который присвоили «Asterisk». В нашем случае:
192.168.0.3
Первым делом обновим все модули FreePBX до последних версий.
Скриншоты пути до раздела обновления модулей FreePBX
Предустановленные параметры входа в админку: логин — admin, пароль — admin:
Предустановленные параметры входа в админку: логин — admin, пароль — admin:
В этом разделе нажимаем кнопки в таком порядке: «Проверить он-лайн» — «Обновить все» — «Запустить процесс» — «Подтвердить» и после завершения обновления «Вернуться». Некоторые модули зависят от других, т.е. порядок обновления модулей имеет значение, и поэтому может понадобиться этот процесс сделать несколько раз.
Скриншоты процесса обновления модулей FreePBX
Жмем большую красную кнопку «Apply Config» (не забываем ее жать каждый раз, как она появляется — без этого наши настройки не заработают):
Скриншот c большой красной кнопкой
Идем настраивать транк, т.е. соединение между нашим «Asterisk» и SIP-сервером «Казахтелекома»:
Скриншоты пути до настроек транка
В раздел «опции для PEER» вставляем следующий текст:
type=friend
username=<SIP-логин>
secret=<SIP-пароль>
host=sip.telecom.kz
nat=no
fromuser=<SIP-логин>
fromdomain=sip.telecom.kz
dtmfmode=rfc2833
insecure=port,invite
canreinvite=nonat
qualify=yes
disallow=all
allow=alaw
В раздел «опции USER» вставляем следующий текст:
fromuser=<SIP-логин>
canreinvite=no
secret=<SIP-пароль>
type=user
context=from-trunk
Поле «Строка регистрации» заполняем следующей строкой:
<SIP-логин>:<SIP-пароль>@sip.telecom.kz/502000
Остальные поля я заполняю значением телефонного номера и производными от него:
Проверяем в консоли операционной системы, что транк зарегистрировался. Для этого сначала надо попасть в интерфейс командной строки «Asterisk». Набираем:
asterisk -r
Далее набираем:
sip show registry
Должен отобразиться наш транк и его состояние должно быть Registered. Вот пример моего вывода:
Вывод команд
[root@asterisk ~]# asterisk -r
Privilege escalation protection disabled!
See https://wiki.asterisk.org/wiki/x/1gKfAQ for more details.
Asterisk 11.6.1, Copyright (C) 1999 - 2013 Digium, Inc. and others.
Created by Mark Spencer <markster@digium.com>
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
=========================================================================
Connected to Asterisk 11.6.1 currently running on asterisk (pid = 1607)
asterisk*CLI> sip show registry
Host dnsmgr Username Refresh State Reg.Time
sip.telecom.kz:5060 N XXXXXXXXX 85 Registered Sun, 22 Dec 2013 13:53:45
1 SIP registrations.
Создаем исходящую маршрутизацию (объясняем системе, что делать, когда кто-то из пользователей АТС пытается позвонить наружу):
Скриншот пути до настроек исходящего маршрута
В настройке исходящего маршрута необходимо указать:
- его название («outside», например);
- шаблон номера, по которому будет срабатывать этот маршрут (шаблон «9|.» обозначает, что все номера, которые начинаются на «9» будут отработаны этим маршрутом, при этом девятка будет убрана из номера, когда номер пойдет в транк);
- транк, который мы создали ранее, и в который мы хотим отправлять все наши звонки («502000»).
Создаем внутренний номер:
Скриншоты пути до настроек внутреннего номера
В настройках внутреннего номер необходимо указать:
- сам номер (например, «101»);
- как будет отображаться звонящий с этого номера на экране (например, так же «101»);
- пароль внутреннего номера (минимум 6 символов, минимум две буквы, минимум две цифры — например, «pwd101»).
Создаем входящую маршрутизацию (объясняем системе, что делать, когда снаружи кто-то позвонит на наш транк):
Скриншот пути до настроек входящего маршрута
В настройках входящего маршрута необходимо указать:
- его описание (например, «inside»);
- куда отправлять входящий звонок (в нашем случае отправляем на внутренний номер «101»).
Ну вот мы и закончили настраивать нашу АТС. Пришло время проверить, как все работает. Для этого установим софт-фон и зарегистрируемся на нашей АТС за внутренним номером «101».
Качаем «X-lite» отсюда http://www.counterpath.com/x-lite-for-windows-download.html. Устанавливаем на одном из компьютеров локальной сети.
Настраиваем «X-lite»:
Скриншот пути до настроек X-lite
В настройках аккаунта указываем:
- внутренний номер, за которым мы хотим зарегистрироваться (в нашем случае «101»);
- адрес IP-АТС в локальной сети (в нашем случае «192.168.0.3»);
- пароль внутреннего номера (в нашем случае «pwd101»).
Если мы все сделали правильно, то в статусе софт-фона появится «Available»:
Скриншот подключенного X-lite
А вот теперь действительно все! Пробуем позвонить с софт-фона в город, а потом с города, на наш номер «ID Phone».
Русифицируем IVR (набор голосовых сообщений, которые умеет произносить АТС). Для этого даем ряд команд:
mkdir /var/lib/asterisk/sounds/ru
mkdir /tmp/asteriskru
cd /tmp/asteriskru
wget --no-check-certificate https://github.com/pbxware/asterisk-sounds/tarball/master
tar xfz master --strip-components 1 -C /var/lib/asterisk/sounds/ru/
rm master
wget --no-check-certificate https://github.com/pbxware/asterisk-sounds-additional/tarball/master
tar xfz master --strip-components 1 -C /var/lib/asterisk/sounds/ru/
rm -rf /tmp/asteriskru
Я скачиваю пакет русификации с github'а, т.к. на официальном ресурсе (http://downloads.asterisk.org/pub/telephony/sounds/) нет пакета с дополнительными звуками, а без них АТС будет говорить по-русски только частично.
Теперь в файл /etc/asterisk/sip_general_custom.conf необходимо добавить строку:
language=ru
Перезапускаем АТС и звоним на номер *60. Если все сделали правильно, то АТС на правильном русском языке скажет нам текущее время.
В качестве бонуса для тех, кто так же подвержен паранойе, как и я, немного безопасности.
Во-первых, сделаем доступным FreePBX по https. Для этого устанавливаем соответствующий пакет:
yum install mod_ssl
Перезапускаем web-сервер:
service httpd restart
В целях безопасности разрешим работать с нашей АТС только из нашей локальной сети — вдруг кто из Казахтелекомовской подсети попробует нашу АТС на прочность. Настраиваем брандмауэр группой команд (по мотивам «Asterisk + iptables — самый простой способ настройки» — большое спасибо varnav за это):
# Обеспечиваем доступ к localhost
iptables -A INPUT -i lo -j ACCEPT
# Не трогаем уже установленные соединения
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Разрешаем отвечать на ping
iptables -A INPUT -p icmp -s 192.168.0.0/24 --icmp-type echo-request -j ACCEPT
# Разрешаем SSH
iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 22 -j ACCEPT
# Разрешаем HTTPS (FreePBX)
iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 443 -j ACCEPT
# Разрешаем SIP
iptables -A INPUT -p udp -s 192.168.0.0/24 --dport 5060 -j ACCEPT
# Разрешаем RTP
iptables -A INPUT -p udp --dport 10000:20000 -j ACCEPT
# Разрешаем IAX2 для АТС в филиале (в моем случае адрес филиальной АТС - 192.168.2.3)
iptables -A INPUT -p udp -s 192.168.2.3 --dport 4569 -j ACCEPT
# Разрешаем доступ к Asterisk Manager API (у нас через него 1С к АТС интегрируется)
iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 5038 -j ACCEPT
# Разрешаем доступ к mysql (у нас логи с АТС сливаются и анализируются)
iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 3306 -j ACCEPT
# Блокируем все, что не разрешено, кроме исходящего трафика
iptables -P INPUT DROP
iptables -P FORWARD DROP
Сохраняем наши правила:
service iptables save
Чтобы убедиться, что мы ничего не пропустили, посмотрим список правил брандмауэра:
iptables -L -v
История изменений руководства
22.12.2013 — Первая версия руководства.
24.12.2013 — Добавлен блок об обновлении модулей FreePBX.
07.01.2014 — Добавлен блок о русификации операционной системы, модифицирована информация о создании маршрута в подсеть «Казахтелекома».
11.01.2014 — Добавлен блок о безопасности.
14.01.2014 — Откорректированы параметры настроек транка.
01.02.2014 — Незначительные добавления в блок о безопасности.
03.02.2014 — Незначительные добавления в блок о безопасности.
04.03.2014 — Добавлен блок о русификации IVR.
24.12.2013 — Добавлен блок об обновлении модулей FreePBX.
07.01.2014 — Добавлен блок о русификации операционной системы, модифицирована информация о создании маршрута в подсеть «Казахтелекома».
11.01.2014 — Добавлен блок о безопасности.
14.01.2014 — Откорректированы параметры настроек транка.
01.02.2014 — Незначительные добавления в блок о безопасности.
03.02.2014 — Незначительные добавления в блок о безопасности.
04.03.2014 — Добавлен блок о русификации IVR.