大致网络示意和终端号码:
客户端侧: 终端号码(1019)终端IP(192.168.1.15)+ 网关(192.168.1.1) + 路由器公网IP(动态地址)
服务器侧: 防火墙(181.92.2.7)+ 负载(10.40.50.20X)+ FreeSWITCH(10.10.10.190)+ 终端号码(27909,本局域网内用户) 1. 公网的数据包怎么到达freeswitch? 需要在防火墙上配置转发规则:信令转发:181.92.2.7:5060 -> 10.10.10.190:5060媒体端口转发:181.92.2.7:20000-30000 -> 10.10.10.190:20000-30000
2. FreeSWITCH配置公网地址
配置文件:sip_profiles/internal.xml 配置项:ext-sip-ip和ext-rtp-ip外部的地址有以下几种配置方式:auto-nat //默认配置,由于我的外网路由器没有开启UPNP或者NAT-PMP协议,所以默认的配置不生效。auto //使用内网地址,肯定不行。stun:stun.freeswitch.org //能得到外网地址,但是不是实际使用的地址(可能是我的环境同时配置多个公网IP有关系),也PASS了。181.92.2.7 //直接写上外部的服务IP,不灵活,但是可以用。host:host.server.com //由于我本身就使用了域名,所以这个最合适。
最后配置成这个样子
这个配置有什么用?
当FreeSWITCH识别出来呼叫的终端位于nat后面时,在构造SDP消息时,会“聪明”的加上ext-rtp-ip的配置值。
所以想和公网的终端通话,必须配置外部IP为公网的地址。 3. 客户端的公网地址 测试终端,软电话(linphone)。 本机地址:192.168.1.15,公网地址:动态未知 未知? 假设我这台装有软电话的笔记本在家里打电话,是一个公网地址。我拿到公司打电话,显然是另外一个公网地址。 4. 客户端的注册 找一个能ping通181.92.2.7的网络。填写注册地址cc-voip.xxx.com(注意:这是通过域名的方式,这涉及一个域用户的配置,可以单开一篇) 注册成功!!! 注册消息是怎么走的? REGISTER (1019)192.168.1.15 -> 192.168.1.1(网关) -> 动态公网IP ->(公网路由节点)-> 181.92.2.7:5060 -> 10.40.50.203:15535 -> 10.10.10.190:5060 200 OK (1019)192.168.1.15 <- 192.168.1.1(网关) <- 动态公网IP <-(公网路由节点)<- 181.92.2.7:5060 <- 10.40.50.203:15535 <- 10.10.10.190:5060 5. 打电话试试? 入向拨号: 1019 -> 27909,振铃了,接通。看上去很美妙。但是没声音。 出向拨号: 27909 -> 1019,偶尔通,大部分时间不通。再进一步测试观察,哦,如果这个客户端刚注册上来,不超过1分钟,拨通的概率还是很大的。超过2分钟,就打不通了。当然了,即使拨通也没声音。 为什么出向拨号不通? 这就涉及到了一个常听的术语:UDP打洞。 客户端刚注册的时候,中途经过的各个转发设备都会临时启用一个新的端口(”打洞“)转发这条注册消息,并且保持这个新的端口一段时间(一般是120秒,各设备可以自己设定)。 保持的这段时间,所有转发地址的映射关系也存在。 例如上图注册消息路由示意图,出向拨号,FS记录1019的下一跳地址是10.40.50.203:15535;203记录15535端口映射的下一跳地址是181.92.2.7:5060,以此类推,直到INVITE消息送到192.168.1.15的地址上。 可是一旦过了端口保持的时期,这个15535端口就被释放掉了。但是FS记录的下一跳不变,悲剧了,再也无法出向拨号了。 这里又引出了另一个常用的术语:保活。 原理很简单,既然打洞只能存续一小段时间,那我就在这个洞消失之前,再发一条新的消息,刷新一下端口记录。比如120秒后释放,那我每隔100秒发一个注册消息,理论上这些个洞就会一直存在了。 这样就可以随时出向拨号了。 6. 没有声音怎么办? 先看看原因,抓包看SDP,啊哦,1019带的SDP地址竟然是192.168.1.15,FS往这个地址发语音包,1019肯定是收不到了。 这就需要使用各种NAT服务器了。 比如STUN、TURN、ICE(大致原理就是1019先去这些服务器查询一下自己的动态的公网IP,然后使用这些公网IP。具体细节自行百度) 比如我的1019客户端使用ICE服务器。再拨打一次电话,振铃了,接通,哎呀,能听到声音了!!! 再抓个包看SDP,1019带的SDP除了192.168.1.15,还带了一个公网转发地址,FS往公网地址发RTP包,这个公网再转发一下,没问题了啊。![](https://images2018.cnblogs.com/blog/725532/201804/725532-20180412204113541-1336799604.png)