2015-01-31 4 views
0

Я пытаюсь настроить контейнер Docker, на котором работает freeSWITCH, поэтому я могу развернуть его на сервере Debian.Как настроить freeSWITCH для контейнера докеров в boot2docker?

Для разработки я использую Mac, запускающий контейнер freeSWITCH в boot2docker.

Мне нужен контейнер для работы в обеих этих средах.

Мне удается подключиться к серверу FS с помощью софтфона и поместить вызов, но через 32 секунды звонок падает.

[email protected]> version 
FreeSWITCH Version 1.4.15-1~64bit (-1 64bit) 

Это SIP 200 OK пакет, FS отправляет и ожидает ответ на:

14 0.029449000 192.168.59.103 192.168.59.3 SIP/SDP 1312 Status: 200 OK | 

SIP/2.0 200 OK 
Via: SIP/2.0/UDP 192.168.1.141:49822;rport=49822;branch=z9hG4bKPjFf3iaNQ0tDY1fySiz1zGSEXSVFpZeE2b;received=192.168.59.3 
From: "1000" <sip:[email protected]>;tag=tNpJHmkYg0ke5GYyvIhkdBSIMM.ujzXE 
To: <sip:[email protected]>;tag=6N3793jeayeUe 
Call-ID: 4wWTcxr9Q4OqlgT2Fs-8SeOkLhVYXTLb 
CSeq: 10007 INVITE 
Contact: <sip:[email protected]:5060;transport=udp> 
User-Agent: FreeSWITCH-mod_sofia/1.4.15-1~64bit 
Accept: application/sdp 
Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, INFO, UPDATE, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE 
Supported: timer, path, replaces 
Allow-Events: talk, hold, conference, presence, as-feature-event, dialog, line-seize, call-info, sla, include-session-description, presence.winfo, message-summary, refer 
Content-Type: application/sdp 
Content-Disposition: session 
Content-Length: 333 
Remote-Party-ID: "5000" <sip:[email protected]>;party=calling;privacy=off;screen=no 

v=0 
o=FreeSWITCH 1422731206 1422731207 IN IP4 172.17.0.6 
s=FreeSWITCH 
c=IN IP4 172.17.0.6 
t=0 0 
m=audio 16386 RTP/SAVP 9 101 
a=rtpmap:9 G722/8000 
a=rtpmap:101 telephone-event/8000 
a=fmtp:101 0-16 
a=ptime:20 
a=rtcp:16387 IN IP4 172.17.0.6 
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:/NTeSA7Od0+1Uo1/3wIclZwEiKJ+R4Mh8gyTx+5O 

Тогда это происходит:

1745 32.031059000 192.168.59.103 192.168.59.3 SIP 664 Request: BYE sip:[email protected]:49822 | 

BYE sip:[email protected]:49822 SIP/2.0 
Via: SIP/2.0/UDP 172.17.0.6;rport;branch=z9hG4bK0m429X0ac150r 
Max-Forwards: 70 
From: <sip:[email protected]>;tag=6N3793jeayeUe 
To: "1000" <sip:[email protected]>;tag=tNpJHmkYg0ke5GYyvIhkdBSIMM.ujzXE 
Call-ID: 4wWTcxr9Q4OqlgT2Fs-8SeOkLhVYXTLb 
CSeq: 71037748 BYE 
Contact: <sip:[email protected]:5060;transport=udp> 
User-Agent: FreeSWITCH-mod_sofia/1.4.15-1~64bit 
Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, INFO, UPDATE, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE 
Supported: timer, path, replaces 
Reason: SIP;cause=408;text="ACK Timeout" 
Content-Length: 0 

Я угадывание не FS никогда получает ответ из софтфона из-за различных уровней NAT и отбрасывает вызов, предполагая, что он не подключен.

192.168.1.141 мой IP-адрес компьютера Mac в локальной сети (как показано на VIA для пакета 200 OK)

192.168.59.103 является boot2docker В.М.

192.168.59.3 мой Mac на boot2docker виртуальной сеть

172.17.0.xxx является IP-адресом сервера FS по сети Docker (это IP меняется, в зависимости от того, сколько контейнеров/были запущены ранее)

Это то, что я имею на моем sip_profiles /internal.xml

<param name="rtp-ip" value="$${local_ip_v4}"/> 
<!-- ip address to bind to, DO NOT USE HOSTNAMES ONLY IP ADDRESSES --> 
<param name="sip-ip" value="$${local_ip_v4}"/> 
<param name="hold-music" value="$${hold_music}"/> 
<param name="apply-nat-acl" value="nat.auto"/> 

<!-- Docker NAT magic --> 
<param name="ext-rtp-ip" value="$${external_sip_ip}"/> 
<param name="ext-rtp-ip" value="$${external_rtp_ip}"/> 

И в моем vars.xml

<X-PRE-PROCESS cmd="set" data="external_rtp_ip=192.168.59.103"/> 
    <X-PRE-PROCESS cmd="set" data="external_sip_ip=192.168.59.103"/> 

От fs_cli:

[email protected]> eval ${external_rtp_ip} 
192.168.59.103 
[email protected]> eval ${external_sip_ip} 
192.168.59.103 
[email protected]> eval ${ext-rtp-ip} 
-ERR no reply 

[email protected]> eval ${ext-sip-ip} 
-ERR no reply 

Я устанавливал порты 16384 до 16484 UDP для RTP-трафика, 5060, 5070, 5080 UDP & TCP для SIP, как в FS, так и в контейнере.

Эхо-тест показывает, что звук протекает в обоих направлениях.

Любая идея, что происходит и как исправить?

+0

Вы используете конфигурацию профиля профиля ванильного салона? внешний профиль настроен на прослушивание на порту 5080, попробуйте позвонить ему. Если вы вызываете порт 5060, то вы будете перенаправлены во внутренний профиль, который не настроен для NAT. Контакт: <- этот адрес недоступен из-за пределов контейнера Docker. Звонки, зависающие через 30 секунд, являются классической проблемой NAT. – DanB

+0

Спасибо за ответ. Я решил это, написав небольшой скрипт bash, который попытается выполнить ping-загрузку 2 Docker vm в 192.168.59.103. Если ping получает понг, то ext-rtp-ip и ext-sip-ip устанавливаются на IP-адрес boot2docker, в противном случае он устанавливается как stun: stun.freeswitch.org. Это работает для boot2docker, но я не уверен, как это будет работать без boot2docker. Консультация приветствуется. – springloaded

ответ

1

У меня была аналогичная проблема с моей установкой FreeSwitch, и я решил ее, настроив коммутатор на постоянное прослушивание зарегистрированных программных телефонов, чтобы открыть каналы брандмауэра NAT. Вот настройки, которые сделали это для меня:

  <param name="nat-options-ping" value="true"/> 
      <param name="all-reg-options-ping" value="true"/> 

      <!-- One successful options ping is enough to verify that a phone is reachable --> 
      <param name="sip-user-ping-min" value="1"/> 
      <!-- Three pings need to be lost to consider the phone disconnected --> 
      <param name="sip-user-ping-max" value="4"/> 

      <param name="unregister-on-options-fail" value="true"/> 

      <!-- Freeswitch is coded to send 
      pings at variable intervals with the mean value determined by the 
      variable below and a normal distribution with a deviation of half the 
      interval value. --> 
      <param name="ping-mean-interval" value="15"/> 

Они идут к sip_profiles/internal.xml.

0

Хорошо, так что это обновление.

Оказалось, что проблема не в том, что FS не смог правильно определить свой IP-адрес, а пакеты, которые он отправлял обратно, были связаны с неправильным IP-адресом.

Я придумал этот сценарий как часть моего контейнера последовательности загрузки: https://github.com/Coaxial/mushimushi/blob/a29ae537314e89bc7f9808c2bd7fdb4917eafa04/lib/freeswitch_conf/start.sh#L7-L21

я включить полученный XML-файл в общей конфигурации: https://github.com/Coaxial/mushimushi/blob/a29ae537314e89bc7f9808c2bd7fdb4917eafa04/lib/freeswitch_conf/freeswitch.xml#L3

Таким образом, я могу ссылаться на переменные для настройки соответствующие профили Софии: https://github.com/Coaxial/mushimushi/blob/a29ae537314e89bc7f9808c2bd7fdb4917eafa04/lib/freeswitch_conf/autoload_configs/sofia.conf.xml#L29-L32

Это работает при запуске в boot2docker, но пока не тестировалось в докере «ванили».