美文网首页
【Freeswitch】【媒体NAT穿越案例三】内网环境强制使用

【Freeswitch】【媒体NAT穿越案例三】内网环境强制使用

作者: 安安爸Chris | 来源:发表于2020-12-17 11:43 被阅读0次

本案例具有一定的特殊性

问题描述

FS部署在一个网络中,用户终端在另外一个内网中,两边的媒体SDP都带着私有IP,导致媒体不通

网络拓扑图

案例三拓扑

问题分析

FS是分配有公网IP的,在external.xml中有配置公网IP,配置如下

external.xml
FS在媒体协商时,一般会使用ext-rtp-ip作为SDP中的IP地址来协商。

但是在这个案例中,无论怎么设置,都不起作用。

通过源码分析

invite初始化的代码在 sofia_glue_do_invite(sofia_glue.c)

switch_core_media_choose_port

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)逻辑

switch_core_media_check_nat
  • 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

localnet.auto

配置文件中的读取

配置文件中的读取
从这段代码来看,如果想让NAT检查通过,那么就配置为“none”

解决方案

配置修改

local-network-acl值配置为none

local-network-acl

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

相关文章

网友评论

      本文标题:【Freeswitch】【媒体NAT穿越案例三】内网环境强制使用

      本文链接:https://www.haomeiwen.com/subject/oroagktx.html