现代化的 FreeSWITCH SIP 服务器
现代化的 FreeSWITCH SIP 服务器
项目简介
随着 IPv6 的普及和企业对通信系统灵活性、可扩展性要求的日益提高,传统的、以 XML 文件为核心的单体式 FreeSWITCH 配置方式已难以满足现代化的需求。本篇博客将深入探讨如何通过引入「分离」的设计原则,基于纯 IPv6 网络环境,利用 Lua 脚本的强大能力和 PostgreSQL 数据库的高效数据管理,从零开始搭建一个功能强大、易于维护的 FreeSWITCH SIP 服务器。
项目目标
我们的核心理念是解耦(Decoupling)。我们将详细阐述如何实现以下几个关键层面的分离,将 FreeSWITCH 从一个紧耦合的系统,重塑为一个分层清晰、职责明确的现代化通信服务架构:
- 配置与逻辑分离(Configuration vs. Logic Separation):我们将摒弃静态的 XML 配置文件,全面转向使用 Lua 脚本动态生成配置。这使得配置不再是写死的规则,而是可以根据实时条件动态生成的结果。您的核心业务逻辑(如路由策略、用户权限判断)将存在于 Lua 脚本中,与 FreeSWITCH 需要的最终 XML 格式配置分离开来,极大提升了灵活性。
- 控制与数据分离(Control vs. Data Separation):这是本架构的基石。我们将 FreeSWITCH 的控制平面(由 Lua 脚本执行的呼叫处理逻辑)与数据平面(存储在 PostgreSQL 中的用户、路由、CDR 等持久化数据)彻底分开。控制逻辑本身变得无状态,它只负责根据请求查询数据并执行操作。这使得数据库可以独立扩展、备份和管理,而控制逻辑也可以轻松地横向扩展,以应对高并发场景。
- 核心引擎与业务逻辑分离(Core Engine vs. Business Logic Separation):FreeSWITCH 本身是一个强大的、通用的软交换核心引擎。通过将复杂的呼叫流程、计费规则、IVR 菜单等业务逻辑完全移入 Lua 和 PostgreSQL,我们实现了应用层与底层引擎的解耦。这意味着您可以独立地迭代和更新您的业务功能,而无需触碰或重新编译 FreeSWITCH 核心,同时也使得未来升级 FreeSWITCH 版本变得更加平滑和安全。
- 信令与媒体承载分离(Signaling vs. Media Bearer Separation):这是 VoIP 的基本原则,但在我们的架构中得到了进一步强化。在纯 IPv6 环境下,我们将清晰地定义 SIP 信令(控制)和 RTP 媒体流(承载)的网络路径。更重要的是,我们智能化的 Lua 控制逻辑可以对信令进行深度处理,从而更精细地控制媒体承载的行为,例如动态选择媒体服务器或调整媒体策略。
本篇博客旨在为读者提供一套现代化、高效率的 FreeSWITCH 部署和运维实践指南,帮助您构建一个真正面向未来的、高可用、可扩展的通信平台。
整体架构
基于上述的分离原则,我们整个项目对应的网络部署如下图所示。
部署实践
下面是本项目的部署实践,根据上述架构,部署分为两个部分,分别为应用服务器(集群)和数据库服务器(集群)为简单起见,本次实践只部署一个应用服务器和一个数据库服务器,而非集群,其中应用服务器部署在公网,数据库服务器部署在内网,二者均需具有 IPv6 通信的能力。具体地,应用服务器须有 IPv6 全球通信能力,数据库服务器须有 IPv6 内网通信能力。
应用服务器部署 FreeSWITCH
应用服务器采用 Windows 部署。因为 FreeSWITCH 的公司 SignalWire 只提供了 Windows 的安装包,其余 Unix 系系统均仅提供需要 TOKEN 的下载方式,且截止本文写作时 SignalWire 公开的源代码的编译过程与其文档描述的不一致,因此我们选择 Windows 部署。
应用服务器部署在公网,因此需要配置 IPv6 全球通信能力。在 Windows 系统下,在 PowerShell 中执行如下命令,可以查看当前 IPv6 地址。
Get-NetIPAddress -AddressFamily IPv6
在应用服务器上,我们从 SignalWire 的官方网站下载 FreeSWITCH 的 Windows 安装包和 Unix 安装包,安装后进行配置。之所以要下载 Unix 系系统的安装包,是因为 Windows 的安装包中只有一份示例配置文件,如果采用则需要先裁剪再配置,而 Unix 的安装包则包含最小化的配置文件,无需进行裁剪,更为方便。
下面进行安装完成后的配置,FreeSWITCH 的配置大致可以分为几个部分,分别是:
- 模块配置:配置 FreeSWITCH 的模块,本次需要的模块新增的是 Lua 脚本模块
mod_lua
和 PostgreSQL 模块mod_pgsql
; - 网络配置:配置 FreeSWITCH 的 SIP 网络,本次需要调整的是 SIP 网络的 IP 地址,以适应 IPv6 环境;
- 注册配置:配置 SIP 网络的注册信息,本次需要将注册信息从静态的 XML 配置文件转换为动态的 Lua 脚本配置,使得 FreeSWITCH 可以从 PostgreSQL 中动态获取注册信息,从而实现灵活化的注册配置;
- 拨号计划配置:配置拨号计划,本次需要调整的是用 Lua 脚本实现的拨号计划。
下面以 FreeSWITCH 的最小配置 minimal
为基础,进行详细配置。
模块配置
在配置文件夹下,在 modules.conf
文件末尾加入两行如下配置,以添加 Lua 脚本模块 mod_lua
和 PostgreSQL 模块 mod_pgsql
。
applications/mod_lua
applications/mod_pgsql
网络配置
在配置文件夹下的 sip_profiles
文件夹下,删除除 internal.xml
外的所有文件,将 internal.xml
文件的内容修改为如下内容,以适应 IPv6 环境。
注册配置
在配置文件夹下新建 register.lua
文件,内容如下。
function register()
return {
{
}
}
拨号计划配置
在配置文件夹下的 dialplan
文件夹下,删除原有的所有文件,新建 dialplan.lua
文件,内容如下。
function main()
return {
}
数据库服务器部署 PostgreSQL
数据库服务器采用 Linux Docker 部署。因为容器化的优势,数据库服务器可以随时进行迁移,实现高可用和高扩展的架构。
数据库服务器需要与应用服务器进行通信,因此需要配置 IPv6 内网通信能力。对应的容器网络需要配置为 IPv6 的桥接网络,以便应用服务器和数据库服务器可以直接通信,而不需要通过端口转发。
对应 Dockerfile 如下。
FROM postgres:14-alpine
RUN apk add --no-cache iproute2
EXPOSE 5432
用户体验
在多台设备(PC 或手机)上安装软电话,并进行通话测试。
下面的表格中是不同平台上可用的 SIP 客户端,可以用来进行通话测试。
平台 | SIP 客户端 |
---|---|
Windows | MicroSIP |
macOS | Linphone |
Linux | Linphone |
Android | Linphone |
iOS | Linphone |
总结
在本篇博客中,我们为您提供了一套现代化、高效率的 FreeSWITCH 部署和运维实践指南。通过本文,您可以轻松地构建一个功能强大、易于维护的 FreeSWITCH SIP 服务器,满足您的通信需求,提高工作效率,降低运维成本。