- SIP прокси¶
- Установка плагина¶
- Настройка плагина¶
- Общие настройки¶
- Пользователи.¶
- Исходящие домены.¶
- База знаний
- SIP прокси
- Домашний сервер: прокси для SIP
- Взаимодействие клиентов SIP. Часть 2
- Выбор транспортного протокола и поиск Proxy
- Взаимодействие с использованием Proxy
- SIP-регистрация
- Bonus для тех, кому интересно
SIP прокси¶
Плагин os-siproxd представляет собой прокси / сервер регистрации протокола SIP.
Он позволяет SIP софтфонам (таким, как kphone, linphone, zoiper и др.) а также аппаратным SIP терминалам (Cisco, Grandstream, Zyxel и др. ) работать за маршрутизатором с использованием NAT.
Он обрабатывает регистрацию SIP-клиентов в частной сети и выполняет замену заголовков SIP для подключения через маршрутизатор с NAT.
Важно: не используйте дополнительные технологии (хелперы) для облегчения прохождения SIP совместно с плагином siproxd. Это может привести к непредсказуемым результатам.
Установка плагина¶
Перейдите в раздел Система -> Прошивка -> Плагины.
На вкладке Плагины нажмите на кнопку + напротив плагина os-siproxd для его установки.
Настройка плагина¶
Перейдите в раздел Службы -> Siproxd.
Общие настройки¶
Настройте следующие параметры:
Включить службу siproxd: Включить плагин.
Входящий интерфейс: Внутренний интерфейс к которому подключены SIP устройства.
Исходящий интерфейс: Внешний интерфейс, подключенный к провайдеру.
Исходящий хост: IP или FQDN адрес внешнего интерфейса шлюза — необязательный параметр. Используется, если IP внешнего интерфейса siproxd не совпадает с внешним (реальным) адресом шлюза.
Хосты, которым разрешена регистрация: Список доступа (access list) сетей в формате / разделенных запятой, с которых разрешена регистрация.
Хосты, которым разрешён SIP: Список доступа (access list) сетей в формате / разделенных запятой, с которых разрешен SIP трафик (внутренние и внешние).
Хосты, которым запрещён SIP: Список доступа (access list) сетей в формате / разделенных запятой, с которых запрещен SIP трафик (имеет более высокий приоритет, чем предыдущий параметр).
SIP слушает порт: Номер порта, используемого для SIP подключений. Обычно 5060.
RTP port low / RTP port high: Диапазон портов, используемый для входящего и исходящего RTP потока (включительно). Значение по умолчанию 7070 — 7089, что позволяет осуществлять до 10 одновременных соединений (по 2 порта на соединение). Данный диапазон портов должен быть внесен в исключения в файрволе.
RTP timeout: Таймаут RTP потока. Если в течение данного времени (в секундах) не будет передачи данных, то поток будет считаться нерабочим и соединение будет разорвано.
RTP DSCP / SIP DSCP: Позволяет настроить приоритезацию трафика «QOS» используя маркировку пакетов DSCP.
RTP input dejitter / RTP output dejitter: Размер Jitter буфера (в миллисекундах) для входящего / исходящего RTP трафика (значение по умолчанию 0 — выключено).
Включить проверку подлинности прокси: Включить работу плагина в качестве регистратора. (siproxd имеет ограниченные возможности по работе в качестве регистратора, поэтому данный режим лучше не использовать)
Тайм-аут TCP: Таймаут TCP SIP сигнализации. Если соединение неактивно дольше этого промежутка (в секундах) — соединение разрывается. Не делайте это значение слишком маленьким (меньше интервала регистрации), иначе это может привести к попыткам параллельной регистрации.
Тайм-аут подключения TCP: Таймаут (в мс) в течение которого siproxd будет ожидать успешного подключения при исходящем соединении.
TCP-сообщения keepalive: Интервал (в секундах) отправки пакетов Sip-Keep-Alive для поддержания связи. Если Данное значение 0 или не задано, то пакеты не посылаются.
Строка Useragent: Если задано — плагин производит замену (маскарадинг) заголовка Useragent в пакетах SIP. Используется в случаях, если SIP провайдер не работает с какими-то Useragent — заголовками.
Удаленный порт в VIA-Header: Добавлять ли запись rport в заголовок via. Используется в определенных (редких) ситуациях, когда за siproxd используется NAT, который заменяет порты.
Включить плагин defaulttarget: Данный плагин выполняет перенаправление всех входящих звонков на несуществующие номера на номер, указанный в параметре Целевая учетная запись по умолчанию:
Включить ведение журнала defaulttarget: Логировать в журнал работу плагина defaulttarget
Целевая учетная запись по умолчанию: Учетная запись на которую выполняется перенаправление входящих звонков на несуществующие номера.
Включить плагин fix_bogus_via: Данный плагин исправляет поврежденные заголовки via во входящих звонках.
Сети для замены заголовка VIA: Список сетей, разделенных запятой для плагина fix_bogus_via.
Включить плагин fix_DTAG_networks: Данный плагин исправляет работу SIP клиентов с провайдером T-Online.
Сервера DTAG: Список серверов, разделенный запятой, для которых необходимо производить исправления плагином fix_DTAG_networks.
Включить плагин fbox_anoncall_networks: Данный плагин исправляет работу некоторых устройств fritzbox и анонимными звонками.
Список сетей для плагина fbox anoncall: Список сетей, разделенный запятыми, в которых применяется плагин fbox_anoncall_networks.
Включить плагин STUN: Данный плагин предназначен для определения внешнего IP адреса, используемого siproxd.
Сервер STUN: IP или имя STUN сервера.
Порт STUN: номер порта STUN сервера.
Период STUN: Период опроса (в секундах) STUN сервера (STUN сервер опрашивается при запуске плагина, а потом с заданной периодичностью)
Пользователи.¶
На данной закладке вы можете заполнить пользовательскую базу данных при использовании плагина siproxd в качестве регистратора:
Вам необходимо заполнить имя пользователя и пароль.
Исходящие домены.¶
Плагин siproxd может быть настроен на использование разных прокси-серверов для разных SIP провайдеров.
Для этого необходимо в соответствующей закладке заполнить:
Имя: Доменное имя регистратора.
Хост: Имя или IP адрес прокси-сервера, который должен использоваться для работы с данным провайдером.
Порт: Порт прокси-сервера.
База знаний
SIP прокси
Прокси,сервер (от английского proxy – представитель) представляет интересы пользователя в сети. Он принимает запросы, обрабатывает их и, в зависимости от типа запроса, выполняет определенные действия. Это может быть поиск и вызов пользователя, маршрутизация запроса, предоставление услуг и т.д. Прокси,сервер состоит из клиентской и серверной частей, поэтому может принимать вызовы, инициировать собственные запросы и возвращать ответы. Прокси,сервер может быть физически совмещен с сервером определения местоположения/сервером обработки регистраций (в этом случае он называется registrar) или существовать отдельно от этого сервера, но иметь возможность взаимодействовать с ним по протоколам LDAP (RFC 1777), rwhois
(RFC 2167) и по любым другим протоколам.
Предусмотрено два типа прокси,серверов – с сохранением состояний (stateful) и без сохранения состояний (stateless).
Сервер первого типа хранит в памяти входящий запрос, который явился причиной генерации одного или нескольких исходящих запросов. Эти исходящие запросы сервер также запоминает. Все запросы хранятся в памяти сервера только до окончания транзакции, т.е. дополучения ответов на запросы.
Сервер первого типа позволяет предоставить большее количество услуг, но работает медленнее, чем сервер второго типа. Он может применяться для обслуживания небольшого количества клиентов, например, в локальной сети. Прокси,сервер должен сохранять информацию о состояниях, если он:
- использует протокол ТСР для передачи сигнальной информации;
- работает в режиме многоадресной рассылки сигнальной информации;
- размножает запросы.
Последний случай имеет место, когда прокси,сервер ведет поиск вызываемого пользователя сразу в нескольких направлениях, т.е. один запрос, который пришел к прокси,серверу, размножается и передается одновременно по всем этим направлениям.
Сервер без сохранения состояний просто ретранслирует запросы и ответы, которые получает. Он работает быстрее, чем сервер первого типа, так как ресурс процессора не тратится на запоминание состояний, вследствие чего сервер этого типа может обслужить большее количество пользователей. Недостатком такого сервера является то, что на его базе можно реализовать лишь наиболее простые услуги. Впрочем, прокси,сервер может функционировать как сервер с сохранением состояний для одних пользователей и как сервер без сохранения состояний – для других.
Алгоритм работы пользователей с прокси,сервером выглядит следующим образом. Поставщик услуг IP,телефонии сообщает адрес прокси,сервера своим пользователям. Вызывающий пользователь передает к прокси,серверу запрос соединения. Сервер обрабатывает запрос, определяет местоположение вызываемого пользователя и передает запрос этому пользователю, а затем получает от него ответ, подтверждающий успешную обработку запроса, и транслирует этот ответ пользователю, передавшему запрос.
Прокси,сервер может модифицировать некоторые заголовки сообщений, которые он транслирует, причем каждый сервер, обработавший запрос в процессе его передачи от источника к приемнику должен указать это в SIP,запросе для того, чтобы ответ на запрос вернулся по такому же пути.
Выдержка из SIP RFC:
Прокси, Прокси Сервер: компонент, выполняющий посреднические функции, который выступает в роли как сервера , так и клиента, в целях создания запросов от лица других клиентов. Основная роль, которую играет прокси сервер — это маршрутизация, имеется ввиду, что он выполняет работу по гарантированной отправке запросов другому участнику, который «недоступен» для абонента отправившего запрос. Еще одно применение прокси серверов — это ограничение доступа к сервисам (например, он может проверять, имеет ли пользователь право совершать вызовы). Прокси сервер сам обрабатывает, и, при необходимости, вносит изменения в определенные поля сообщений запросов, перед тем как переслать их.
SIP прокси сервер — это участник на пути маршрутизации SIP запросов к серверу пользователя (user agent servers) и доставки SIP ответов обратно к пользовательскому агенту (user agent clients). Запрос может пройти через несколько прокси серверов на своем пути, до того как он достигнет UAS. Каждый из них принимает решение по маршрутизации запроса, вносит необходимые изменения в сообщение и пересылает его к следующему элементу на пути маршрута SIP сообщения. Ответные сообщения возвращаются тем же путем, что и запрос, через те же прокси сервера, но в обратной последовательности.
С помощью записей DNS SRV, Вы можете назначить SIP прокси сервер для заданного домена, чтобы дать возможность вызова ваших абонентов с использованием URL, вместо использования жестко заданного SIP прокси сервера.
Домашний сервер: прокси для SIP
У меня есть стационарный ip телефон, и раутер под ubuntu-server раздающий интернет. Проблема в том, что телефон отдает свой локальный ип (192.168.0.6) sip серверу, и соответственно дозвонится мне уже не возможно. Проброска портов здесь тоже не поможет.
Первое что пришло в голову — завести Asterisk PBX (программная АТС), но данное решение кажется избыточным для дома с одним телефоном, одним SIP провайдером и без FXO интерфейса. Совершенно случайно нашел небольшую утилиту реализующую как раз-то, что нужно: siproxd. Данная программа есть в репозитории дебиана и убунты.
Остальные опции менять не нужно. Так же можно настроить быстрый набор:
Как выглядит настройка на телефоне Cisco 7912g (настройки для других телефон скорее всего будут подобными):
- OutBoundProxy: адрес сервера с siproxd
- Proxy: адрес sip сервера провайдера
- UID: Ваш UID у sip провайдера
- PWD: Ваш пароль
Если в Proxy написать адрес сервера с siproxd, то можно звонить между подключенными к данному серверу телефонами. Довольно удобная вещь.
В чем плюсы данного подхода:
- Нет необходимости запускать и настраивать полноценную АТС
- Довольно легко настраивать
- Прокси поддерживает авторизацию, соответственно можно сделать небольшой прокси сервер внутри организации с возможностью звонков между телефонами по короткому номеру.
- Можно использовать аппаратные sip телефоны за NAT (программные в основном и так прекрасно работают, благодаря STUN и другим технологиям)
кросс пост с моего блога
Взаимодействие клиентов SIP. Часть 2
В предыдущей статье мы рассмотрели простое взаимодействие клиентов SIP без использования Proxy-сервера. Такое взаимодействие на практике встречается чрезвычайно редко, но отлично подходит для того, чтобы понять основы SIP.
Теперь, когда мы разобрались с базовыми вещами, предлагаю перейти к реальной работе протокола.
В этой статье я планирую рассмотреть три вопроса:
- Выбор транспортного протокола и поиск Proxy;
- Работа через Proxy;
- Регистрация на Proxy-сервере.
Выбор транспортного протокола и поиск Proxy
Поскольку протокол SIP поддерживает несколько транспортных протоколов (UDP, TCP, SCTP, TLS), необходимо каким-то образом определять, какой протокол использовать. Для этого существет несколько способов.
Первый способ предполагает явное указание транспорта в SIP URI (кроме TLS). Выглядит это вот так:
Если транспорт явно не указан, то действует следующий алгоритм:
- Если SIP URI содержит IP-адрес, то для SIP URI используется UDP, для SIPS (Secure SIP) – TCP.
- Если IP-адрес не укзаан, но укзаан порт, то для SIP URI используется UDP, для SIPS – TCP.
- Если отсутсвует IP-адрес и порт, но в DNS присутствует соответсвующая NAPTR-запись, тогда “SIP+D2U” соответствует UDP, “SIP-D2T” указывает на TCP и “SIP-D2S” — на SCTP. NAPTR содержит ссылку на SRV-запись, которая будет использоваться для поиска Proxy-сервера. Если NAPTR остуствует, то должен быть выполнен запрос на поиск SRV-записи.
- Результатом SRV запроса будет имя и порт Proxy-сервера.
- Если SRV-запись отсутствует, то выполняется A или AAAA-запрос. При это для SIP URI используется UDP, для SIPS – TCP.
Для того, чтобы лучше разобраться, рассмотрим пример, когда мы хотим связаться с клиентом sip:ivan@domain.ru:
Итак, мы выяснили, параметры Proxy-сервера Ивана. Теперь предлагаю рассмотреть использование Proxy в рамках SIP-диалога.
Ремарка для тех, кто не знает, что такое NAPTR. Я узнал, что есть такой тип DNS-записи только, когда писал эту статью, так что не отчаивайтесь. Чуть подробнее про NAPTR здесь.
Взаимодействие с использованием Proxy
Для чего же нам необходим SIP Proxy? Как я уже сказал, в примере из 1-ой части статьи клиенты знали IP-адреса друг друга и могли общаться напрямую. В реальной жизни клиенты чаще всего получают адреса динамически, поэтому нет смысла «запоминать» тот или иной IP. Первое, что приходит на ум в данной ситуации – использовать A-записи DNS и определить реальный действующий адрес. Однако тут кроется следующая проблема: IP-адрес идентифицирует конкретное устройство, а не пользователя на нем. Особенностью взаимодействия SIP является то, что обмен сообщения происходит не на уровне устройство-устройство, а на пользователь-пользователь. При этом один пользователь может одновременно использовать несколько SIP-клиентов: на мобильном телефоне, на рабочем компьютере, на домашнем компьютере и на SIP-телефоне. Как же быть?
Протокол SIP предлагает следующее решение: создается SIP Proxy и каждый пользователь регистрирует свои устройства на этом Proxy (точнее пользователи регистрируются на сервере регистрации, а Proxy имеет доступ к базе регистрации, но для простоты будем считать, что это один и тот же сервер). Как это делается, я покажу ниже. Пока просто запомните, что Proxy знает, как именно найти тот или иной клиент пользователя.
Когда Петр звонит Ивану, выполняется следующая последовательность действий:
- SIP-клиента Петра определяет адрес и протокол SIP Proxy Ивана (как это делается — см. выше)
- Клиент отправляет на Proxy запрос INVITE
- Proxy-сервер смотрит, на каких устройствах зарегистрировался Иван и отправляет запрос на все эти устройства
- Иван отвечает на звонок на одном из устройств и шлет 200 OK на Proxy
- Proxy перенаправляет 200 OK Петру
- Петр получает SIP-адрес Ивана на конкретном устройстве из поля Contact вответе 200 ОК и шлет ответ напрямую, минуя Prxoy
- Все последующее общение идет также напрямую
На схеме это выглядит следующим образом:
Для тех, кто изучил первую часть статьи, все выглядит довольно знакомо; добавился только промежуточный Proxy-сервер. Соответственно и обмен сообщениями изменился незначительно.
Прежде, чем преступим к детальному рассмотрению, маленькая ремарка. В рамках SIP разделяют два типа URI. Первый из них – ползовательский URI, также известный как address of recorf (AOR). Запрос, отправленный на этот адрес предполагает поиск в базе данных Proxy и отправку запроса одному или несольким устройствам. Второй – URI устройства (а точнее – пользователя на устроястве). URI устройства обычно называется контакт и содержится, соответственно, в поле Contact SIP-сообщения. AOR содердится в полях From и To.
Начало разговора
Итак, Петр посылает INVITE для Ивана на Proxy-сервер:
Proxy-сервер перенаправляет запрос всем SIP-клиентам Ивана. Для простоты предположим, что Иван использует только одно устройство. Чтобы SIP-клиент понимал, что запрос был перенаправлен через Proxy, сервер добавляет свое заголовочное поле via:
SIP-клиент Ивана шлет ответ 180 Ringing (Иван слышит звонок). При этом он добавляет tag в поле To и указывает свой контакт в поле Contact. Кроме того, в первом поле via добавился параметр received этот параметр показывает, с какого адреса клиент Ивана получил запрос (т.е. адрес Proxy-сервера, как его видит Иван). Это бывает полезно знать для решения возникающих проблем:
Proxy, соответственно, перенаправляет запрос клиенту Петра. При этом он убирает свой via:
После отправки 180 Ringing, как только Иван снимет трубку, клиент Ивана отправляет на Prxoy ответ 200 OK:
Proxy передает этот ответ Петру, убирая при этом via:
Теперь самое интересное. Клиент Петра отправляет сообщение АСК непосредственно клиенту Ивана в обход Proxy. Причем, если бы Иван одновременно использовал несколько клиентов SIP, ответ пришел именно на тот, который нужно. Благодаря чему это возможно?
200 ОК отправляется с клиента на котором Иван снял трубку. Более того, в поле Contact ответа 200 ОК содержится URI, соответствующий пользователю Иван на конкретном устройстве. Таким образом клиент Петра отправляет АСК именно на это устройство, после чего участие Proxy больше не требуется:
Все остальные сообщения, включая медиа-траффик идут в обход Proxy.
Конец разговора
В конце разговора клиент Ивана отправляет BYE напрямую клиенту Петра:
Петр в ответ шлет подтверждение:
Здесь все, как в первой части статьи.
Итак, мы рассмотрели взаимодействие SIP-клиентов с участием Proxу-сервера. Остался один единственный вопрос: откуда Proxy узнал адреса клиентов Ивана? С помощью процедуры регистрации. Как это происходит, я расскажу ниже.
SIP-регистрация
Регистрация выглядит следующим образом:
Давайте подробнее рассмотрим каждое из сообщений. Иван отправляет на сервер запрос Register (для простоты считаем, что роль сервера регистрации установлена на proxy.domain.ru). Самое важное в этом запросе – поле Contact. Это адрес Ивана на конкретном устройстве:
В ответ сервер присылает 401 Unauthorized, то есть требование авторизации. Самое важное поле в ответе — WWW-Authenticate. Не сложно догадаться, что realm — это домен, а algorithm указывает, какой хеш-алгоритм мы будем использовать. Интерес вызывает поле nonce:
Nonce — это сокращение от «number used once». Nonce — это одноразовая случайная последовательность, которую клиент Ивана cкомбинирует со строкой пароля, после чего сгенерирует MD5-хеш от полученной строки и поместит результат в новый запрос в поле WWW-Authenticate (на самом деле все несколько сложнее, но для простоты будем считать, что все именно так). Для этого служит параметр response.
Зачем нужен nonce? Если бы клиент генерировал MD5 от пароля и не использовал nonce, то хеш каждый раз получался бы один и тот же. Злоумешленник мог бы перехватить такой хеш и использовать для авторизации. Это было бы столь же небезопасно, как передавать пароль в открытом виде.
Если использовать nonce, MD5 каждый раз берется от новой строки и получается разным. Поэтому даже перехватив хеш, злоумышленник скорее всего не сможет его использовать для авторизации.
Кстати, обратите внимание, что новый запрос на регистрацию имеет CSeq на единицу больше:
Сервер также комбинирует nonce с паролем Ивана и получает MD5-хеш. После этого он сравнивает свой хеш с хешем, полученным от Ивана. Если они совпадают, то сервер присылает 200 ОК. Обратите внимание на то, что в поле Contact добавился параметр expires. В данном случае регистрация будет храниться в базе сервера в течение 3600 секунд или одного часа:
Если Иван хочет продлить регистрацию, то он должен отправить еще один REGISTER в течение этого часа.
Что делать, если Иван использует сразу несколько устройств с поддержкой SIP? Все очень просто – необходимо отправить запрос на регистрацию с каждого из них.
После того, как в базе данного сервера регистрации появится соответствующая запись, Proxy-сервер сможет перенаправлять запросы на SIP-клиенты Ивана.
Bonus для тех, кому интересно
Вы могли заметить, что, в ответ на запрос регистрации, сервер присылает ответ, содержащий To-tag:
Понятно, что при установке диалога данный tag помогает избежать повторного получения одного и того же сообщения. Для этого существует правило: если сообщение не содержит To-tag и UAS уже получал сообщение с таким же CSeq, From-tag и Call-ID, то сообщение отбрасывается. Для чего же нужен To-tag, если мы не устанавливаем диалог с сервером регистрации. Лучший ответ, который я смог найти — в RFC 3261 написано, что ответ 200 ОК, приходящий на запрос без To-tag должен содержать To-tag. То есть, это ни для чего не нужно, но так принято.
Надеюсь, что работа протокола SIP, после прочтения статьи, стала для вас более понятной. Буду рад вашим комментариям.