воскресенье, 24 апреля 2016 г.

Соединение двух Asterisk через раздельные учётные записи IAX2 для входящих и исходящих звонков

Рассмотрим соединение двух станций Asterisk по протоколу IAX2. В прошлой заметке, в которой была описана настройка IAX2, я использовал учётные записи типа friend, каждая из которых использовалась как для входящих, так и для исходящих звонков. В этот раз я воспользуюсь учётными записями типов peer и user. Учётная запись типа peer будет использоваться для исходящих звонков, а учётная запись типа user - для входящих. При этом фактически учётная запись типа peer подключается к учётной записи типа user на другой станции, а для двустороннего обмена звонками используется два отдельных подключения.

Повторю пару абзацев из своей прошлой заметки о раздельных учётных записях SIP, которые полностью справедливы и для случая учётных записей IAX2. На самом деле учётная запись любого типа может использоваться для входящих и исходящих звонков. Учётная запись user для входящих звонков будет требовать у удалённой стороны пройти процедуру аутентификации, я для получения исходящих звонков удалённая сторона должна зарегистрироваться в системе - указать свой IP-адрес и порт, куда отправлять звонки. Учётная запись типа peer при совершении исходящих звонков готова пройти аутентификацию на удалённой стороне, а для входящих звонков от удалённой стороны проверяет только соответствие IP-адреса и порта удалённой стороны, но не требует аутентификации.

Разделением учётных записей на peer и user мы добьёмся, кроме всего прочего, того, что входящий звонок всегда будет поступать с данными аутентификации, а не будет полагаться на соответствие IP-адреса и порта удалённой стороны. Потенциальный взломщик, сидящий за сервером NAT, не сможет притвориться соседом, воспользовавшись одинаковым с соседом IP-адресом NAT-сервера, и совершить звонок в систему от имени соседа. Также звонки из системы будут всегда уходить в заранее предусмотренном направлении, а не туда, откуда совершена регистрация. Если злоумышленник раздобудет логин и пароль и зарегистрируется в системе, звонки всё равно будут уходить туда, куда указывают настройки из файла конфигурации.

В заметке Соединение двух Asterisk через IAX2 главным неудобством была необходимость указывать имя пользователя, пароль и адрес удалённой станции в каждой команде Dial, где используется это соединение. В этой заметке используются наработки из прошлой статьи Соединение двух Asterisk через раздельные учётные записи SIP для входящих и исходящих звонков. Использование отдельных учётных записей для входящих и исходящих звонков позволяет избавиться от этого неудобства и указывать в командах Dial номерного плана только имя подключения.

Как и в прошлых заметках, первая станция называется desktop, имеет IP-адрес 169.254.254.1, к ней подключены телефоны с номерами 1XXX. Вторая станция называется notebook и имеет IP-адрес 169.254.254.4, к ней подключены телефоны с номерами 2XXX.

1. Создание учётных записей для входящих звонков

Откроем файл /etc/asterisk/iax.conf на станции desktop и добавим туда шаблон для телефонных станций и учётную запись IAX2, через которую desktop будет принимать звонки от телефонной станции notebook:
[asterisk_iax_in](!)
language=ru
type=user
context=stations
host=dynamic
trunk=yes
;qualify=yes
;transfer=no
deny=0.0.0.0/0

[notebook](asterisk_iax_in)
secret=notebook_password
permit=169.254.254.4
Телефонная станция notebook сможет зарегистрироваться только с IP-адреса 169.254.254.4. Входящие звонки будут попадать в контекст stations.

Теперь откроем файл /etc/asterisk/iax.conf на станции notebook и впишем туда следующие симметричные настройки:
[asterisk_iax_in](!)
language=ru
type=user
context=stations
host=dynamic
trunk=yes
;qualify=yes
;transfer=no
deny=0.0.0.0/0

[desktop](asterisk_iax_in)
secret=desktop_password
permit=169.254.254.1
Теперь выполним на обеих телефонных станциях следующую команду, чтобы на них появились учётные записи IAX2:
# asterisk -rx 'iax2 reload'
2. Создание учётных записей для исходящих звонков

Откроем файл /etc/asterisk/iax.conf на станции desktop и создадим учётную запись, через которую станция desktop будет направлять звонки на станцию notebook:
[asterisk_iax_out](!)
language=ru
type=peer
trunk=yes
;transfer=no

[to_desktop](asterisk_iax_out)
fromuser=desktop
secret=desktop_password
host=169.254.254.4
Откроем файл /etc/asterisk/iax.conf на станции notebook и впишем симметричные настройки - создадим учётную запись, через которую станция notebook будет отправлять звонки на станцию desktop:
[asterisk_iax_out](!)
language=ru
type=peer
trunk=yes
;transfer=no
  
[to_desktop](asterisk_iax_out)
fromuser=notebook
secret=notebook_password
host=169.254.254.1
Теперь выполним на обеих телефонных станциях следующую команду, чтобы на них появились учётные записи IAX2:
# asterisk -rx 'iax2 reload'
В отличие от прошлой статьи, где были настроены учётные записи типа friend, здесь отсутствуют выражения register. Регистрация используется для информирования удалённой стороны о том, в каком направлении нужно отправлять обратные звонки. В прошлой статье регистрация использовалась скорее только для установки подключения и для его именования, но информация о местоположении удалённой стороной реально не использовалась. В этой статье выражения register отсутствуют, поскольку их роль выполняют учётные записи типа peer.

3. Входящие звонки с удалённых станций

Звонки, поступающие от удалённых станций будут попадать в контексты stations. Удалённые станции должны иметь возможность дозвониться на номера местной станции. Впишем в файл /etc/asterisk/extensions.conf на станции desktop соответствующий контекст:
[stations]
include => test

exten => _1XXX,1,Dial(SIP/${EXTEN})
Соответственно, чтобы абоненты удалённых станций могли позвонить абонентам станции notebook, впишем в файл /etc/asterisk/extensions.conf на станции notebook симметричный контекст:
[stations]

exten => _2XXX,1,Dial(SIP/${EXTEN})
Как можно увидеть, тестовые номера 5XX будут обслуживаться станцией desktop.

Выполним на обеих станциях команды, которые создадут на них контексты stations:
# asterisk -rx 'dialplan reload'
4. Исходящие звонки на удалённые станции

Вся необходимая подготовка уже выполнена, осталось только объяснить обеим станциям, звонки на какие телефонные номера нужно направлять через IAX2-подключение к другой станции.

Откроем файл /etc/asterisk/extensions.conf на станции desktop и приведём контекст internal к следующему виду:
[internal]
include => test

exten => _1XXX,1,Dial(SIP/${EXTEN})

exten => _2XXX,1,Dial(IAX2/to_notebook/${EXTEN})
Из этого контекста видно, что звонки на тестовые номера и номера 1XXX будут обрабатываться самой станцией desktop, а звонки на номера 2XXX будут направляться через IAX2-подключение to_notebook, то есть - на станцию notebook. Там они попадут в контекст stations, в котором предписывается направлять вызовы SIP-абонентам самой станции notebook.

Откроем файл /etc/asterisk/extensions.conf на станции notebook и приведём контекст internal к такому виду:
[internal]
exten => _5XX,1,Dial(IAX2/to_desktop/${EXTEN})

exten => _1XXX,1,Dial(IAX2/to_desktop/${EXTEN})

exten => _2XXX,1,Dial(SIP/${EXTEN})
Звонки на номера 2XXX будут обрабатываться внутри самой станции notebook, а звонки на тестовые номера 5XX и номера 1XXX будут направляться через IAX2-подключение to_desktop, то есть - на станцию desktop, где так же попадут в контекст stations. Там же уже прописано, как нужно обрабатывать входящие звонки на эти номера.

Осталось перезагрузить номерные планы на обеих станциях:
# asterisk -rx 'dialplan reload'

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