先把 7101 搬到外网
第 9 期的 7101 和 7102 都在内网,通过 training-internal 的 5090 端口互拨。这次把 7101 搬到有固定测试出口的外网,7102 留在内网。验收时,两台电话要能互相拨通,接听后双方各说一句,对方都能复述,挂机也要正常。分机目录、拨号计划和第 2 期配置的队列 agent、tier 可以沿用。
示例里,FS 网卡是 10.20.30.10,出口设备对外地址是 203.0.113.10。后者是文档示例地址,动手时换成真正分配给测试入口的公网 IPv4。本期用 IPv4、UDP SIP 和由 FS 中转的 RTP,范围限于一台可回退的测试机。外网测试端也要能正常收发媒体。若出口在运营商多层 NAT 后,又拿不到入站映射,得先解决可达性,可以从具备公网入口的 SBC 或 VPN 路径接入。光改 FS 的 XML 无法开通入站路径。
防火墙先把两条路接上
在出口设备建立 UDP 5090 到 10.20.30.10:5090 的端口映射,只放行约定的测试来源。话机在外网填公网地址和 5090,认证用户、口令与目录域按上期的配置继续用。有独立出站代理字段的软电话,可以把传输目标填在那里。内网 7102 仍连内网地址。信令和媒体的允许来源要分别核对,有 SBC 时两者可能不是同一组地址。
媒体这一条到配置根目录的 autoload_configs/switch.conf.xml 找 rtp-start-port 和 rtp-end-port。官方 v1.11.2 模板有 16384 和 32768 的注释示例。先核对本机有效范围和变更记录,再按实际范围做 UDP 同端口映射及放行,包括主机防火墙。5090 只管本例的 SIP,媒体端口每通电话要看 SDP,RTCP 的端口也按现网协商和实际收发核对。这里沿用现有 RTP 池。把池改小会影响整台 FS,测试时省下几个端口,可能让其他 Profile 分不到媒体端口。
改 training-internal.xml 的四个地址
进入 fs_cli,运行 eval $${conf_dir} 查看配置根目录。备份 sip_profiles/training-internal.xml 到加载目录外。下面是接续上期的完整实验 Profile。示例保留已有域与路由前提,地址和端口要换成自己的。已有受控配置的实例只替换对应项,其他现网设置按原配置保留。
<profile name="training-internal">
<!-- 继续使用现有目录域,不创建别名或加载网关 -->
<aliases/>
<gateways/>
<domains>
<domain name="all" alias="false" parse="false"/>
</domains>
<settings>
<!-- 内网网卡地址,5090 是本实验的 SIP 端口 -->
<param name="sip-ip" value="10.20.30.10"/>
<param name="sip-port" value="5090"/>
<param name="rtp-ip" value="10.20.30.10"/>
<!-- 换成出口实际转发到测试机的公网 IPv4 -->
<param name="ext-sip-ip" value="203.0.113.10"/>
<param name="ext-rtp-ip" value="203.0.113.10"/>
<!-- 保留上期的鉴权与默认路由入口 -->
<param name="auth-calls" value="true"/>
<param name="dialplan" value="XML"/>
<param name="context" value="public"/>
</settings>
</profile>
sip-ip 决定本机在哪个地址收 SIP,sip-port 是监听端口号。rtp-ip 是本地媒体地址。公网地址在路由器上时,两个本地地址仍填 FS 网卡地址。ext-sip-ip 用于对外 SIP 地址宣告,可在对应通话腿的 Contact 等头字段核对。ext-rtp-ip 是对外宣告的媒体地址,在该腿音频 SDP 中核对。两项 ext 参数填写地址,不会建立 DNAT,也不会替你修改 m=audio 宣告的端口。本例用内外同端口映射,实际端口如果不同,须由出口设备或 SBC 按设计处理,并从外侧验收报文。
auth-calls 保留 INVITE 鉴权。dialplan 继续用 XML,context 是 Profile 默认入口,已认证分机实际路由还要看目录里的 user_context。测试前检查 public 里允许的路由,保留上一期受控拨号设计。网关块为空,运营商中继继续由原 Profile 管理。
加载后,看包实际走到哪里
在测试窗口等实验通话结束,在 fs_cli 依次执行下面四行。重启这个 Profile 可能影响它承载的通话,生产切换时先把话务移走。最后一行查看测试 Profile 注册记录。两台话机重新注册后,核对旧入口的 Contact 是否还参与定位。
reloadxml
sofia profile training-internal restart
sofia status profile training-internal
sofia status profile training-internal reg
先在外网用 7101 拨 7102,再反拨一次。选一通按 Call-ID 找到公网侧那条腿的 INVITE 和 200 OK。FS 给外网对端的应答里,Contact 的主机和端口应能从该对端访问,音频 SDP 的 c= 应指向可达的媒体地址。看 m=audio 的端口时,如果音频段自己有 c=,以该段为准。再对照出口外侧、FS 网卡两处抓包,按当通的 UDP 地址和端口检查来回两路 RTP。SIP 两腿的 Call-ID 可以不同,关联时以测试时间、分机和对应通道为线索。保留记录前先把账号、号码和地址脱敏。
两边都听得到后,再测试挂断和保持恢复。恢复通话可能带来新的 SDP,要用当时的地址和端口检查媒体。如果这个入口还给队列坐席用,再拨 7190 走一次真实派单。分机注册成功不会改 agent 或 tier,队列送不到时还要检查 agent 的 contact 是否固定在旧入口。
四种现象分别怎么查
- 外网注册超时。出口外侧看得到 UDP 5090,FS 上看不到,就按转发规则、允许来源和主机防火墙查。请求到 FS 后有挑战却没注册成功,再核对认证域和账号。
- 7101 能拨进来,挂机异常。检查公网侧对话中的 Contact、路由集以及 ACK、BYE 的实际去向,看看是否仍指向内网或一个错误端口。出口若开了 SIP ALG,对照两侧报文,确认是否改写了地址,再按实际需要调整。
- 接通后 7101 听不到 7102。先看 FS 发往 7101 的媒体是否离开出口,再核对 7101 提供的地址与它实际收包的位置。反过来 7102 听不到 7101 时,沿 7101 到 FS 的公网映射逐段看。遇到单通时,按听不到的那一方向查,往往能少改几处配置。
- 用外网测试正常,同一个 Wi-Fi 连公网地址却失败。先看出口是否支持回流 NAT。内网设备可以继续用内网入口。若多网段环境把 VPN 或专线分错类,核对 local-network-acl 以及外内两侧实际收到的地址。它用于识别本地网络,注册授权由相应的访问控制和认证负责。
另外几项什么时候才用
固定公网地址便于从包里核对。手册还列出 host:域名、stun:服务器和 auto-nat。前者依赖地址解析,后两种分别依赖 STUN 查询、NAT-PMP 或 UPnP。选了动态方法,公网地址变化后也要重新验证 Profile 展开的地址和出口映射。STUN 查到的地址无法保证运营商允许外部主叫打进来。
apply-nat-acl 和 aggressive-nat-detection 更适合排查对端话机在 NAT 后的情况。后者会参考 SIP 报文来源和 Contact 的差别,有 SBC 或代理时,这个差别也可能来自正常的拓扑。先用单个测试终端比较启用前后 Contact 和实际发包地址,再决定是否调整。它们与本机 ext 地址解决的是两处不同的网络问题。
恢复原入口
等实验通话结束后撤下这次开的公网入口,再恢复备份 XML。重新加载 XML 并重启实验 Profile,两台话机改回原服务器地址后重做内网互拨。如果之前调整了出口规则,只恢复本次变更的条目。示例已按官方模板和标准核对,验收结果以你的测试环境为准。