上一节中我们在Teams上面用命令配置好了Voice Routing Policy并分配给用户,理论上这时他的Teams UI上面的拨号盘就会出现。同时我们也建立好了PSTN Gateway, 这样子 Phone System >>> 本地语音网关的SIP Trunk 就做好了,从Teams 管理员中心上面可以看到这条SIP Trunk的状态,如下:

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

接下来这一节,我们集中精力讲述在语音网关侧的配置,这次我会选用Direct Routing的认证网关之一:Ribbon SWe Lite 进行配置 (如何安装? 请参阅文章http://blog.ia-ask.com/scnbwy/2385961 , 安装过程非常简单,若需要在本地安装的话,可联系我取得镜像)

其中的内容包括建立语音网关至Phone System的SIP Trunk,信令组,语音路由,转换规则等,但让我们先来回顾一下Teams Voice的整个架构及前置条件准备:
(我始终认为集成系统的架构主导着具体配置,而具体配置只不过为系统架构服务而已,不了解整体架构只会永远的迷路)

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

再一次回顾一下前置条件:
1) 权限与管理员准备:O365管理员/Teams管理员;SBC管理员;本地Skype管理员;网络管理员;DNS/CA管理员;
2) 许可准备:E3+Phone System Lic or E5 lic; SBC中必要的SIP Lic;;
3) 连接到SFB Online Powershell;
4) 连接到Office 365 Powershell;
5) 已经在O365注册了,并已激活的公司域名;
6) 准备好用于SBC的公网IP与公网FQDN,并做好了公网DNS A记录;
7) 准备好含SBC FQDN的公网证书;
8) 已经制作好相关的防火墙规则,同时网络管理员确认正确;
9) 使用了认证的SBC,并已升级至最新的固件版本;
10) 若对安全有更好的要求,可以在SBC中配置ACL;

现在我们需要用到第6到第10点的条件准备了,都准备好了吗?
然后大致的整体架构图就会长这样子:
1) Teams Audio Call通过Teams送给Phone System
2) Phone System与本地语音网关建立SIP Trunk(tls), 即所谓的MS Direct Routing
3) Phone System就可以把Teams Audio Call送到本地语音网关
4) 语音网关再对接PSTN网络之后,就可以实现语音的落地了

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

I. 首先导入公网证书到SBC当中

在之前的章节中,我们已经申请完公网证书,并取得了cer后缀的证书文件了,现在把它导入到当时您生成CSR的电脑当中,目的是为了拿到证书的私钥 Private Key.

打开MMC, 并按以下图片打开电脑的证书管理控制台:

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

按如下图导入从公网证书颁发机构申请下来的证书(后缀名为cer的证书):

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

导入成功后,你会在证书的图标上面看到一把小钥匙,即表明我们导入的证书是带有私钥的:

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

最后按如下方法把带有私钥的公网证书导出,以供后续导入到SBC当中:

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

最后我们还要导出所有的根证书与中间颁发机构的证书以base64的格式导出,
(到此为止,如果同学们对数字证书加密体系不熟悉的话,可以参考这文章:http://blog.ia-ask.com/ucworld/434901,文中讲的是数字证书的原理,那么公网证书也是一样的,需要两种证书组成一条证书链(根证书+中级证书+自己的数字证书)),

如下例子说明了证书的其中一个重要作用:

经过4年的学习,我们终于毕业了。表明我们毕业的东西除了很多很多之外,其中一个就是我们有了一个红色的小本本-毕业证。在我们面试工作的时候,我们就会把毕业证展示给对方,并加上一句,你不相信我的能力,但是你应该相信这个学校吧。于是,他点点头说,你毕业于这所名牌学校,应该能力可以,那就接受你吧,于是我们就开始工作了。另外一个例子就是:还有许多个人和企业都信任合法的驾驶证或护照。这是因为他们都信任颁发这些证件的同一机构--政府,因而他们也就信任这些证件。

所以如下图需要导出两张证书,最顶端的那张为根证书,第二张为中间证书颁发机构的证书;
按之前的方法把它们导出,备用。

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置
打开网关的管理界面,导入根证书与中间颁发机构的证书到SBC当中:

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

打开之前导出的公网根证书,并导入,如下:

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

最后导入所购买的公网证书到SBC当中,检查,完成

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

最后,刷新SBC管理界面即可发现代表安全的“小绿锁”出现了:

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

II. 导入公网根证书:Baltimore
接下来,我们需要添加微软的根证书到SBC 以确保SBC信任来自MS Direct Routing的数据。因为MS Direct Routing所使用的DNS域名为sip.pstnhub.microsoft.com 便可以推断出其所使用的根证书为Baltimore根证书

下载http://cacert.omniroot.com/bc2025.pem,最后按之前方法导入到SBC当中

附:根证书信息:
Baltimore Cyber Baltimore CyberTrust Root with Serial Number: 02 00 00 b9 and SHA
fingerprint: d4:de:20:d0:5e:66:fc: 53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

最后完成了证书的导入到SBC的工作之后,就可以开始配置语音网关了。

III. 配置Node-Level Settings
下图的四个信息一定要写对,包括主机名,DNS(一定要能解释到公网DNS),时区与时间服务器

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

IV. 配置Node Interface
检查我们用于映射到公网的物理网卡

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

V. 配置SIP Profile
接下来这一步很重要,通过配置SIP Profile可以让SBC在SIP消息头中带有SBC FQDN的信息,让MS Phone System可以在公网中找到SBC,并向它发送回包。

Session Times: Enable
FQDN in From Header: Static
FQDN in Contact Header: Static
Static Host: teams.xxxx.com 即SBC的FQDN
Origin Field Username: teams.xxxx.com 即SBC的FQDN

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

还简单的方法是直接把PSTN Gateway FQDN配置在Domain下面,这样就不用做SIP Profile配置了,特别是一台网关对应多个租户的情况下,如下解释:

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

VI. 配置SBC TLS Profile
因为整个Direct Routing的对接过程需要加密,所以需配置一个Phone System TLS Profile, 稍后要使用:

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

VII. 配置Media Crypto Profile
接下来配置SBC与Phone System之间的媒体流加密机制,统一使用AES_CM_128_HMAC_SHA1_80,如下图

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

VIII. 配置Media List
接着,配置一个媒体列表用于告诉SIP Trunk(Direct Routing) 所使用的媒体编码与加密类型的:
这里就需要用到刚刚我们配置的Media Crypto Profile了

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

IX. 配置SIP Server Table
按照如下配置,创建一个SIP Server Table, 并增加三台Phone System服务器:sip.pstnhub.microsoft.com;sip2.pstnhub.microsoft.com;sip3.pstnhub.microsoft.com

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

X. 配置号码转换规则 Transformation Rules
然后到这里为止,有必要讲一讲Ribbon SWe Lite/SBC1k/SBC2k的一些基本的呼叫流程/工作原理了,分为三大块:信令组Signaling Group; 呼叫路由表 Call Routing Table; 号码转换规则 Transformation Table;

Teams呼叫来到了语音网关之后是如何被处理,如何被路由的呢?这样都反映在下面的图片里面,而且也被反映在接下来的配置里面,具体的流向如下:
1) 在语音网关里面会建立两个信令组,分别为Teams信令组与PSTN信令组。它的作用就是根据来源IP,端口号,协议(如:52.114.7.24:5061 TLS)来选择不同的信令组。我的理解就是把对应的信令组激活。
2) 当激活了Teams信令组后,会选择对应的呼叫路由表(如:From Teams 的路由表)
3) 呼叫进入了From Teams路由表之后,后面还有多个呼叫路由的条目/子路由(如:To PSTN), 在子路由里面会指定呼叫的下一跳信令组是哪里(从命名可知下一条SG为PSTN信令组)
4) 现在问题来了,凭什么条件可以执行子路由呢?这里有个前提条件就是呼叫必须符合号码转换规则Transformation Table里面规则才能会被路由的,不然就再去匹配下一条子路由,直到匹配为止(即你的主叫是什么,被叫是什么都需要规定好)
5) 在匹配的同时,Transformation还要做一个工作,就是主被叫的号码转换(为什么?因为Teams Phone System使用E.164标准,但中国的PSTN拨号计划不使用E.164, 这样的话,我们就需要把 E.164前面的“+”号给去掉,同时对号码做点小修改了)
6) 第四步与第五步完成后,信令送回给路由组处理,并送给下一跳信令组。
7) 信令送给目的的信令给(如:PSTN信令组),整个流程完成。

那么,流程与配置是反着来的,所以我们首先要开始配置号码转换规则Transformation Table

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

理解好了整个流程,就可以开始配置号码转换规则,首先建立两条空的规则:
1) From PSTN to Teams
2) From Teams to PSTN
然后才开始具体写里面的规则,以下做了一条简单的正则转换:把被叫的“+”号去掉

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

因为在上一节中,我们已经把Teams的主叫与被叫都定义为E164标准的,例如当你呼叫一个上海的号码时,会是这样的:
Teams LineURI - 主叫:+86 21 87654321
被拨打的号码 - 被叫:+86 21 32132132
但出局到PSTN时,运营商网络是不认这种格式的,所以需要做一些主被叫转换,列举如下:

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

XI. 配置语音路由 Call Route Table
有了号码转换规则,接着开始配置语音路由 1)From Teams 2)From PSTN
Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

在From Teams语音路由里面配置子路由 To PSTN, 同时指定匹配的Transformation Rule与下一跳的信令组SG, 如下图:

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

同理,在From PSTN语音路由里面配置子路由 To Teams, 同时指定匹配的Transformation Rule与下一跳的信令组SG, 如下图:

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

XII. 配置SIP Trunk: SBC >>> Phone System

因为SIP Trunk(Direct Routing)是双向的,所以以下步骤是关键:
配置SBC信令组SIP Signaling Group, 它会监听来自MS Phone System的的数据流量,并且向Phone System发送数据,如下图配置信令组:

1) 在SG中指定当这条信令组被激活后的语音路由;因为现在是配置Teams信令组,所以选择From Teams (有没有发现命名对于配置是多么的重要)
2) 在SIP Profiles里面选择 “Teams Direct Routing”
3) 在SIP Server Table选择之前创建的Teams Phone System
4) 选择信令与媒体的私网IP,一般为SBC的IP
5) 输入SBC对应的公网IP
6) 进行NAT, 把SBC发布到外网
7) 选择Teams信令组的端口,协议,TLS配置
8) 输入联盟IP地址,为Teams Phone System的几个公网IP

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

D. 如何使用SIP Option 测试

至此,本地的SBC与O365 Phone System对接的SIP trunk就做好了,如下图可以看出与O365 Phone System的信令组状态通了,同时在Counters里面可以看到SIP Option有正常的Incoming & Outgoing与2xx Incoming & Outgoing, 说明与Phone System的状态检测正常通过了,那么至少可以证明SBC与Phone System有数据交互,并且一旦信令能落地到SBC,基本上语音方面没有什么是做不到的。

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

Phone System与SBC正是使用SIP Option这种心跳检测机制来判断链路的状态的:

Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

6. 实际测试结果

以下是我在测试环境中用软终端Eyebeam连接SBC, 然后Eyebeam呼叫Teams的效果:
Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

Teams呼叫Eyebeam的效果:
Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

当然,最重要的还是Teams与手机通讯啦,如下:
Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

最后,本系列终于写完了,主要就是实现到使用Teams语音落地的本地语音网关,然后我们就可以像Skype那样打电话了,这个功能点很重要,主要是当我们从Skype for Business上面迁移到Teams的时候,我们的语音也必须确保在Teams上面能用,特别是在中国,UC系统无法拨打外线是比较难以想像的。事实在本系列虽然是Step by Step地讲述每一个配置步骤,但是也只能起到抛砖引玉的作用,也只能把简单的配置路径点明一下,实际的项目当中会有更多其它的东西需要考虑的,感谢各位。