当前位置: 首页 > news >正文

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部署的资料请关注其它相关文章!

相关文章:

FreeSWITCH跨NAT部署配置详解

本文仅讨论FreeSWITCH部署在NAT之后&#xff08;里面&#xff09;这种场景&#xff0c;假设私网地址与公网地址有一个确定的映射关系。这里只涉及mod_sofia&#xff08;SIP信令及媒体&#xff09;相关配置&#xff0c;其他模块不在本文讨论之列。配置mod_sofia默认提供两个prof…...

【精选论文 | Capon算法与MUSIC算法性能的比较与分析】

本文编辑&#xff1a;调皮哥的小助理 【正文】 首先说结论&#xff1a; 当信噪比&#xff08;SNR&#xff09;足够大时&#xff0c;Capon算法和MUSIC算法的空间谱非常相似&#xff0c;因此在SNR比较大时它们的性能几乎一样&#xff0c;当不同信号源的入射角度比较接近时&…...

卫星、无人机平台的多光谱数据在地质、土壤调查和农业等需要用什么?

近年来&#xff0c;Python编程语言受到越来越多科研人员的喜爱&#xff0c;在多个编程语言排行榜中持续夺冠。同时&#xff0c;伴随着深度学习的快速发展&#xff0c;人工智能技术在各个领域中的应用越来越广泛。机器学习是人工智能的基础&#xff0c;因此&#xff0c;掌握常用…...

30个题型+代码(冲刺2023蓝桥杯)

愿意的可以跟我一起刷&#xff0c;每个类型做1~5题 &#xff0c;4月前还可以回来系统复习 2月13日 ~ 3月28日&#xff0c;一共32天 一个月时间&#xff0c;0基础省三 --> 省二&#xff1b;基础好点的&#xff0c;省二 --> 省一 目录 &#x1f33c;前言 &#x1f33c…...

快速且有效减小代码包的方法

前言当我们在发布一些APP或者小程序等比较小的程序时候&#xff0c;常常会对其主包大小进行一定的规定&#xff0c;若超过推荐的主包大小则性能会被大大影响&#xff0c;或者再严重一点就不给你过审。如微信小程序中也对主包有一定的大小要求。对此一些比较复杂的小程序就需要考…...

基于matlab评估星载合成孔径雷达性能

一、前言本示例展示了如何评估星载合成孔径雷达 &#xff08;SAR&#xff09; 的性能&#xff0c;并将理论极限与 SAR 系统的可实现要求进行比较。SAR利用雷达天线在目标区域上的运动来提供更精细的方位角分辨率。给定雷达的主要参数&#xff08;例如工作频率、天线尺寸和带宽&…...

Linux_基本指令

新的专栏Linux入门来啦&#xff01;欢迎各位大佬补充指正&#xff01;&#xff01; Linux_基本指令导入文件绝对路径与相对路径隐藏的文件指令ls查看stat查看文件属性cd进入路径mkdir创建目录touch创建文件rm删除man查询手册cp复制mv移动cat查看文件morelessheadtail时间相关的…...

Keras深度学习实战——使用深度Q学习进行SpaceInvaders游戏

Keras深度学习实战——使用深度Q学习进行SpaceInvaders游戏 0. 前言1. 问题与模型分析2. 使用深度 Q 学习进行 SpaceInvaders 游戏相关链接0. 前言 在《深度Q学习算法详解》一节中,我们使用了深度 Q 学习来进行 Cart-Pole 游戏。在本节中,我们将利用深度Q学习来玩“太空侵略…...

从事架构师岗位快2年了,聊一聊我对架构的一些感受和看法

从事架构师岗位快2年了&#xff0c;聊一聊我和ChatGPT对架构的一些感受和看法 职位不分高低&#xff0c;但求每天都能有新的进步&#xff0c;永远向着更高的目标前进。 文章目录踏上新的征程架构是什么&#xff1f;架构师到底是干什么的&#xff1f;你的终极目标又是什么&#…...

零基础机器学习做游戏辅助第十二课--原神自动钓鱼(二)

一、模拟训练环境 上节课我们已经能够判断人物的钓鱼状态,接下来我们就需要对鱼儿上钩后的那个受力框进行DQN训练。 方案有两个: 使用卷积神经网络直接输入图像对网络进行训练。使用普通网络,自己写代码模拟出图像中三个点的动态并把值给神经网络进行训练。这里我们选用第二…...

MapReduce paper(2004)-阅读笔记

文章目录前言摘要&#xff08;Abstract)一、引言( Introduction)二、编程模型&#xff08;Programming Model&#xff09;三、实现&#xff08;Implementation&#xff09;3.1、执行概述&#xff08;Execution Overview&#xff09;3.2、主节点数据结构&#xff08;Master Data…...

【蒸滴C】C语言指针入门很难?看这一篇就够了

目录 一、前言 二、指针是什么 小结&#xff1a; 三、指针变量是什么 小结&#xff1a; 四、指针在32位机器和64位机器中的差别 32位机器&#xff1a; 64位机器: 小结&#xff1a; 五、指针和指针类型 &#xff08;1&#xff09;指针的意义 &#xff08;2&#xff…...

C++11新的类功能

文章首发公众号&#xff1a;iDoitnow 1. 特殊的成员函数 C11在原有的4个特殊成员函数&#xff08;默认构造函数、复制构造函数、复制赋值运算符和析构函数&#xff09;的基础上新增了移动构造函数和移动赋值运算符。这些特殊成员函数在各种情况下是会通过编译器自动提供的。 …...

Laravel创建定时任务

创建一个任务&#xff0c;创建成功后会在App/Console/Commands中生成一个以Test命名的文件&#xff0c;我们可以在这里面写我们的任务指令。 php artisan make:command Test 运行这个定时任务 run 是运行一次&#xff0c;我们可以用来测试是否成功&#xff0c;work是一直运行&a…...

SaveInstanceState

1. 保存与读取当前状态&#xff0c;MainActivity.java public class MainActivity extends AppCompatActivity {private String TAG "MyLog";TextView textView;Button button;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedI…...

Fluent Python 笔记 第 16 章 协程

从句法上看&#xff0c;协程与生成器类似&#xff0c;都是定义体中包含 yield 关键字的函数。可是&#xff0c;在协程中&#xff0c;yield通常出现在表达式的右边(例如&#xff0c;datum yield)&#xff0c;可以产出值&#xff0c;也可以不产出——如果 yield 关键字后面没有表…...

山东科技大学校历 代码分析 获得以前学期学年的老版校历

校历-山东科技大学网络安全与信息化办公室http://tech.sdust.edu.cn/wlfw/xl.htm JavaScript var studyStart new Date(2021, 8-1, 30);//8-1 -1没有意义&#xff0c;30代表30号&#xff0c;2021年8月30号开始这个学期 var commonWeeks 19;//这个学期有多少周 var s…...

第五章.与学习相关技巧—权重初始值(随机初始值,Xavier初始值,He初始值)

第五章.与学习相关技巧 5.2 权重初始值 本节将介绍权重初始值的推荐值&#xff0c;并通过实验确认神经网络的学习是否会快速进行。 1.权值衰减 权值衰减就是一种以减少权重参数的值为目的进行学习的方法&#xff0c;通过减少权重参数值来抑制过拟合的情况发生。 2.权重初始值不…...

Linux进程间通信(管道)

进程间通信的目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了某种事件&#xff08;如…...

写一个基于node.js的api后台管理系统(三)

创建登录页面 在项目目录下创建一个名为public的文件夹&#xff0c;并在其中创建一个HTML文件login.html。添加以下代码&#xff1a; <!DOCTYPE html> <html> <head><title>Login - Task Management</title> </head> <body><h1…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...