Interactive Connectivity Establishment (ICE) в Asterisk

Обзор

Если сервер Asterisk (или любой другой VoIP сервер) напрямую доступен из сети Интернет и вызывается SIP софтфоном или устройством, вполне вероятно все будет работать «из коробки».

Тоже самое и с конфигурацией, когда сервер и телефоны находятся в локальной сети.

Если же хост А и хост В находятся за NAT, а и тот, и другой нуждаются в связи друг с другом в режиме реального времени, все может сильно осложнится.

Если сети крайне просты, относительно статичны и NAT доступен для простой настройки, эту проблему можно успешно разрешить пробросом портов или включением режима DMZ.

Однако, если появляются, хотя бы, небольшие сложности, прохождение RTP трафика может стать весьма проблематичным. (это точно, блин)

Расхожие примеры этого: двойной NAT, динамические IP адреса, файерволлы в высоким уровнем запретов, сетевые узлы модифицирующие sip запросы.
Зачастую доступ к конфигурации мешающих прохождению трафика устройств, попросту невозможен. (да, что мне вам рассказывать…)

Проблема является очень распространенной и каждый из VoIP сообщества сталкивался с проблемами, требующими больших трудозатрат для их решения.

Interactive Connectivity Establishment протокол, или ICE, является относительно новым и перспективным решением подобных проблем.

Поддержка ICE добавлена в Asterisk c версии 11.

ICE это стандартизированный механизм для управления медиа потоками в режиме реального времени, между программными агентами запущенными за NAT.

Установление соединений через NAT называют «прохождением NAT».

Для достижения этого протокол ICE использует следующие механизмы:

  • серии тестов для определения внутренних и внешних доступных ip адресов;
  • стандартные формы для уточнения приоритетных iP адресов в SDP, которые могут быть использованы для достижения программных агентов;
  • серии операций для подтверждения потенциальных кандидатов и сравнение с доступными локальными кандидатами, для окончательного установления соединений.
  • стандартная форма для предоставления ответа с указанием проверенных кандидатов;
  • и серия правил выбора той или иной пары кандидатов для соединения, которые, в конечном счете будут использованы.

Совместно с использованием STUN или TURN сервера, ICE найдет способ пройти NAT, если только способ существует.

Настройка ICE поддержки в Asterisk

Включение ICE поддержки

Поддержка ICE в Asterisk включена глобально по умолчанию,
однако ВЫКЛЮЧЕНА в настойках chan_sip и включается в секции [general] глобально, или в настройках пиров для конкретного канала, в конфигурационном файле «sip.conf».

 icesupport=yes

Как уже говорилось ICE нуждается в подключении STUN и/или TURN серверов для подбора возможных кандидатов However, as ICE needs a STUN and/or TURN server to gather usable candidates, они обязательно должны быть настроены, чтобы все заработало. Т.к. ICE это RTP механизм, настройка производится в файле «rtp.conf». Настройки будут распространяться на все связи с RTP, т.к. функции расположены в общем [general] разделе Для указания STUN сервера назначьте опцию 'stunaddr' c именем хоста STUN сервера.
Например:

stunaddr=stun.hostname

Список публичных STUN серверов можно найти на VoIP-Info's STUN странице.

TURN сервер требуется для кандидатов-ретрансляторов и настраивается через 'turnaddr' свойство. TURN сервер часто требует аутентификации и опционально настройки могут содержать username и password.

turnaddr=4everyseason.turn.org

 turnusername=relayme 
 turnpassword=please 

'Turnport' используется, если TURN сервер запущен на нестандартном порту. Если пропущено, Asterisk использует стандартный порт: 3478. Успешная конфигурация визуально подтверждается SIP дебагом (sip set debug on).

0:v=0
1:o=root 803380323 803380323 IN IP4 123.123.123.1
2:s=Asterisk PBX 12.1.1
3:c=IN IP4 123.123.123.1
4:t=0 0
5:m=audio 12444 RTP/AVP 0 8 101
6:a=rtpmap:0 PCMU/8000
7:a=rtpmap:8 PCMA/8000
8:a=rtpmap:101 telephone-event/8000
9:a=fmtp:101 0-16
10:a=ptime:20
11:a=maxptime:150
12:a=ice-ufrag:2ab7c3406739799a09fd6eca5bdb9a11
13:a=ice-pwd:15aa3c9900949e9b3991cbaa4b283096
14:a=candidate:Hc0a800f8 1 UDP 2130706431 192.168.0.248 12444 typ host
15:a=candidate:Sc390f435 1 UDP 1694498815 123.123.123.1 12444 typ srflx
16:a=candidate:Hc0a800f8 2 UDP 2130706430 192.168.0.248 12445 typ host
17:a=candidate:Sc390f435 2 UDP 1694498814 123.123.123.1 12446 typ srflx
18:a=sendrecv

В строках с 12-й по 17-ю содержится ICE инфа. Строки 12 и 13 генерируются автоматически и используются для идентификации конечных точек в сессии ICE.
Строки с 14-й по 17-ю содержат примеры кандидатов.
Строки 15-я и 17-я являются примером обратного адреса сервера кандидата(внешний адрес маршрутизатора), на что указывает «type srflx» маркер в конце строки.
Обратный адрес сервера получается через STUN и указывает на внешний файервол.
Здесь их два, потому что один для RTP, а второй для RTCP пакетов.
На это указывает id , 1 для RTP и 2 для RTCP во втором поле строки кандидатов.
Строки кандидатов отмечены в конце как «typ host» указывают на кандидатов из локальной сети (локальный адрес Asterisk).

stun debug
 stun set debug on
STUN Debugging Enabled
STUN Packet, msg Binding Response (0101), length: 68
Found STUN Attribute Mapped Address (0001), length 8
Ignoring STUN attribute Mapped Address (0001), length 8
Found STUN Attribute Source Address (0004), length 8
Ignoring STUN attribute Source Address (0004), length 8
Found STUN Attribute Changed Address (0005), length 8
Ignoring STUN attribute Changed Address (0005), length 8
Found STUN Attribute Non-RFC3489 Attribute (8020), length 8
Ignoring STUN attribute Non-RFC3489 Attribute (8020), length 8
Found STUN Attribute Non-RFC3489 Attribute (8022), length 16
Ignoring STUN attribute Non-RFC3489 Attribute (8022), length 16
Dunno what to do with STUN message 0101 (Binding Response)
  == Using SIP RTP TOS bits 184
  == Using SIP RTP CoS mark 5
Отключение ICE

Генерацию списков SDP для ICE можно выключить:

 icesupport=no

в [general] разделе «sip.conf» или в настройках пиров. Т.к. ICE управляет RTP потоками, ICE элементы настройки указываются в «rtp.conf» файле. Для выключения поддержки ICE RTP функций, добавьте ту же команду в «rtp.conf».

Настройка Asterisk

  • asterisk/asterisk_ice.txt
  • Последние изменения: 2018/09/22