Pull to refresh

Установка и настройка Asterisk под iD Phone (iDPhone)

Reading time 12 min
Views 42K


Новое руководство на эту тему расположено здесь: habr.com/ru/post/350460

В данной инструкции описано как с нуля установить и произвести первоначальную настройку компьютерной телефонии на базе «Asterisk» с подключением к услуге «iD Phone» компании «Казахтелеком».

Некоторые идеи я почерпнул из этой статьи: «Пошаговое руководство по привязке SIP-номера к Elastix (FreePBX, Asterisk) на примере провайдера Megaline iDPhone» (большое спасибо asdForever за это), но:
  • во-первых, по указанной инструкции система у меня не заработала;
  • во-вторых, не со всеми решениями в ней я согласен;
  • в-третьих, мы будем настраивать не «Elastix», а «AsteriskNow»;
  • в-четвертых, я постарался написать инструкцию максимально подробной — для людей мало разбирающихся в Linux-системах и в «Asterisk» (каковым я и сам являюсь).

Дано:
  1. Операционная система будет установлена с нуля. Использован будет дистрибутив «AsteriskNOW» — это операционная система «CentOS» с предустановленным программным обеспечением «Asterisk» и веб-интерфейсом для его управления «FreePBX». Другими словами в данной инструкции отсутствует блок, в котором была бы описана установка «Asterisk» на уже развернутой Linux-системе.
  2. «Казахтелеком» предоставляет услугу «iD Phone» не через Интернет, а подключая абонентов к своей специальной SIP-сети. Физически, конечно, это чаще всего один канал (ADSL или оптика) вместе с Интернет и/или «iD TV». Роутер же отдает предоставляемые услуги на разные порты. Считаем, что у нас уже есть настроенный роутер, который с одного порта отдает Интернет, а с другого — «iD Phone».
  3. Компьютер имеет две сетевых карты: одна из них смотрит в Интернет, другая — в 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:



В этом разделе нажимаем кнопки в таком порядке: «Проверить он-лайн» — «Обновить все» — «Запустить процесс» — «Подтвердить» и после завершения обновления «Вернуться». Некоторые модули зависят от других, т.е. порядок обновления модулей имеет значение, и поэтому может понадобиться этот процесс сделать несколько раз.
Скриншоты процесса обновления модулей 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.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+10
Comments 12
Comments Comments 12

Articles