FreeSWITCH跨NAT部署配置详解

目录
  • 引言
  • 配置
    • 1、配置预处理变量
    • 2、配置sip profiles
    • 3、配置媒体端口范围
    • 验证
    • 问题

引言

本文仅讨论FreeSWITCH部署在NAT之后(里面)这种场景,假设私网地址与公网地址有一个确定的映射关系。

这里只涉及mod_sofia(SIP信令及媒体)相关配置,其他模块不在本文讨论之列。

配置

mod_sofia默认提供两个profile,可以理解成是两套配置,最主要的区别是监听端口不一样,其他的区别包括是否启用TLS加密,使用哪个拨号计划等等。这里以internal profile为例。

1、配置预处理变量

FreeSWITCH的惯例是把预处理变量定义在vars.xml文件中,然后再由其他配置文件去引用。这里我们主要关注公网地址以及SIP监听端口。

etc/freeswitch/vars.xml

<include>
  <!-- 注意,X-PRE-PROCESS开头的配置都是预处理配置,有点像是定义全局变量,但是变量的值可以在程序启动时动态获取到 -->
  <!-- 这两个变量必须要设置成公网IP,有3种方法配置公网IP: -->
  <!-- 1、配一个固定的公网IP -->
  <X-PRE-PROCESS cmd="set" data="external_rtp_ip=172.21.221.137"/>
  <X-PRE-PROCESS cmd="set" data="external_sip_ip=172.21.221.137"/>
  <!-- 2、通过公网上的stun服务动态获取 -->
  <X-PRE-PROCESS cmd="stun-set" data="external_rtp_ip=stun:stun.freeswitch.org"/>
  <X-PRE-PROCESS cmd="stun-set" data="external_sip_ip=stun:stun.freeswitch.org"/>
  <!-- 3、通过域名解析动态获取 -->
  <X-PRE-PROCESS cmd="set" data="external_rtp_ip=host:host.server.com"/>
  <X-PRE-PROCESS cmd="set" data="external_sip_ip=host:host.server.com"/>
  <!-- 配置两个profile所监听的SIP端口: -->
  <!-- Internal SIP Profile -->
  <X-PRE-PROCESS cmd="set" data="internal_auth_calls=true"/>
  <X-PRE-PROCESS cmd="set" data="internal_sip_port=5060"/>
  <X-PRE-PROCESS cmd="set" data="internal_tls_port=5061"/>
  <X-PRE-PROCESS cmd="set" data="internal_ssl_enable=false"/>
  <!-- External SIP Profile -->
  <X-PRE-PROCESS cmd="set" data="external_auth_calls=false"/>
  <X-PRE-PROCESS cmd="set" data="external_sip_port=5080"/>
  <X-PRE-PROCESS cmd="set" data="external_tls_port=5081"/>
  <X-PRE-PROCESS cmd="set" data="external_ssl_enable=false"/>
</include>

2、配置sip profiles

这里才是mod_sofia真正会读取的配置。这里以internal profile为例,external同理。

etc/freeswitch/sip_profiles/internal.xml

<profile name="internal">
  <settings>
    <!--
      这里引用vars.xml里面配置的全局变量。注意,要以$${var}的形式引用!
      注意,local_ip_v4这个全局变量是fs_core自动设置的,每分钟更新一次。如果机器有多个IP,需要手动指定一个,详见官方文档:
      https://developer.signalwire.com/freeswitch/Channel-Variables-Catalog/local_ip_v4_16353556/
    -->
    <!-- 当前这个profile所要监听的SIP端口。 -->
    <param name="sip-port" value="$${internal_sip_port}"/>
    <!-- 接收RTP流的端口要绑定在哪个地址上。只能是IP地址,不能是域名! -->
    <param name="rtp-ip" value="$${local_ip_v4}"/>
    <!-- 接收SIP请求的端口要绑定在哪个地址上。同上,只能是IP地址。 -->
    <param name="sip-ip" value="$${local_ip_v4}"/>
    <!-- 对外通告RTP消息时所用的地址。 -->
    <param name="ext-rtp-ip" value="$${external_rtp_ip}"/>
    <!-- SIP报文中Contact header的地址。 -->
    <param name="ext-sip-ip" value="$${external_sip_ip}"/>
  </settings>
</profile>

3、配置媒体端口范围

有些NAT或防火墙只能映射或允许一个范围内的端口,这就需要调整FreeSWITCH接收RTP媒体流所用的端口范围。

注意:FreeSWITCH使用偶数端口接受RTP流,使用奇数端口收发RTCP消息。假如需要承载50路通话,则至少要映射100个端口!

etc/freeswitch/autoload_configs/switch.conf.xml

<configuration name="switch.conf" description="Core Configuration">
  <settings>
    <!-- RTP port range -->
    <param name="rtp-start-port" value="40000"/>
    <param name="rtp-end-port" value="40009"/>
  </settings>
</configuration>

验证

人为改一下ext-rtp-ipext-sip-ip,观察它们的作用:

此时有一个到达internal profile的呼叫,从FreeSWITCH回复的200 OK中可以看到,Contact header中填的是ext-sip-ip,而SDP部分填的是ext-rtp-ip

问题

  • 私网端口号与公网端口号不一样怎么办?比如:私网:5060 <==> 公网:8060
  • 恐怕只能修改代码了。mod_sofia可以支持监听IP与通告IP不一致,但端口不能不一致。即它就只能在SIP报文中通告它自己本地监听的端口。

以上就是FreeSWITCH跨NAT部署配置详解的详细内容,更多关于FreeSWITCH跨NAT部署的资料请关注我们其它相关文章!

(0)

相关推荐

  • freeswitch开源通信 python模块介绍

    目录 1.概述 2.环境 3.安装mod_python模块 4.python脚本 5.配置启动 6.测试 1.概述 freeswitch支持多种语言的业务开发,包括C/C++,java,python,js,lua,Golang等等. freeswitch在使用python做业务开发时,有俩种接入方式,一种是ESL接口,另一种是mod_python模块. python的ESL接口是通过socket套接字与freeswitch进行命令交互,包括发送命令.命令响应和事件回调等,类似于在外部增加一个第三

  • Windows下React Native的Android环境部署及布局示例

    搭建基础环境 JDK(必须,不解释) SDK(建议使用Android Studio,集成SDK以及模拟器) genymotion(如果是使用真机或者Android Studio自带的模拟器,可以选择不装) NVM(node版本控制器,需要node4.0以上版本) 以上配置不是必须,可自行选择适合自己的环境,部分安装过程可能会涉及到翻墙,需要配置代理 配置踩坑记录 genymotion 这里选择genymotion模拟器来讲解,也会提一下Android Studio自带的模拟器的一些注意点,使用真

  • FreeSWITCH跨NAT部署配置详解

    目录 引言 配置 1.配置预处理变量 2.配置sip profiles 3.配置媒体端口范围 验证 问题 引言 本文仅讨论FreeSWITCH部署在NAT之后(里面)这种场景,假设私网地址与公网地址有一个确定的映射关系. 这里只涉及mod_sofia(SIP信令及媒体)相关配置,其他模块不在本文讨论之列. 配置 mod_sofia默认提供两个profile,可以理解成是两套配置,最主要的区别是监听端口不一样,其他的区别包括是否启用TLS加密,使用哪个拨号计划等等.这里以internal prof

  • spark之Standalone模式部署配置详解

    spark运行模式 Spark 有很多种模式,最简单就是单机本地模式,还有单机伪分布式模式,复杂的则运行在集群中,目前能很好的运行在 Yarn和 Mesos 中,当然 Spark 还有自带的 Standalone 模式,对于大多数情况 Standalone 模式就足够了,如果企业已经有 Yarn 或者 Mesos 环境,也是很方便部署的. 1.local(本地模式):常用于本地开发测试,本地还分为local单线程和local-cluster多线程; 2.standalone(集群模式):典型的M

  • Django+Vue跨域环境配置详解

    概述 在使用Django+Vue开发过程中,遇到了很多开发环境相关的问题,比如跨域,比如ajax请求参数等,本篇文章主要记录解决在开发过程中,遇到的一些问题. 跨域不带Cookie 在使用Vue脚手架开发的过程中,会使用Vue脚手架自带的Server进行项目调试,Vue自带的Server支持 hot reloading ,这个特性是非常好用的.但是在开发过程中,因为要与后端交互,所以在请求后端接口的时候,会遇到跨域问题,这个问题在一些职责划分清楚的团队并不存在,因为前端开发人员会才用Mock数据

  • Nginx配置跨域请求Access-Control-Allow-Origin * 详解

    前言 当出现403跨域错误的时候 No 'Access-Control-Allow-Origin' header is present on the requested resource,需要给Nginx服务器配置响应的header参数: 一. 解决方案 只需要在Nginx的配置文件中配置以下参数: location / { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET

  • vue跨域proxy代理配置详解

    目录 引言 例一 例二 总结 引言 相信很多人都用过proxy,这里就不多说proxy的基本使用,这里要说一下很多人使用proxy的一个误区,大家一般都是直接将管官方的例子拿过来,修改一下代理目标直接就是用了,但是代理的路径匹配你真的会用么? 如果你能够认证看完那么我保证你下次再配置代理的时候就能一步就能完成,无需多次npm run serve 先来一个正则热热身待会需要用,看懂了再往下看: 例一 这是我使用express自己搭建的一个超级简单的服务器,代码如下(没有设置允许跨域请求) // 引

  • vue-cli3全面配置详解

    本文介绍了vue-cli3全面配置详解,分享给大家,具体如下: vue-cli3-config 创建项目 配置环境变量 通过在package.json里的scripts配置项中添加--mode xxx来选择不同环境 在项目根目录中新建.env, .env.production, .env.analyz等文件 只有以 VUE_APP_ 开头的变量会被 webpack.DefinePlugin 静态嵌入到客户端侧的包中,代码中可以通过process.env.VUE_APP_BASE_API访问 NO

  • Linux 系统 nginx 服务器安装及负载均衡配置详解

    nginx(engine x) 是一个 高性能 的 HTTP 和 反向代理 服务器.邮件代理服务器以及通用的 TCP/UDP 代理服务器.其特点为轻量级(占用系统资源少).稳定性好.可扩展性(模块化结构).并发能力强.配置简单等. 本文主要介绍在测试环境中通过 nginx 实现基本的 负载均衡 功能. nginx 可以提供 HTTP 服务,包括处理静态文件,支持 SSL 和 TLS SNI.GZIP 网页压缩.虚拟主机.URL 重写等功能,可以搭配 FastCGI.uwsgi 等程序处理动态请求

  • AJAX跨域问题解决方案详解

    目录 1.前言 2.解决方案 2.1 设置响应头 2.2 jsonp 2.2.1 前端代码 2.2.2 后端代码 2.3 使用jQuery封装的jsonp 2.4 代理机制(httpclient) 2.4.1 前端代码 2.4.2 代理Servlet代码 2.4.3 目标Servlet代码 2.4.4 图示 2.5 nginx反向代理 1.前言 跨域简单的说,就是从一个域名的网页去访问另一个域名网页的资源. 通过超链接或者form表单提交或者window.location.href的方式进行跨域

  • vue3 axios 实现自动化api配置详解

    目录 概述 示例 约定 请求 URL 的约定 请求传参的约定 分页列表,请求参数约定 分页列表 响应示例 响应码 code 的约定 请求跨域问题解决方案 全局配置 配置说明coder/config.js 模型配置 1.实现对一个实体进行增.删.改.查.导出.唯一性校验 2.只需要增.删.改.查中得某些操作,可以指定生成你需要的方法 3.自定义方法配置 4.指定请求接口地址前缀 概述 在实践中,我们发现上述的代码重复率非常高,新增和修改都费力,并且是没技术含量的体力活. 但又必须要这样做,不适合以

  • Spring Java-based容器配置详解

    装Java-based的配置 使用 @Import 注解 跟在Spring XML文件中使用<import>元素添加模块化的配置类似,@Import注解允许你加载其他配置类中的@Bean定义: @Configuration public class ConfigA { @Bean public A a() { return new A(); } } @Configuration @Import(ConfigA.class) public class ConfigB { @Bean public

随机推荐