Эта заметка является усовершенствованным вариантом заметки Соединение двух Asterisk через SIP. В прошлой заметке я использовал учётные записи типа friend, каждая из которых может использоваться как для входящих, так и для исходящих звонков. В этот раз я воспользуюсь учётными записями типов peer и user. Учётная запись типа peer будет использоваться для совершения исходящих звонков, а учётная запись типа user - для входящих. При этом фактически учётная запись типа peer подключается к учётной записи типа user на другой станции, а для двустороннего обмена звонками используется два отдельных разнонаправленных подключения.
На самом деле учётная запись любого типа может использоваться для входящих и исходящих звонков. Учётная запись user для входящих звонков будет требовать у удалённой стороны пройти процедуру аутентификации, я для получения исходящих звонков удалённая сторона должна зарегистрироваться в системе - указать свой IP-адрес и порт, куда отправлять звонки. Учётная запись типа peer при совершении исходящих звонков готова пройти аутентификацию на удалённой стороне, а для входящих звонков от удалённой стороны проверяет только соответствие IP-адреса и порта удалённой стороны, но не требует аутентификации.
Разделением учётных записей на peer и user мы добьёмся, кроме всего прочего, того, что входящий звонок всегда будет поступать с данными аутентификации, а не будет полагаться на соответствие IP-адреса и порта удалённой стороны. Потенциальный взломщик, сидящий за сервером NAT, не сможет притвориться соседом, воспользовавшись одинаковым с соседом IP-адресом NAT-сервера, и совершить звонок в систему от имени соседа. Также звонки из системы будут всегда уходить в заранее предусмотренном направлении, а не туда, откуда совершена регистрация. Если злоумышленник раздобудет логин и пароль и зарегистрируется в системе, звонки всё равно будут уходить туда, куда указывают настройки из файла конфигурации.
Как и в прошлых заметках, первая станция называется desktop, имеет IP-адрес 169.254.254.1, к ней подключены телефоны с номерами 1XXX. Вторая станция называется notebook и имеет IP-адрес 169.254.254.4, к ней подключены телефоны с номерами 2XXX.
Откроем файл /etc/asterisk/sip.conf на станции desktop и добавим туда шаблон для телефонных станций и учётную запись SIP, через которую desktop будет принимать звонки от телефонной станции notebook:
[asterisk_sip_in](!) language=ru type=user context=stations host=dynamic insecure=invite,port trunk=yes deny=0.0.0.0/0 [notebook](asterisk_sip_in) secret=notebook_password permit=169.254.254.4
Телефонная станция notebook сможет зарегистрироваться только с IP-адреса 169.254.254.4. Входящие звонки будут попадать в контекст stations.
Теперь откроем файл /etc/asterisk/sip.conf на станции notebook и впишем туда следующие симметричные настройки:
[asterisk_sip_in](!) language=ru type=user context=stations host=dynamic insecure=invite,port trunk=yes deny=0.0.0.0/0 [desktop](asterisk_sip_in) secret=desktop_password permit=169.254.254.1
Теперь выполним на обеих телефонных станциях следующую команду, чтобы на них появились учётные записи SIP:
# asterisk -rx 'sip reload'
Откроем файл /etc/asterisk/sip.conf на станции desktop и создадим учётную запись, через которую станция desktop будет направлять звонки на станцию notebook:
[asterisk_sip_out](!) language=ru type=peer trunk=yes [to_notebook](asterisk_sip_out) fromuser=desktop secret=desktop_password host=169.254.254.4
Откроем файл /etc/asterisk/sip.conf на станции notebook и впишем симметричные настройки - создадим учётную запись, через которую станция notebook будет отправлять звонки на станцию desktop:
[asterisk_sip_out](!) language=ru type=peer trunk=yes [to_desktop](asterisk_sip_out) fromuser=notebook secret=notebook_password host=169.254.254.1
Теперь выполним на обеих телефонных станциях следующую команду, чтобы на них появились учётные записи SIP:
# asterisk -rx 'sip reload'
В отличие от прошлой статьи, где были настроены учётные записи типа friend, здесь отсутствуют выражения register. Регистрация используется для информирования удалённой стороны о том, в каком направлении нужно отправлять обратные звонки. В прошлой статье регистрация использовалась скорее только для установки подключения и для его именования, но информация о местоположении удалённой стороной реально не использовалась. В этой статье выражения register отсутствуют, поскольку их роль выполняют учётные записи типа peer.
Звонки, поступающие от удалённых станций будут попадать в контексты 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'
Вся необходимая подготовка уже выполнена, осталось только объяснить обеим станциям, звонки на какие телефонные номера нужно направлять через SIP-подключение к другой станции.
Откроем файл /etc/asterisk/extensions.conf на станции desktop и приведём контекст internal к следующему виду:
[internal] include => test exten => _1XXX,1,Dial(SIP/${EXTEN}) exten => _2XXX,1,Dial(SIP/to_notebook/${EXTEN})
Из этого контекста видно, что звонки на тестовые номера и номера 1XXX будут обрабатываться самой станцией desktop, а звонки на номера 2XXX будут направляться через SIP-подключение to_notebook, то есть - на станцию notebook. Там они попадут в контекст stations, в котором предписывается направлять вызовы SIP-абонентам самой станции notebook.
Откроем файл /etc/asterisk/extensions.conf на станции notebook и приведём контекст internal к такому виду:
[internal] exten => _5XX,1,Dial(SIP/to_desktop/${EXTEN}) exten => _1XXX,1,Dial(SIP/to_desktop/${EXTEN}) exten => _2XXX,1,Dial(SIP/${EXTEN})
Звонки на номера 2XXX будут обрабатываться внутри самой станции notebook, а звонки на тестовые номера 5XX и номера 1XXX будут направляться через SIP-подключение to_desktop, то есть - на станцию desktop, где так же попадут в контекст stations. Там же уже прописано, как нужно обрабатывать входящие звонки на эти номера.
Осталось перезагрузить номерные планы на обеих станциях:
# asterisk -rx 'dialplan reload'