Administrator
发布于 2026-11-06 / 3 阅读
0
0

FreeSWITCH SIP Profile实战:监听、鉴权和路由入口 09

English
中文

先在独立入口验证

这一期用7101和7102验证三件事。话机是否找对监听地址,发起呼叫时是否完成鉴权,鉴权后的呼叫进入哪一套路由。示例在测试机上新增training-internal Profile,使用5090端口,继续用现有用户目录与拨号计划。原有internal、external和运营商中继都可以留在原位置。

准备一台可回退的测试机、两台可编辑服务器端口的软电话和已能互拨的7101、7102。保留原域、认证账号与口令,记录原Profile状态和防火墙规则。先确认5090没有被其他SIP入口或本机服务占用,并限制只有实验网段能访问它。多网卡机器还要核对本机地址变量选中了哪块网卡。

新建监听入口

在fs_cli中运行eval $${conf_dir}确认配置根目录。在其sip_profiles目录下新建training-internal.xml。检查autoload_configs/sofia.conf.xml中的profiles包含指令是否加载该目录;如果实例使用自定义XML提供方,按实例的实际加载链处理。下面是本期独立Profile的完整文件。它沿用本机的编解码及其他默认行为,测试双方应支持共同的编码。

<profile name="training-internal">
  <!-- 不为现有SIP域创建新的Profile别名 -->
  <aliases/>
  <gateways/>
  <domains>
    <domain name="all" alias="false" parse="false"/>
  </domains>
  <settings>
    <!-- 实验端口,先确认本机未被其他服务占用 -->
    <param name="sip-port" value="5090"/>
    <!-- 沿用本机地址变量,核对其在多网卡环境中的展开值 -->
    <param name="sip-ip" value="$${local_ip_v4}"/>
    <param name="rtp-ip" value="$${local_ip_v4}"/>
    <!-- INVITE要求鉴权;默认入口使用受限的public路由 -->
    <param name="auth-calls" value="true"/>
    <param name="dialplan" value="XML"/>
    <param name="context" value="public"/>
  </settings>
</profile>

sip-ip指定SIP信令绑定地址,sip-port是该Profile监听的端口号。5090是本期实验选择,不是运营商固定要求。rtp-ip是本地媒体地址,RTP并不沿用SIP的5090,媒体端口仍要看实例的RTP端口范围及协商结果。示例使用XML预处理变量,本机只要有多块网卡,就值得把展开后的实际地址和抓包位置一起记下来。公网地址宣告与NAT留到下一期展开,不能把公网映射地址直接填作本机无法绑定的地址。

alias=false表示不给目录域创建Profile别名,parse=false避免从目录解析加载额外网关。这里的domains块并不新建7101、7102,目录文件仍由原加载链提供。空gateways表示本Profile没有自定义的静态网关。第06期的中继仍由原Profile加载,内部入口可以通过拨号计划使用那条中继。

把鉴权和路由放在一起检查

auth-calls=true要求入站INVITE走鉴权流程,但还要看是否配置了可信来源等例外。示例不增加这些例外。注册成功只说明当时的REGISTER走通,发起呼叫是另一次SIP事务。抓包时可以看到初始请求和认证挑战,随后话机应携带相应凭据重试。RFC 3261定义了401与407的认证语义,具体以本机报文为准。一次挑战后成功接通属于正常流程。反复挑战时,先核对授权用户名、域或realm和口令,再确认重试是否到达同一个入口。

dialplan=XML选用XML拨号计划,context=public给这个入口设置默认上下文。先检查7101和7102的目录项是否已有user_context=default。在常规Sofia流程中,经认证用户的目录上下文可以覆盖Profile默认值,最后以实际通话日志为准。若两个用户原来在其他受控context,保留现有设计,并确认其中包含实验所需的路由。不要为让呼叫暂时打通就把未认证入口指到内部default。public也只是一张路由表,里面实际能到达哪些目的地仍要逐条核对。

第08期的training_outbound_allowed仍是拨号计划要检查的授权标记,呼叫发起后应核对认证账号是否真的进入sip_auth_username。队列agent和tier控制接单成员与分配关系,分机换监听入口不会自动修改这两类对象。若队列联系地址写死了旧Profile或服务器地址,要单独核对;使用现有用户定位机制的环境也应通过实际接单验证。

加载与验收

在测试窗口先执行reloadxml,再执行sofia profile training-internal start,然后用sofia status profile training-internal查看绑定。新增Profile用start,已经运行的Profile改了监听项则需要评估重启该Profile的影响。仅reloadxml不能据此认定旧监听已经换端口。保留原入口并先测试一台话机,第二台确认后再迁移。两台话机改服务器端口到5090,域与认证账号沿用目录已有值。若原入口还保留旧Contact,核对注册表实际用于送话的地址,必要时在测试终端先注销旧注册再登录。

验收时检查三点。第一点是对照两台终端的注册结果和Profile状态,确认请求确实打到5090。第二点是从7101拨7102,再反向拨打,对照INVITE鉴权和实际命中的context,并拨7180菜单与7190队列确认能到达。第三点是用错误凭据的测试账号验证无法进入内部路由,并按第08期检查授权与未授权用户的受控外呼。若需要真实外呼,使用已获准的被叫,注意线路费用。保存诊断报文前先脱敏。

出错时怎么缩小范围

Profile没起来,先看绑定地址与端口冲突,再看文件有没有被Sofia读到。话机超时但Profile已运行,抓包确认请求到达哪块网卡和哪个端口,并检查UDP或TCP是否匹配。注册成功但拨号失败,分别检查INVITE是否完成挑战以及context和被叫是否匹配。出现可通话却单通,再查SDP、RTP路径和媒体端口。信令监听正常只解决了呼叫能否建立的一部分。

auth-all-packets、disable-register、TLS监听和来源ACL都是常见的关联项。它们分别涉及挑战范围、注册可用性、传输和入口访问控制,启用前应核对本机版本与对端能力。特别是可信ACL的效果要按实际配置验证,不能把放行IP当成逐用户鉴权的等价替代。

回退时先把两台话机恢复原服务器与端口,验证原入口互拨和队列。等实验通话结束后,用sofia profile training-internal stop停掉新入口,把XML移出包含目录并reloadxml,再恢复实验防火墙规则。回退时只动这次新增的入口,避免影响运营商Profile上的其他业务。


评论