如何为boot2docker内的docker容器configurationfreeSWITCH?

我正在尝试设置运行freeSWITCH的Docker容器,以便我可以将其部署到Debian服务器上。

为了开发,我使用在boot2docker内运行freeSWITCH容器的Mac。

我需要容器在这两个环境中工作。

我设法通过软电话连接到FS服务器并拨打电话,但在32秒后,电话会下降。

freeswitch@internal> version FreeSWITCH Version 1.4.15-1~64bit (-1 64bit) 

这是FS发送的SIP 200 OK数据包,

 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:1000@192.168.59.103>;tag=tNpJHmkYg0ke5GYyvIhkdBSIMM.ujzXE To: <sip:5000@192.168.59.103>;tag=6N3793jeayeUe Call-ID: 4wWTcxr9Q4OqlgT2Fs-8SeOkLhVYXTLb CSeq: 10007 INVITE Contact: <sip:5000@172.17.0.6: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:5000@192.168.59.103>;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:29716085@192.168.59.3:49822 | BYE sip:29716085@192.168.59.3:49822 SIP/2.0 Via: SIP/2.0/UDP 172.17.0.6;rport;branch=z9hG4bK0m429X0ac150r Max-Forwards: 70 From: <sip:5000@192.168.59.103>;tag=6N3793jeayeUe To: "1000" <sip:1000@192.168.59.103>;tag=tNpJHmkYg0ke5GYyvIhkdBSIMM.ujzXE Call-ID: 4wWTcxr9Q4OqlgT2Fs-8SeOkLhVYXTLb CSeq: 71037748 BYE Contact: <sip:5000@172.17.0.6: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是我的Mac在局域网上的IP地址(如200 OK包的VIA所示)

boot2docker虚拟机是192.168.59.103

我的Mac在boot2docker虚拟networking上是192.168.59.3

172.17.0.xxx是Dockernetworking上FS服务器的IP地址(这个IP发生了变化,这取决于之前运行了多less个容器)

这是我对我的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:

 freeswitch@internal> eval ${external_rtp_ip} 192.168.59.103 freeswitch@internal> eval ${external_sip_ip} 192.168.59.103 freeswitch@internal> eval ${ext-rtp-ip} -ERR no reply freeswitch@internal> eval ${ext-sip-ip} -ERR no reply 

我已经为FS和容器中的RTPstream量设置了端口16384到16484 UDP,SIP设置了5060,5070,5080 UDP和TCP。

回声testing显示audiostream动双向。

任何想法发生了什么,以及如何解决?

我的FreeSwitch安装也有类似的问题,我通过configuration交换机不断ping通注册的软电话来解决这个问题,以保持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。

好的,这是一个更新。

事实certificate,问题是因为FS无法正确检测到它的IP,并且它发回的数据包包含错误的IP。

我想出了这个脚本作为我的容器启动序列的一部分: https : //github.com/Coaxial/mushimushi/blob/a29ae537314e89bc7f9808c2bd7fdb4917eafa04/lib/freeswitch_conf/start.sh#L7-L21

然后,我将生成的XML文件包含到一般configuration中: https : //github.com/Coaxial/mushimushi/blob/a29ae537314e89bc7f9808c2bd7fdb4917eafa04/lib/freeswitch_conf/freeswitch.xml#L3

这样我可以引用variables来configuration相关的索非亚configuration文件: https : //github.com/Coaxial/mushimushi/blob/a29ae537314e89bc7f9808c2bd7fdb4917eafa04/lib/freeswitch_conf/autoload_configs/sofia.conf.xml#L29-L32

这在boot2docker中运行,但不是在“香草”docker的战斗testing。