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

2020-12-17  本文已影响0人  安安爸Chris

本案例具有一定的特殊性

问题描述

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

在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)

上一篇下一篇

猜你喜欢

热点阅读