Sofia.conf.xml


Что делает Sofia


Sofia — это модуль FreeSWITCH (mod_sofia), который обеспечивает возможность входящих и исходящих SIP-подключений к FreeSWITCH, действуя в качестве юзер-агента.

Юзер-агент (UA) представляет собой приложение, используемое для обработки определенного сетевого протокола, это относится и к Sofia UA, только в последнем случае сетевым протоколом является SIP. Sofia — общее название для любого использующего сетевой протокол SIP юзер-агента во FreeSWITCH.

Например, Sofia принимает вызовы, отправленные на FreeSWITCH с других SIP юзер-агентов, посылает вызовы на другие юзер-агенты, выступает в качестве клиента для подключения FreeSWITCH к другим агентам, позволяет клиентам подключаться к FreeSWITCH, а также переключает звонки на локальные направления.

Для добавления SIP-провайдера (юзер-агента Sofia) во FreeSWITCH надо найти нужный вам пример в списке SIP-провайдеров, после чего, воспользовавшись полученной информацией, добавить данные провайдера в *.XML-файл, сохранённый в conf/sip_profiles/.

В Sofia допускается использование нескольких юзер-агентов

Юзер-агент (UA) — это приложение, используемое для работы с определенным сетевым протоколом, это относится и к Sofia UA, только в данном случае сетевым протоколом является SIP.

При запуске FreeSWITCH считывает информацию из файла conf/autoload_configs/sofia.conf.xml. В этом файле содержится директива "X-PRE-PROCESS", которая предписывает FreeSWITCH последовательно загружать и объединять все имеющиеся файлы conf/sip_profiles/.xml. В каждом таком .xml файле должно содержаться полное описание одного или нескольких профилей SIP. Загруженные таким образом профили SIP являются частями юзер-агента; то есть, по терминологии FreeSWITCH, UA = User Agent = Sofia Profile = SIP Profile.

Обратите внимание, что все загруженные во FreeSWITCH юзер-агенты сливаются воедино и не должны конфликтовать друг с другом. Точнее, каждый UA должен иметь уникальный порт для приёма вызовов (по умолчанию для SIP установлен порт 5060).

Множественные юзер-агенты (профили) и диалплан

Зачем может понадобиться создание нескольких юзер-агентов? Вот пример.

Допустим, в офисной сети используется брандмауэр. В этом случае при совершении вызовов на номера, находящиеся за пределами брандмауэра, необходимо использовать STUN-сервер, чтобы обойти защиту NAT, в то время как для внутренних звонков по офису STUN-сервер не требуется. Для того, чтобы обеспечить соответствие всем названным требованиям, создаются два разных юзер-агента. Один из них использует STUN-сервер и подключается к телефонным сетям общего пользования через оператора связи. Второй юзер-агент применяется только для местных SIP-вызовов.

Получается, что в ваших профилях будут определены два юзер-агента, каждый из которых может обрабатывать вызовы. Какой из них будет использоваться при наборе SIP-адреса или телефонного номера? Этот определяется параметрами диалплана. Один из определяемых диалпланом вариантов синтаксиса для совершения звонков через Sofia выглядит таким образом:

    sofia/ profile_name /destination

То есть, задача довольно простая. Для определения способа обработки вызова в диалпланах используется сопоставление с шаблонами, а также другие способы проверки. Диалплан проверяет уже набранные символы, после чего определяет, какой из профилей использовать для данного звонка. При наборе телефонного номера в диалплане выбирается юзер-агент, который подключается к публичной телефонной сети. При наборе SIP-адреса, расположенного за пределами защищённой брандмауэром сети, в диалплане выбирается тот же самый юзер-агент, так как звонок осуществляется через STUN-сервер. Однако при наборе SIP-адреса, расположенного внутри защищённой брандмауэром сети, в диалплане выбирается "локальный" юзер-агент.

Чтобы понять, как составлять диалпланы, осуществлять сопоставление с шаблоном и так далее, смотрите Dialplan

Связь между SIP-профилями и доменами

В ответ на вопросы о том, как профили SIP связаны с доменными именами во FreeSWITCH, Энтони Минессал написал статью для списка рассылки.

Лучше всего взглянуть на эти вещи, немного абстрагировавшись.

Домены внутри XML-реестра значительно отличаются как от доменов в интернете, так и от доменов в SIP-пакетах. Профили во всех вышеперечисленных случаях также абсолютно разные. Работа по приведению их в соответствие ложится на вас, если вы того пожелаете.

Во входящей в комплект поставки FreeSWITCH конфигурации по умолчанию настроен сценарий, который с большой долей вероятности загрузится на любом компьютере и будет работать из коробки. Именно это и является первоочередной задачей данной конфигурации, поэтому домен одновременно устанавливается в каталоге и глобальной переменной стандартного домена, а имя внутреннего профиля должно совпадать с IP-адресом устройства, имеющего доступ в интернет. Затем настраивается SIP, чтобы связать его параметры с заданным ранее значением. Если вас не устраивает работа в данном режиме, то можете предпринять попытку настроить своего рода многоканальную систему.

Aliases внутри тегов <aliases> представляют собой список ключей, доступных для использования при конфигурировании вашего текущего профиля. Можете считать их аналогами файла /etc/hosts в Unix, только предназначенными для профилей. Если после определения псевдонимов для всех возможных доменов, размещенных в конкретном профиле, вам понадобится взять строчку вида user@host.com и выяснить, из какого она профиля, то при поиске можно использовать псевдонимы, но только в том случае, если вы добавили <alias name="host.com"/> для этого профиля.

Тег <domains> является индикатором, по сигналу которого профиль открывает XML-реестр FreeSWITCH и проверяет записанные в нём домены. Двумя важнейшими атрибутами являются:

    alias: [true/false] (автоматически создаёт псевдоним для данного домена как описано выше)

    parse: [true/false] (сканирование домена на предмет входных данных для шлюза и включение их в данный профиль)

    name: [<string>] (имя конкретного домена или значение 'all', означающее проведение анализа каждого домена в каталоге)

В конфигурации по умолчанию

    <domain name="all" alias="true" parse="false"/>

Если вы примените этот алгоритм, он проведёт сканирование каждого домена (по умолчанию только один), присвоит псевдонимы, но не станет выполнять разбор для передачи на шлюзы. В каталоге по умолчанию используются глобальные конфигурационные переменные для установки домена, соответствущего локальному IP-адресу компьютера. То есть сейчас у вас в конфигурационном файле имеется домен, совпадающий с IP-адресом, к которому присоединяется внутренний профиль и добавляется псевдоним, так что значение снова будет расширено.

Этот процесс описывается в комментарии в верхней части файла directory/default.xml:

FreeSWITCH работает на основе концепции пользователей и доменов аналогично электронной почте. Каждый из пользователей относится к определенному домену, например, 1000@domain.com. Когда FreeSWITCH получает запрос на регистрацию, он ищет пользователя в каталоге по имени домена в поле from или to, в зависимости от того, как сконфигурирован ваш профиль sofia. Из коробки в качестве домена по умолчанию установлен IP-адрес компьютера, на котором работает FreeSWITCH. Узнать IP-адрес можно, набрав в командной строке фразу "sofia status". При регистрации телефоны по умолчанию привязываются к IP, а не к имени хоста. Если вы хотите зарегистрироваться с использованием домена, откройте файл vars.xml в корневой директории и установите нужное вам имя хоста в качестве домена по умолчанию. После этого при регистрации во FreeSWITCH вместо IP-адреса в клиенте будет использоваться доменное имя.

То есть наличие нескольких профилей с установленными по умолчанию параметрами

    <domain name="all" alias="true" parse="false"/>

может привести к присвоению одних и тех же доменных имён для всех профилей, из-за чего возможно переписывание таблиц поиска и появление ошибок. Если у вас во всех профилях установлено parse="true", то каждый из них будет пытаться подключиться к шлюзам во всех ваших доменах.

Если взглянуть на шаблонный конфигурационный файл, неплохим примером которого для вторичного профиля является external.xml, вы увидите

    <domain name="all" alias="false" parse="true"/>,

то есть, никаких псевдонимов и везде разрешён парсинг — полная противоположность внутреннему профилю, поэтому все шлюзы будут регистрировать как внешние, так и внутренние вызовы, приходящие на локальный IP-адрес.

Следовательно, вам понадобятся отдельные имена вида <domain name="example.com"/> для каждого домена, который вы захотите привязать к профилю, а также придётся использовать более сложную процедуру настройки.

© Внимание! Все права на перевод принадлежат фирме Гарантум. При ссылке или цитировании данной информации обязательно вставляйте ссылку на источник