FreeSWITCH跨NAT部署配置详解

 更新时间:2023年02月15日 14:50:45   作者:zhanwang  
这篇文章主要为大家介绍了FreeSWITCH跨NAT部署配置详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

本文仅讨论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部署的资料请关注脚本之家其它相关文章!

相关文章

  • java实现打砖块游戏算法

    java实现打砖块游戏算法

    这篇文章主要为大家详细介绍了java实现打砖块游戏算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Java实现SMS短信通发送手机验证码案例讲解

    Java实现SMS短信通发送手机验证码案例讲解

    这篇文章主要介绍了Java实现SMS短信通发送手机验证码案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • SpringBoot中API接口参数获取方式小结

    SpringBoot中API接口参数获取方式小结

    在Spring Boot中,API接口参数可以通过多种方式获取,具体取决于你定义的API接口参数类型(如路径参数、查询参数、请求体参数、请求头等),本文给大家就介绍了一些常见的参数获取方式,需要的朋友可以参考下
    2024-06-06
  • 详解Spring cloud使用Ribbon进行Restful请求

    详解Spring cloud使用Ribbon进行Restful请求

    这篇文章主要介绍了详解Spring cloud使用Ribbon进行Restful请求,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 解析iReport自定义行数分页的操作方法

    解析iReport自定义行数分页的操作方法

    ireport默认都是自动分页数据超出页面长度就会自动分到下一页,但有时候业务需要一页只显示固定几行这时候就需要自定义条数了。下面看具体操作吧
    2021-10-10
  • BeanUtils.copyProperties使用总结以及注意事项说明

    BeanUtils.copyProperties使用总结以及注意事项说明

    这篇文章主要介绍了BeanUtils.copyProperties使用总结以及注意事项说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • spring的几个重要类和接口(详解)

    spring的几个重要类和接口(详解)

    下面小编就为大家带来一篇spring的几个重要类和接口(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • 深入理解Spring Boot属性配置文件

    深入理解Spring Boot属性配置文件

    这篇文章主要给大家深入的介绍了关于Spring Boot属性配置文件的相关资料,文中介绍的很详细,相信对大家具有一定的参考借鉴价值,需要的朋友们下面来一起看看吧。
    2017-02-02
  • SpringBoot中的Redis 缓存问题及操作方法

    SpringBoot中的Redis 缓存问题及操作方法

    这篇文章主要介绍了SpringBoot中的Redis 缓存,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • Java并发系列之AbstractQueuedSynchronizer源码分析(独占模式)

    Java并发系列之AbstractQueuedSynchronizer源码分析(独占模式)

    这篇文章主要为大家详细介绍了Java并发系列之AbstractQueuedSynchronizer源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02

最新评论