本案例具有一定的特殊性
问题描述
FS部署在一个网络中,用户终端在另外一个内网中,两边的媒体SDP都带着私有IP,导致媒体不通
网络拓扑图
案例三拓扑问题分析
FS是分配有公网IP的,在external.xml中有配置公网IP,配置如下
FS在媒体协商时,一般会使用
ext-rtp-ip
作为SDP中的IP地址来协商。
但是在这个案例中,无论怎么设置,都不起作用。
通过源码分析
invite初始化的代码在 sofia_glue_do_invite(sofia_glue.c)
switch_core_media_choose_port函数,
IP设置逻辑在每个分支出口增加日志打印,分析发现,如果remote_ipNAT地址,那么除非通过
rtp_adv_%s_ip
指定c参数传过来的ip,否则都使用rtpip,这个地址为内网地址。
ok,接下来看一下switch_core_media_check_nat(switch_core_media.c)逻辑
-
extsipip就是我们设置的公网地址,这个肯定是有的。
-
"loopback.auto"定义在switch_core.c,注意他是hardcode的,除了loopback.auto,还是nat.auto,any_v4.auto,any_v6.auto,wan_v4.auto,wan_v6.auto,wan.auto,rfc1918.auto,rfc6598.auto等。
"loopback.auto"
这个肯定也是不会匹配到的
-
最后一项 profile->local_network
它是哪里来的呢??
在sofia.c中,有默认值定义
sofia.c
"localnet.auto"是本地网络,同样定义在switch_core.c
配置文件中的读取
从这段代码来看,如果想让NAT检查通过,那么就配置为“none”
解决方案
配置修改
local-network-acl值配置为none
freeswitch内部定义可用常量
出了none,这里有一些内部定义常量可以使用 (定义在switch_core.c)
- localnet.auto (默认值)
- loopback.auto
- nat.auto
- any_v4.auto
- any_v6.auto
- wan_v4.auto
- wan_v6.auto
- wan.auto
- rfc1918.auto
- rfc6598.auto
网友评论