配置指南
📖 返回主文档
本文档提供了 TAS 应用服务器的全面配置参考。
相关文档
核心配置
集成接口
呼叫处理
增值服务
测试与合规
- 🧪 HLR 和呼叫模拟器 - 测试工具
- 📜 ANSSI R226 合规性 - 法国市场合规性
配置
应用服务器需要:
- 连接 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 访问:
-
自签名证书(开发/测试):
openssl req -x509 -newkey rsa:4096 -keyout priv/cert/server.key \
-out priv/cert/server.crt -days 365 -nodes -
生产证书:
- 使用来自受信任证书颁发机构(CA)的证书
- 常见提供商:Let's Encrypt(免费)、商业 CA
- 确保证书包含完整链以获得浏览器信任
- 使用适当的文件权限(
chmod 600)保护私钥
访问控制:
控制面板提供对敏感操作数据的访问:
- 订阅者信息: 注册详细信息、通话历史、位置
- 呼叫详细记录: 包含 MSISDN 数据的完整呼叫记录
- 系统配置: Diameter 对等体、网关、路由
- 活动呼叫: 实时监控进行中的会话
推荐的安全措施:
- 在生产环境中部署在防火墙或 VPN 后面
- 使用来自受信任 CA 的强 TLS 证书
- 实施网络级访问控制(IP 白名单)
- 如果公开外部访问,考虑额外的身份验证层
- 定期审核访问日志
- 仅使用 HTTPS - 切勿通过普通 HTTP 提供服务
常见部署模式:
-
仅内部访问:
url: [host: "10.8.82.60", path: "/"] # 仅限内部网络 -
带域名的外部访问:
url: [host: "tas.operator.com", path: "/"]
https: [port: 443, ...] -
在反向代理后面:
url: [host: "tas.internal", path: "/panel"] # Nginx/Apache 转发到此
故障排除:
- 证书错误: 验证
keyfile和certfile的路径是否正确且文件可读 - 端口已被使用: 检查是否有其他服务正在使用端口 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 中很常见
- 示例:
8444、8443、9443
- 默认值:
-
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/HTTPStrue:通过 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
常见部署场景:
-
仅内部 API:
listen_ip: "127.0.0.1" # 仅可从本地主机访问
enable_tls: false # 内部测试使用 HTTP -
带 TLS 的生产 API:
listen_ip: "0.0.0.0" # 可从网络访问
enable_tls: true # 需要 HTTPS
hostname: "api.operator.com" -
开发/测试:
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_ips 和 allowed_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 - 范围:
5到3600 - 示例:
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,则禁用 - 典型值:
15到60秒 - 在网关状态 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" - 常见编解码器:
PCMU、PCMA、G729、AMR、AMR-WB、G722、OPUS
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}"/>
故障排除网关问题
网关无法注册:
- 验证
username和password是否正确 - 检查
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 的数据。