跳到主要内容

配置指南

📖 返回主文档

本文档提供了 TAS 应用服务器的全面配置参考。

相关文档

核心配置

集成接口

呼叫处理

增值服务

测试与合规


配置

应用服务器需要:

  • 连接 SIP 中继 / SBC 以进行外部呼叫
  • 连接 DRA 或 HSS 以获取 Sh
  • 可选地连接 DRA 或 OCS 进行 Ro 在线计费
  • 拨号计划配置
  • 拨号规则 / 号码翻译的配置
  • 语音邮件配置
  • 提示
  • 测试
  • 指标 (Prometheus)

事件套接字配置

事件套接字用于呼叫控制、监控活动呼叫和与电话引擎交互。此连接允许 TAS 控制呼叫路由、检索通道变量并管理活动会话。

配置位置: config/runtime.exs

config :tas,
fs_event_socket: %{
host: "127.0.0.1",
port: 8021,
secret: "YourSecretPassword"
}

配置参数:

  • host (字符串,必需):事件套接字服务器的主机名或 IP 地址

    • 默认值:"127.0.0.1" (本地主机)
    • 如果电话引擎与 TAS 运行在同一服务器上,请使用本地主机
    • 对于分布式部署,请使用远程 IP
    • 示例:"10.8.82.60" 用于远程连接
  • port (整数,必需):事件套接字连接的 TCP 端口

    • 默认��:8021
    • 标准事件套接字端口为 8021
    • 必须与电话引擎中的事件套接字配置匹配
    • 示例:8021
  • secret (字符串,必需):事件套接字的身份验证密码

    • 必须与电话引擎中配置的密码匹配
    • 用于验证 ESL 连接
    • 安全提示: 使用强随机密码并保持安全
    • 示例:"cd463RZ8qMk9AHMMDGT3V"

用例:

  • 实时呼叫控制和路由
  • 检索控制面板中 /calls 视图的活动呼叫信息
  • 以编程方式执行拨号计划应用
  • 监控呼叫状态变化和事件
  • 管理会议呼叫

连接行为:

  • TAS 建立与事件套接字的持久连接
  • 在连接失败时自动重新连接
  • 用于入站(接收事件)和出站(控制呼叫)模式
  • 连接超时和重试逻辑是内置的

安全考虑:

  • 始终为 secret 参数使用强且唯一的密码
  • 如果使用远程连接,请确保防火墙规则仅允许受信任的 TAS 服务器
  • 考虑在 TAS 和电话引擎共存时使用仅限本地主机的连接
  • 不要将事件套接字端口暴露给公共网络

故障排除:

  • 连接被拒绝: 验证电话引擎是否正在运行并且事件套接字已启用
  • 身份验证失败: 检查 secret 是否与电话引擎配置匹配
  • 超时错误: 验证网络连接和防���墙规则
  • 无法控制呼叫: 确保 TAS 已成功连接(检查日志)

控制面板配置

控制面板提供了一个基于 Web 的界面,用于监控和管理 TAS 系统。这包括查看订阅者、CDR、活动呼叫、Diameter 对等体、网关和系统配置。

配置位置: config/runtime.exs

config :control_panel,
page_order: ["/application", "/configuration"]

config :control_panel, ControlPanelWeb.Endpoint,
url: [host: "0.0.0.0", path: "/"],
https: [
port: 443,
keyfile: "priv/cert/server.key",
certfile: "priv/cert/server.crt"
]

配置参数:

页面顺序配置

  • page_order (字符串列表):控制控制面板中配置页面的显示顺序
    • 指定哪些页面出现在导航中及其顺序
    • 示例:["/application", "/configuration"]
    • 默认:如果未设置,页面按默认字母顺序出现

Web 端点配置

  • url (映射):控制面板的公共 URL 配置

    • host:用于生成 URL 的主机名(例如,"tas.example.com""0.0.0.0"
    • path:所有控制面板路由的基本路径(默认:"/"
    • 用于在重定向和链接中生成绝对 URL
  • https (映射):安全访问的 HTTPS/TLS 配置

    • port (整数)��HTTPS 端口号(标准为 443
    • keyfile (字符串):TLS 私钥文件的路径(PEM 格式)
    • certfile (字符串):TLS 证书文件的路径(PEM 格式)
    • 两个文件必须可被 TAS 应用读取

证书管理:

控制面板需要有效的 TLS 证书以进行 HTTPS 访问:

  1. 自签名证书(开发/测试):

    openssl req -x509 -newkey rsa:4096 -keyout priv/cert/server.key \
    -out priv/cert/server.crt -days 365 -nodes
  2. 生产证书:

    • 使用来自受信任证书颁发机构(CA)的证书
    • 常见提供商:Let's Encrypt(免费)、商业 CA
    • 确保证书包含完整链以获得浏览器信任
    • 使用适当的文件权限(chmod 600)保护私钥

访问控制:

控制面板提供对敏感操作数据的访问:

  • 订阅者信息: 注册详细信息、通话历史、位置
  • 呼叫详细记录: 包含 MSISDN 数据的完整呼叫记录
  • 系统配置: Diameter 对等体、网关、路由
  • 活动呼叫: 实时监控进行中的会话

推荐的安全措施:

  • 在生产环境中部署在防火墙或 VPN 后面
  • 使用来自受信任 CA 的强 TLS 证书
  • 实施网络级访问控制(IP 白名单)
  • 如果公开外部访问,考虑额外的身份验证层
  • 定期审核访问日志
  • 仅使用 HTTPS - 切勿通过普通 HTTP 提供服务

常见部署模式:

  1. 仅内部访问:

    url: [host: "10.8.82.60", path: "/"]  # 仅限内部网络
  2. 带域名的外部访问:

    url: [host: "tas.operator.com", path: "/"]
    https: [port: 443, ...]
  3. 在反向代理后面:

    url: [host: "tas.internal", path: "/panel"]  # Nginx/Apache 转发到此

故障排除:

  • 证书错误: 验证 keyfilecertfile 的路径是否正确且文件可读
  • 端口已被使用: 检查是否有其他服务正在使用端口 443,或更改为其他端口
  • 无法访问 UI: 验证防火墙规则允许访问配置的 HTTPS 端口
  • SSL 握手失败: 确保证书和密钥匹配并且是 PEM 格式

API 配置

TAS 包含一个 REST API,用于对系统功能、订阅者管理和操作数据的程序化访问。API 支持 OpenAPI/Swagger 文档,并通过 TLS 进行安全保护。

配置位置: config/runtime.exs

config :api_ex,
api: %{
port: 8444,
listen_ip: "0.0.0.0",
product_name: "OmniTAS",
title: "API - OmniTAS",
hostname: "localhost",
enable_tls: true,
tls_cert_path: "priv/cert/server.crt",
tls_key_path: "priv/cert/server.key"
}

配置参数:

  • port (整数,必需):API 服务器的 TCP 端口

    • 默认值:8444
    • 选择一个不与其他服务冲突的端口
    • 标准 HTTPS 端口为 443,但自定义端口在 API 中很常见
    • 示例:844484439443
  • listen_ip (字符串,必需):绑定 API 服务器的 IP 地址

    • "0.0.0.0":在所有网络接口上监听(外部访问)
    • "127.0.0.1":仅在本地主机上监听(仅内部访问)
    • 特定 IP:绑定到特定接口(例如,"10.8.82.60"
    • 安全性: 如果 API 仅在内部需要,请使用 "127.0.0.1"
  • product_name (字符串):API 元数据的产品标识符

    • 用于 API 响应和文档
    • 示例:"OmniTAS""MyOperator-IMS"
  • title (字符串):API 文档的人类可读标题

    • 显示在 OpenAPI/Swagger UI 标头中
    • 示例:"API - OmniTAS""IMS 应用服务器 API"
  • hostname (字符串):API 服务器在文档中的主机名

    • 用于 OpenAPI 规范生成示例 URL
    • 应与客户端访问 API 的方式匹配
    • 示例:"localhost""api.operator.com""10.8.82.60"
  • enable_tls (布尔值):启用或禁用 API 的 TLS/HTTPS

    • true:通过 HTTPS 提供 API(推荐用于生产)
    • false:通过 HTTP 提供 API(仅用于测试/开发)
    • 安全性: 在生产环境中始终使用 true
  • tls_cert_path (字符串):TLS 证书文件的路径(PEM 格式)

    • enable_tls: true 时必需
    • 必须可被 TAS 应用读取
    • 示例:"priv/cert/server.crt"
  • tls_key_path (字符串):TLS 私钥文件的路径(PEM 格式)

    • enable_tls: true 时必需
    • 必须可被 TAS 应用读取
    • 安全性: 使用文件权限保护(chmod 600
    • 示例:"priv/cert/server.key"

API 功能:

REST API 提供对以下内容的程序化访问:

  • 订阅者管理和配置
  • 呼叫详细记录 (CDR) 查询
  • 系统状态和健康检查
  • Diameter 对等体状态
  • 网关状态和统计信息
  • 活动呼叫监控
  • 配置管理

OpenAPI/Swagger 文档:

API 包含内置的 OpenAPI (Swagger) 文档:

  • 在以下地址访问 Swagger UI:https://hostname:port/api/swaggerui
  • OpenAPI JSON 规范在:https://hostname:port/api/openapi
  • 直接从浏览器进行交互式 API 测试
  • 完整的端点文档,包含请求/响应模式

安全考虑:

  • 身份验证: 根据您的安全要求实施 API 身份验证
  • 网络访问: 使用防火墙规则限制 API 访问仅限授权客户端
  • TLS 要求: 在生产中始终启用 TLS (enable_tls: true)
  • 证书验证: 使用受信任的证书用于生产 API
  • 速率限制: 考虑对面向公众的 API 实施速率限制
  • 访问日志: 监控 API 访问日志以发现可疑活动

示例用法:

# 使用 curl 查询 API(替换为实际端点)
curl -k https://localhost:8444/api/health

# 访问 Swagger 文档
https://localhost:8444/api/swaggerui

常见部署场景:

  1. 仅内部 API:

    listen_ip: "127.0.0.1"  # 仅可从本地主机访问
    enable_tls: false # 内部测试使用 HTTP
  2. 带 TLS 的生产 API:

    listen_ip: "0.0.0.0"    # 可从网络访问
    enable_tls: true # 需要 HTTPS
    hostname: "api.operator.com"
  3. 开发/测试:

    listen_ip: "0.0.0.0"
    enable_tls: false # 方便测试使用 HTTP
    port: 8080 # 非特权端口

故障排除:

  • 端口绑定失败: 验证端口未被其他服务使用,或以 root 身份运行以获取 < 1024 的端口
  • TLS 错误: 检查证书和密钥路径是否正确且文件可读
  • 无法连接: 验证防火墙允许访问配置的端口
  • 证书不匹配: 确保 hostname 与证书的公共名称 (CN) 或 SAN 匹配
  • API 返回 404: 检查 API 应用是否在日志中成功启动

SIP 中继配置

Ansible 负责为每个外发网关创建 XML 配置,这些配置在 网关 选项卡中可见,并用于外发呼叫。

CSCF 地址和网关地址必须包含在运行时配置中,以便我们知道允许哪些 IP 进行呼叫,我们在网关 / SBC(将 MT 流量发送到网络的源)和 CSCF(MO 流量的源)中使用 allowed_sbc_source_ipsallowed_cscf_ips 来实现这一点。

注意 - 如果您将呼叫从 TAS 路由到自身(即,MO 呼叫到网内订阅者路由回 MT 拨号计划),则您的 TAS IP 也必须在允许的源 IP 列表中。

config :tas,
allowed_sbc_source_ips: ["10.5.198.200", "103.26.174.36"],
allowed_cscf_ips: ["10.8.3.34"],

通过 Web UI,我们可以查看每个网关的状态,以及:

  • SIP 注册状态(如果启用了注册)
  • SIP 领域
  • SIP 代理地址(如果使用)
  • 用户名
  • Ping 时间(平均 SIP OPTIONs 响应时间(如果启用 SIP OPTIONs))
  • 正常运行时间(自配置文件重新启动或上线以来的秒数)
  • 呼叫入 / 呼叫出 / 呼叫入失败 / 呼叫出失败
  • 最后 SIP OPTIONs ping 时间(纪元)
  • SIP OPTIONs ping 频率
  • 详细 按钮��查看更多信息

网关配置参考

网关以 XML 格式配置。每个网关代表与外部 SBC、运营商或 PSTN 网关的 SIP 中继连接。

基本网关示例:

<include>
<gateway name="carrier_trunk">
<param name="proxy" value="203.0.113.50;transport=tcp"/>
<param name="register" value="true"/>
<param name="caller-id-in-from" value="true"/>
<param name="username" value="trunk_user"/>
<param name="password" value="secure_password"/>
<param name="register-transport" value="tcp"/>
<param name="retry-seconds" value="30"/>
<param name="ping" value="25"/>
</gateway>
</include>

不需要注册的网关:

<include>
<gateway name="sbc_static">
<param name="proxy" value="198.51.100.10"/>
<param name="register" value="false"/>
<param name="caller-id-in-from" value="true"/>
</gateway>
</include>

网关参数

必需参数

name (网关属性)

  • 此网关的唯一名称标识符
  • 在拨号计划中用于引用网关:sofia/gateway/name/destination
  • 示例:<gateway name="my_trunk">

proxy

  • SIP 代理/网关的 IP 地址或主机名
  • 可以包括端口和传输协议
  • 示例:
    • value="203.0.113.50"(默认端口 5060,UDP)
    • value="203.0.113.50:5061"(自定义端口)
    • value="203.0.113.50;transport=tcp"(TCP 传输)
    • value="203.0.113.50:5061;transport=tls"(TLS 在端口 5061 上)

register

  • 是否向网关发送 SIP REGISTER
  • 值:true | false
  • 如果中继需要注册,则设置为 true
  • 对于基于静态 IP 的中继,设置为 false
身份验证参数

username

  • SIP 身份验证用户名
  • 在 REGISTER 中使用,并用于摘要身份验证
  • 如果 register="true",则为必需
  • 示例:value="trunk_account_123"

password

  • SIP 身份验证密码
  • 用于摘要身份验证挑战
  • 如果 register="true",则为必需
  • 示例:value="MySecureP@ssw0rd"

realm

  • SIP 身份验证的领域
  • 可选 - 通常从挑战中自动检测
  • 示例:value="sip.carrier.com"

auth-username

  • 用于身份验证的替代用户名(如果与 username 不同)
  • 很少需要 - 仅在运营商要求身份验证与 From 头不同的用户时
  • 示例:value="auth_user_456"
注册参数

register-transport

  • REGISTER 消息的传输协议
  • 值:udp | tcp | tls
  • 必须与 proxy 参数中指定的传输匹配
  • 示例:value="tcp"

register-proxy

  • REGISTER 的替代代理地址(如果与呼叫路由不同)
  • 当注册服务器与呼叫路由服务器不同时时有用
  • 示例:value="register.carrier.com:5060"

retry-seconds

  • 在重试失败的注册之前等待的秒数
  • 默认值:30
  • 范围:53600
  • 示例:value="30"

expire-seconds

  • 注册过期时间(以秒为单位)
  • 默认值:3600(1 小时)
  • 网关将在过期之前重新注册
  • 示例:value="1800"(30 分钟)

caller-id-in-from

  • 在 SIP From 头中包含来电者 ID
  • 值:true | false
  • true:From 头包含实际来电者号码(大多数运营商要求)
  • false:From 头使用网关用户名
  • 建议: 对于大多数部署,设置为 true
  • 示例:value="true"
监控参数

ping

  • 每 N 秒发送 SIP OPTIONS ping
  • 监控网关可用性并测量延迟
  • 如果未指定或设置为 0,则禁用
  • 典型值:1560
  • 在网关状态 UI 中显示为 "Ping 时间"
  • 示例:value="25"

ping-max

  • 在标记网关为故障之前重试 ping 的最大时间(秒)
  • 默认值:根据 ping 间隔计算
  • 示例:value="3"
呼叫路由参数

extension

  • 始终在此网关上拨打的固定目的号码
  • 很少使用 - 通常目的地来自拨号计划
  • 示例:value="+12125551234"

extension-in-contact

  • 在 Contact 头中包含扩展
  • 值:true | false
  • 默认值:false
  • 示例:value="false"

contact-params

  • 附加参数附加到 Contact 头
  • 对于运营商特定的要求很有用
  • 示例:value="line=1;isup=true"
高级参数

from-user

  • 在 From 头中覆盖用户名
  • 默认值:使用呼叫号码或网关用户名
  • 示例:value="trunk_pilot"

from-domain

  • 在 From 头中覆盖域
  • 默认值:使用代理域
  • 示例:value="my-domain.com"

outbound-proxy

  • 所有 SIP 消息的出站代理
  • proxy 不同 - 用作 Route 头目标
  • 示例:value="edge-proxy.carrier.com:5060"

context

  • 来自此网关的来电拨号计划上下文
  • 默认值:public
  • 允许每个网关不同的来电路由
  • 示例:value="from-carrier"

channels

  • 此网关的最大并发呼叫数
  • 默认值:无限制
  • 用于容量管理
  • 示例:value="100"

dtmf-type

  • DTMF 传输方法
  • 值:rfc2833 | info | inband | auto
  • 默认值:rfc2833(推荐)
  • rfc2833:RTP 电话事件(最常见)
  • info:SIP INFO 消息
  • inband:音频音调
  • 示例:value="rfc2833"

codec-prefs

  • 此网关的首选编解码器列表
  • 以逗号分隔的首选顺序列表
  • 示例:value="PCMU,PCMA,G729"
  • 常见编解码器:PCMUPCMAG729AMRAMR-WBG722OPUS

rtp-timeout-sec

  • 如果在 N 秒内未收到 RTP,则挂断呼叫
  • 默认值:0(禁用)
  • 有助于检测死呼叫
  • 示例:value="120"

rtp-hold-timeout-sec

  • 在没有 RTP 的情况下保持通话的超时
  • 默认值:0(禁用)
  • 示例:value="1800"(30 分钟)
SIP 信令选项

sip-port

  • 此网关使用的本地 SIP 端口
  • 默认值:配置文件的端口
  • 很少需要
  • 示例:value="5060"

rtp-ip

  • RTP 媒体的本地 IP 地址
  • 默认值:配置文件的 RTP IP
  • 示例:value="10.0.0.5"

register-proxy-port

  • 注册代理的端口
  • 仅在与代理端口不同的情况下需要
  • 示例:value="5061"

contact-host

  • 覆盖 Contact 头的主机部分
  • 对于 NAT 场景很有用
  • 示例:value="public-ip.example.com"

distinct-to

  • 使用不同于请求 URI 的不同 To 头
  • 值:true | false
  • 运营商特定要求
  • 示例:value="false"

cid-type

  • 在 Remote-Party-ID 或 P-Asserted-Identity 头中的来电者 ID 类型
  • 值:rpid | pid | none
  • rpid:Remote-Party-ID 头
  • pid:P-Asserted-Identity 头
  • 示例:value="pid"

extension-in-contact

  • 将扩展参数添加到 Contact URI
  • 值:true | false
  • 示例:value="true"
传输安全

transport (在代理参数中)

  • 传输协议
  • 值:udp | tcp | tls | ws | wss
  • 作为代理值的一部分指定
  • 示例:proxy="203.0.113.50;transport=tcp"

对于 TLS 连接,可能需要在 SIP 配置文件中进行额外的证书配置。

包含常见选项的完整示例

<include>
<gateway name="primary_carrier">
<!-- 必需:基本连接 -->
<param name="proxy" value="sbc.carrier.com:5060;transport=tcp"/>
<param name="register" value="true"/>

<!-- 身份验证 -->
<param name="username" value="customer_trunk_01"/>
<param name="password" value="SecurePassword123"/>

<!-- 注册 -->
<param name="register-transport" value="tcp"/>
<param name="expire-seconds" value="1800"/>
<param name="retry-seconds" value="30"/>

<!-- 来电者 ID -->
<param name="caller-id-in-from" value="true"/>

<!-- 监控 -->
<param name="ping" value="30"/>

<!-- 媒体 -->
<param name="codec-prefs" value="PCMU,PCMA,G729"/>
<param name="dtmf-type" value="rfc2833"/>

<!-- 呼叫限制 -->
<param name="channels" value="100"/>

<!-- RTP 超时 -->
<param name="rtp-timeout-sec" value="300"/>
</gateway>
</include>

拨号计划中的网关使用

在拨号计划中使用 sofia/gateway/name/destination 格式引用网关:

<!-- 路由到特定网关 -->
<action application="bridge" data="sofia/gateway/primary_carrier/+12125551234"/>

<!-- 使用变量路由 -->
<action application="bridge" data="sofia/gateway/primary_carrier/${tas_destination_number}"/>

<!-- 带自定义 SIP 头的路由 -->
<action application="bridge" data="{sip_h_X-Custom=Value}sofia/gateway/primary_carrier/${tas_destination_number}"/>

<!-- 网关之间的故障转移 -->
<action application="bridge" data="sofia/gateway/primary_carrier/${tas_destination_number}|sofia/gateway/backup_carrier/${tas_destination_number}"/>

故障排除网关问题

网关无法注册:

  • 验证 usernamepassword 是否正确
  • 检查 proxy 地址是否可达
  • 确认 register-transport 是否符合运营商要求
  • 查看日志以获取身份验证失败的详细信息

呼叫失败:

  • 在 Web UI (/gw) 中检查网关状态
  • 验证 caller-id-in-from 设置是否符合运营商要求
  • 确认与 codec-prefs 的编解码器兼容性
  • 检查防火墙是否允许 SIP 和 RTP 流量

通话质量差:

  • 查看网关状态中的 ping 时间
  • 检查 rtp-timeout-sec 是否过于激进
  • 验证编解码器首选项是否符合网络能力
  • 监控网络延迟和丢包

Diameter 对等体配置

Diameter 对等体必须在运行时配置中定义。

此配置大部分是样板。

如果在您的部署中不使用 Ro 接口,则不需要在应用程序中包含 Ro。

config :diameter_ex,
diameter: %{
service_name: :omnitouch_tas,
listen_ip: "10.8.82.60",
listen_port: 3868,
decode_format: :map,
host: "example-dc01-as01",
realm: "epc.mnc001.mcc001.3gppnetwork.org",
product_name: "OmniTAS",
request_timeout: 5000,
peer_selection_algorithm: :random,
allow_undefined_peers_to_connect: true,
log_unauthorized_peer_connection_attempts: true,
control_module: Tas.Control.Diameter,
processor_module: DiameterEx.Processor,
auth_application_ids: [],
acct_application_ids: [],
vendor_id: 10415,
supported_vendor_ids: [10415],
applications: [
%{
application_name: :sh,
application_dictionary: :diameter_gen_3gpp_sh,
vendor_specific_application_ids: [
%{
vendor_id: 10415,
auth_application_id: 16_777_217,
acct_application_id: nil
}
]
},
%{
application_name: :ro,
application_dictionary: :diameter_gen_3gpp_ro,
vendor_specific_application_ids: [
%{
vendor_id: 0,
auth_application_id: 4,
acct_application_id: nil
}
]
}
],
peers: [
%{
port: 3868,
host: "example-dc01-dra01.epc.mnc001.mcc001.3gppnetwork.org",
ip: "1.2.3.4",
realm: "epc.mnc001.mcc001.3gppnetwork.org",
tls: false,
transport: :diameter_tcp,
initiate_connection: true
},
%{
port: 3869,
host: "example-dc01-dra02.epc.mnc001.mcc001.3gppnetwork.org",
ip: "1.2.3.44",
realm: "epc.mnc001.mcc001.3gppnetwork.org",
tls: false,
transport: :diameter_tcp,
initiate_connection: true
}
]
}

您可以从 Web UI 的 Diameter 选项卡检查 Diameter 对等体的状态。

您还可以从 Web UI 的 Sh 选项卡测试检索 Sh 数据,以尝试获取任何来自 Sh 的数据。