【问题标题】:How to configure freeSWITCH for a docker container inside boot2docker?如何为 boot2docker 中的 docker 容器配置 freeSWITCH?
【发布时间】:2015-01-31 23:49:27
【问题描述】:

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

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

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

我设法用软电话连接到 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 在 LAN 上的 IP 地址(如 200 OK 数据包的 VIA 所示)

192.168.59.103 是 boot2docker 虚拟机

192.168.59.3 是我在 boot2docker 虚拟网络上的 Mac

172.17.0.xxx 是 FS 服务器在 Docker 网络上的 IP 地址(这个 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-sip-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

我已将端口 16384 设置为 16484 UDP 用于 RTP 流量,5060、5070、5080 UDP 和 TCP 用于 SIP,在 FS 和容器中。

回声测试表明音频是双向流动的。

知道发生了什么以及如何解决吗?

【问题讨论】:

  • 您使用的是开箱即​​用的 vanilla sip 配置文件配置吗?外部配置文件配置为侦听端口 5080,尝试调用它。如果您调用端口 5060,那么您将被路由到未设置为执行 NAT 的内部配置文件。联系方式:<5000>

标签: docker freeswitch boot2docker


【解决方案1】:

我在安装 FreeSwitch 时遇到了类似的问题,我通过将交换机配置为不断 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。

【讨论】:

    【解决方案2】:

    好的,这是更新。

    原来问题是因为 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

    这样我可以引用变量来配置相关的 Sofia 配置文件:https://github.com/Coaxial/mushimushi/blob/a29ae537314e89bc7f9808c2bd7fdb4917eafa04/lib/freeswitch_conf/autoload_configs/sofia.conf.xml#L29-L32

    这在 boot2docker 中运行时有效,但尚未在“vanilla”docker 中进行实战测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 2021-07-03
      • 2014-12-12
      • 2014-08-21
      相关资源
      最近更新 更多