Microsoft Teams Direct Routing with Issabel (Asterisk)

Why?

FYI

  • Should have Issabel server properly installed with ip public and . The server firewall should be hardened by only allowing Carrier and Microsoft cloud ip address blocks (52.112.0.0/14). Even better if the only maintenance can only be accessed by VPN. Dont open your Issabel webGUI, SSH, SIP & RTP ports to public internet whenever possible.
  • My Issbel (Asterisk) server is already connected to Ofon as the PSTN Carrier, and already has a DID assigned.
  • Requires to edit chan_sip.c to comply with Microsoft Teams Phone System that demands SIP From and Contact header host part to be FQDN. From header is easy, just add fromdomain at the Asterisk trunk config and you’re good. The Contact header is the tricky one, based on this screenshot clue (stolen from thread https://community.asterisk.org/t/fqdn-in-the-contact-header/77625):
  • By half-assed editing the chan_sip.c , I expect there will be repercussion somewhere else in the system (plus I am no good at C, should find a better way to insert the change with more elegant solution), so dont share the PBX with something else for production, and use this as POC only.
  • Dont ever think to commercialize this without Microsoft approval, nor use this for officials. You may not be able to open tickets if you encounter problems with this installation although you are a legit Office 365 tenant with Phone System license. The certified SBC list can be found here.
  • Should have access to DNS server to add TXT type record for domain authentication.
  • Should have global admin account to make changes in O365 portal.
  • In this example, I have two E1 O365 + Phone System licenses. One to be assigned to my account and one to be assigned to SIP trunk domain dummy user.
  • You cant do multi tenant with this installation. Asterisk itself is a single realm (CMIIW).
  • Still cant find how to modify Contact header in OPTIONS, hence you’ll find tlsdontverifyserver=yes in Issabel general config.
  • Will periodically update this post with something new whenever I find improvement. So forgive me if you find something different when you read back the post later.

Microsoft Teams Phone System Side Config

In this stage you will need to add an SSL’ed domain to Office 365 portal. Microsoft-recommended CA list can be found here. I myself use GeoTrust.

  • Microsoft has a very detailed documentation that can be found at https://docs.microsoft.com/en-us/microsoftteams/direct-routing-plan . I wont rewrite the details here.
  • Using global admin to add domain (mine is ast.ofon.biz), to O365 admin portal.
  • Add a dummy user for that domain and assign O365 + Phone System license for that dummy user. For example, my dummy user for the newly added domain is sip@ast.ofon.biz. If successfully added, I will find the user in Active users table like this:
  • that is how Microsoft Teams will recognize the SIP trunk to our Issabel (Asterisk) server and assign license to the trunk.
  • Login using powershell to your account using global admin user. Again, the powershell preparation wont be repeated here since the detailed documentation can be found at https://docs.microsoft.com/en-us/microsoftteams/direct-routing-configure. Next steps will require us to import Sfbonline module to powershell.
  • Start the session (you will be asked for password on a popped up windows) :
$sfb = New-CsOnlineSession -Username "admin@ofonio.onmicrosoft.com"
Import-PSSession $sfb -AllowClobber
  • Add the Issabel (Asterisk server) as PSTN Gateway:
New-CsOnlinePSTNGateway -Fqdn ast.ofon.biz -SipSignalingPort 5061 -ForwardCallHistory $true -Enabled $true -ForwardPai $true -MaxConcurrentSessions 5
  • See if the server is properly added with Get-CsOnlinePstnGateway :
 Get-CsOnlinePSTNGateway


Identity                            : ast.ofon.biz
InboundTeamsNumberTranslationRules  : {}
InboundPstnNumberTranslationRules   : {}
OutboundTeamsNumberTranslationRules : {}
OutboundPstnNumberTranslationRules  : {}
Fqdn                                : ast.ofon.biz
SipSignalingPort                    : 5061
FailoverTimeSeconds                 : 10
ForwardCallHistory                  : True
ForwardPai                          : True
SendSipOptions                      : True
MaxConcurrentSessions               : 5
Enabled                             : True
MediaBypass                         : False
GatewaySiteId                       :
GatewaySiteLbrEnabled               : False
FailoverResponseCodes               : 408,503,504
GenerateRingingWhileLocatingUser    : True
PidfLoSupported                     : False
MediaRelayRoutingLocationOverride   :
ProxySbc                            :
BypassMode                          : None
  • Create a routing and routing policy that will utilize the Issabel (Asterisk) server:
Set-CsOnlinePstnUsage -Identity Global -Usage @{Add="Default"}

New-CsOnlineVoiceRoute -Identity "CatchAll" -NumberPattern ".*" -OnlinePstnGatewayList ast.ofon.biz -Priority 1 -OnlinePstnUsages "Default"

New-CsOnlineVoiceRoutingPolicy -Identity "DefaultVoicePolicy" -OnlinePstnUsages "Default"
  • Assign DID & VoiceRoutingPolicy to my account.

Issabel (Asterisk) Side Config

We will have two SIP connection configs for Microsoft Teams Phone System and two SIP connection configs for Carrier. Each connection will have different contexts. One SIP connection for Microsoft Teams will be from-internal, so call from Microsoft Teams will be treated as call from extension. And the other SIP connection will be treated as outbound trunk with from-trunk context. Same deal with the two SIP connections toward Carrier.

Microsoft provides 3 hosts to connect a SIP trunk with:

  • sip.pstnhub.microsoft.com
  • sip2.pstnhub.microsoft.com
  • sip3.pstnhub.microsoft.com

This example will only test the first one (sip.pstnhub.microsoft.com).

  • Adding Trunk to Microsoft Teams from PBX -> PBX Configuration -> Trunks. Add SIP Trunk and fill these parameters :
Trunk Name: MSTeams-Outbound
PEER Details:
disallow=all
host=sip.pstnhub.microsoft.com
type=peer
transport=tls
port=5061
allow=all&ulaw
qualify=yes
dtmfmode=rfc2833
context=from-trunk
insecure=port,invite
nat=force_rport,comedia
fromdomain=ast.ofon.biz
encryption=yes
  • And as “extension” add the following configs to sip_custom.conf using PBX -> Tools -> Asterisk File Editor :
[MSTeams-Inbound]
disallow=all
host=sip.pstnhub.microsoft.com
type=friend
transport=tls
port=5061
allow=all
allow=ulaw
qualify=yes
dtmfmode=rfc2833
context=from-internal
insecure=port,invite
nat=force_rport,comedia
fromdomain=ast.ofon.biz
  • To refer to certifcate files, go to PBX -> PBX Configuration -> Unembedded IssabelPBX. At the following page, go to Settings -> Asterisk SIP Settings and then Add field at the Other SIP Settings with these:
realm=ast.ofon.biz
tlsenable=yes
tlsbindaddr=0.0.0.0:5061
tlsprivatekey=/etc/asterisk/keys/star_ofon_biz.key
tlscertfile=/etc/asterisk/keys/star_ofon_biz.pem
tlscafile=/etc/asterisk/keys/star_ofon_biz.crt
tlscipher=ALL
tlsclientmethod=tlsv1
tlsdontverifyserver=yes
  • Save and reload the config.
  • Add the Outbound Routes to Microsoft Teams and Carrier (Microsoft Teams outbound should be aboive the Carrier). Since my carrier mostly sends with prefix 0, I have to convert it to E.164. Please modify these according to your apporpriate settings:

At this point, you should be able to call outbound from Microsoft Teams account but not the other way (inbound). As mentioned before, Microsoft Teams Phone System require us to send From and Contact header host as FQDN. The trunk settings in Asterisk wont change Contact header host to FQDN hence we’ll receive this message:

INVITE sip:+622430000062@sip.pstnhub.microsoft.com:5061 SIP/2.0
Via: SIP/2.0/TLS xxx.xxx.xxx.xxx:5061;branch=z9hG4bK4e781f8a;rport
Max-Forwards: 70
From: "02139700001" <sip:02139700001@ast.ofon.biz>;tag=as36acd9d9
To: <sip:+622430000062@sip.pstnhub.microsoft.com:5061>
Contact: <sip:02139700001@xxx.xxx.xxx.xxx:5061;transport=tls>
Call-ID: 2239ff467456d8f03c4348826168d7a6@ast.ofon.biz
CSeq: 102 INVITE
User-Agent: Asterisk 16.7.0
Date: Fri, 08 May 2020 04:45:38 GMT
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
Content-Type: application/sdp
Content-Length: 1324

...
...
...
SIP/2.0 403 Forbidden
FROM: "02139700001"<sip:02139700001@ast.ofon.biz>;tag=as36acd9d9
TO: <sip:+622430000062@sip.pstnhub.microsoft.com:5061>
CSEQ: 102 INVITE
CALL-ID: 2239ff467456d8f03c4348826168d7a6@ast.ofon.biz
VIA: SIP/2.0/TLS xxx.xxx.xxx.xxx:5061;branch=z9hG4bK4e781f8a;rport
REASON: Q.850;cause=63;text="735a16a2-5f83-4cb0-bdec-9cb64edff551;Provided Trunk FQDN 'xxx.xxx.xxx.xxx' is not allowed. Connection allows following fqdns: *.ofon.biz, ofon.biz, *.ofon.biz."
CONTENT-LENGTH: 0
ALLOW: INVITE,ACK,OPTIONS,CANCEL,BYE,NOTIFY
SERVER: Microsoft.PSTNHub.SIPProxy v.2020.5.6.2 i.ASEA.2

chan_sip.c

There is no Asterisk source in Issabel distro so we have to get it ourself. From Issabel linux console, git clone the Asterisk github and checkout for 16.7.0 (since this is my Issabel’s Asterisk version).:

cd /usr/src
git clone https://github.com/asterisk/asterisk.git
cd asterisk
git checkout 16.7.0

Edit file /usr/src/asterisk/channel/chan_sip.c. Look at build_contact() we will find these lines:

static void build_contact(struct sip_pvt *p, struct sip_request *req, int incoming)
{
        char tmp[SIPBUFSIZE];
        char *user = ast_uri_encode(p->exten, tmp, sizeof(tmp), ast_uri_sip_user);
        int use_sips;
        char *transport = ast_strdupa(sip_get_transport(p->socket.type));

        if (incoming) {
                use_sips = uas_sips_contact(req);
        } else {
                use_sips = uac_sips_contact(req);
        }

        if (p->socket.type == AST_TRANSPORT_UDP) {
                ast_string_field_build(p, our_contact, "<%s:%s%s%s>", use_sips ? "sips" : "sip",
                        user, ast_strlen_zero(user) ? "" : "@",
                        ast_sockaddr_stringify_remote(&p->ourip));
        } else {
                ast_string_field_build(p, our_contact, "<%s:%s%s%s;transport=%s>",
                        use_sips ? "sips" : "sip", user, ast_strlen_zero(user) ? "" : "@",
                        ast_sockaddr_stringify_remote(&p->ourip), ast_str_to_lower(transport));
        }
}

The last conditional lines are where the Contact header gets value from. Since we only need to modify for TCP transport, edit the line:

 else {
                ast_string_field_build(p, our_contact, "<%s:%s%s%s;transport=%s>",
                        use_sips ? "sips" : "sip", user, ast_strlen_zero(user) ? "" : "@",
                        ast_sockaddr_stringify_remote(&p->ourip), ast_str_to_lower(transport));
        }

to become :

 else {
                ast_string_field_build(p, our_contact, "<%s:%s%s%s;transport=%s>",
                        use_sips ? "sips" : "sip", user, ast_strlen_zero(user) ? "" : "@",
                        p->fromdomain, ast_str_to_lower(transport));
        }

p->fromdomain will follow whatever “fromdomain=” value in the SIP trunk config.

Update:
Got input from Igo Cunha that the call from MSteams to PSTN will be disconnected after 6 sec. I can confirm I got random disconnect call at about 6 sec from the same direction. Try replace:
 
ast_sockaddr_stringify_remote(&p->ourip) 

with your Asterisk's FQDN string (e.g "ast.ofon.biz" in my case) instead of p->fromdomain.

Thanks Igo!

I understand this is not elegant way, but that should do it. Compile the source and we will have brand new chan_sip.so. Backup the original one and replace it after:

copy /usr/lib64/asterisk/modules/chan_sip.so /usr/local/src/chan_sip.so.original
copy /usr/src/asterisk/channels/chan_sip.so /usr/lib64/asterisk/modules/chan_sip.so

then reload the module from Asterisk console:

asterisk -vr

ast*CLI> module reload chan_sip.so
Module 'chan_sip.so' reloaded successfully.
 Reloading SIP

Now test call to inbound, we should have correct SIP Contact header requirement as follows:

INVITE sip:+622430000062@sip.pstnhub.microsoft.com:5061 SIP/2.0
Via: SIP/2.0/TLS 103.135.74.15:5061;branch=z9hG4bK394b6483;rport
Max-Forwards: 70
From: "02139700001" <sip:02139700001@ast.ofon.biz>;tag=as20858906
To: <sip:+622430000062@sip.pstnhub.microsoft.com:5061>
Contact: <sip:02139700001@ast.ofon.biz;transport=tls>
Call-ID: 1a5d05f10eadb0036683f88a6177f80f@ast.ofon.biz
CSeq: 102 INVITE
User-Agent: Asterisk 16.7.0
Date: Fri, 08 May 2020 04:54:36 GMT
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
Content-Type: application/sdp
Content-Length: 1324

and the call went through:

Remarks

Although it is possible to connect Direct Routing with Asterisk, still easier using Kamailio (and OpenSIPS) since they’re built solely for SIP packet engineering. Until some of them become certified with Microsoft, I guess I will be using the already ceritfied ones, like Sonus or AudioCodes, or just connect to a hosted Direct Routing Provider in Indonesia, like Ofon. Alternatively, there are Kamailo based products start providing hosted DR, like Gilawa and dSIPRouter. Check them out.

Links:

Microsoft Teams Phone System (Tulisan 2)

(Dari Tulisan 1)

Setelah sebelumnya membahas segala sesuatu yang non konfigurasi tentang MSteams Direct Routing, sekarang waktunya kita melihat bagaimana melakukan setting di sisi MSTeams Phone System yang sudah tersambung dengan SBC MSteams Direct Routing.

Asumsi:

  • Tulisan ini untuk pelanggan SBC Carrier hosted Direct Routing sehingga konfigurasi SBC tidak dibahas. (Lain waktu saya janji akan membahas untuk yang on premise).
  • Sebagai pelanggan SBC Carrier hosted Direct Routing, saya tidak perlu menyiapkan sertifikat SSL dan license Phone System yang dibakar untuk menjadi sip trunk.
  • Dalam contoh ini saya berlaku sebagai tenant Office 365 paket E1 dengan tambahan license Phone System untuk satu user. User yang saya gunakan untuk mengkonfigurasi pun harus punya role sebagai Global Admin. Untuk assign license dan role bisa dilakukan di https://portal.office.com, dan tidak akan dibahas karena bisa dibaca di link ini.
  • Nomer telpon/DID sudah disiapkan dan sudah dikonfigurasi di dalam routing dari SBC.

TOPOLOGI

Seperti yang sudah saya sampaikan di atas, contoh setting di sini adalah untuk pelanggan SBC Carrier hosted Direct Routing yang perangkat dan nomer DID sudah disediakan oleh service provider, menggunakan layanan dari Ofon, dengan topologi seperti berikut:

Kita akan mengkonfigurasi area yang ada di dalam kotak garis putus-putus warna merah, dengan mengarahkan MSTeams Phone System untuk mengenali SBC di Ofon dan meroutingkan panggilan ke sana.

PERSIAPAN & SETUP via POWERSHELL

Persiapan powershell memerlukan user Global Admin, untuk instalasi module-module yang bakal diperlukan. Kita mulai.

Asumsi:

  • Tenant yang digunakan adalah domain.tld, dengan username user@domain.tld. License Office 365 E1 + Phone System.
  • User Global admin yang digunakan: admin@domain.onmicrosoft.com
  • Nama SBC yang disediakan oleh operator adalah domain.ofon.biz port 5061.
  • Nomer DID : +622430000062 (kode wilayah Semarang).

Download dan install Module Skype for Business untuk powershell di :

https://www.microsoft.com/en-us/download/details.aspx?id=39366

Jalankan powershell dengan klik icon :

Image result for powershell icon

atau bisa dengan kombinasi Windows button + R, lalu ketik: powershell dan OK.

Dalam beberapa kasus, karena ada faktor pengamanan di Windowsnya sendiri, powershell dijalankan sebagai administrator dengan pilihan Run as Administrator.

Import module Skype for Business Online Connector:

Import-Module SkypeOnlineConnector

Jika mengimport module di atas mendapatkan error seperti berikut:

Import-Module: File C:\Program Files\Common Files\Skype for Business Online\Modules\SkypeOnlineConnectorStartup.psm1 cannot be loaded because running script is disabled on this system. For more information, see about_Execution_Policies at https://go.microsoft.com/fwlink/?LinkID=135170.
At line:1 char:1
+ Import-Module SkypeOnlineConnector
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo	    : SecurityEror: (:) [Import-Module]. PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess.Microsoft.PowerShell.Commands.ImportModuleCommand

disebabkan system merestrict import module dari luar. Cukup jalankan perintah berikut:

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

silahkan dicoba lagi.

Sekedar jaga-jaga apabila diperlukan untuk troubleshoot di waktu mendatang, saya juga mengimport dua module berikut ini:

Install-Module -Name AzureAD
Install-Module MSOnline

Langkah-langkah di atas hanya dilakukan sekali saja pada saat module-module di atas belum terinstall. Untuk kegiatan operasional, administrasi, dan manajemen (OAM) selanjutnya cukup di mulai dari langkah-langkah di bawah ini:

Lakukan autentikasi untuk menjalankan Skype for Business connector :

$sfb = New-CsOnlineSession -UserName "admin@domain.onmicrosoft.com"
Start WinRM Service
WinRM service is not started currently. Running this command will start the WinRM service.

Do you want to continue?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): 

Jawab “Y” di pertanyaan “Do you want to continue?” yang kemudian akan muncul prompt password. Isikan password Global Admin yang kita peroleh dari pembelian Office 365 E1 + Phone System.

Lalu masukkan perintah:

Import-PSSession $sfb -AllowClobber

Dari sini kita sudah siap memasukkan informasi dari provider SBC hosted Direct Routing.

  • Tambahkan SBC provider ke MSTeams Phone System:
New-CsOnlinePSTNGateway -Fqdn domain.ofon.biz -SipSignallingPort 5061 -ForwardCallHistory $true -Enabled $true -ForwardPai $true -MaxConcurrentSessions 5
  • Buat grouping PSTN Usage dengan nama “Default”. Penamaan ini bebas, jadi di sini cuma contoh saja.
Set-CsOnlinePstnUsage -Identity Global -Usage @{Add="Default"}
  • Tambahkan routing baru dengan memasukann SBC ke group Usage “Default”, dan juga buat pattern panggilan ke nomer mana pun (“.*”) yang akan dilewatkan ke SBC tersebut, lalu beri nama sebagai “CatchAll” :
New-CsOnlineVoiceRoute -Identity "CatchAll" -NumberPattern ".*" -OnlinePstnGatewayList domain.ofon.biz -Priority 1 -OnlinePstnUsages "Default"
  • Buat Routing Policy dengan nama “DefaultRoutingPolicy” yang berisi PSTN usage “Default”:
New-CsOnlineVoiceRoutingPolicy -Identity "DefaultVoicePolicy" -OnlinePstnUsages "Default"
  • Aktifkan fitur Enterprise Voice dan sematkan DID/nomer telepon yang didapat dari service provider ke user@domain.tld
Set-CsUser -Identity "user@domain.tld" -EnterpriseVoiceEnabled $true -HostedVoiceMail $true -OnPremLineURI tel:+622430000062
  • Sematkan Voice Routing Policy “DefaultVoicePolicy” yang telah kita buat ke user tersebut
Grant-CsOnlineVoiceRoutingPolicy -Identity "user@domain.tld" -PolicyName "DefaultVoicePolicy"
  • Jika step-step di atas sudah benar, dialpad akan muncul lengkap dengan DID di MSTeams app/client user@domain.tld dan coba lakukan test panggilan ke PSTN.

Bingung dengan banyaknya step di atas? Akan saya coba jelaskan dengan gambar apa yang telah kita lakukan dalam langkah-langkah tersebut :

  • Kotak paling dalam adalah konfigurasi yang dibuat terlebih dahulu. Contoh di sini adalah penambahan PSTNGateway domain.ofon.biz. Saat ini masih menggunakan satu PSTNGateway. Kita bisa menambahkan lebih dari satu PSTNGateway di sini.
  • Buat tagging dengan perintah PSTN Usage. Contoh di sini : “Default”. Kita bisa memberikan nama yang lebih berarti. Misal kita memiliki lebih dari satu PSTNGateway yang digunakan untuk beda keperluan misal SLJJ dan SLI, bisa dinamakan “Nasional” dan “Internasional”.
  • Buat CsOnlineVoiceRoute dengan nama “CatchAll”, pattern routing “.*”, OnlinePSTNGatewayList hanya satu, yaitu “domain.ofon.biz” dan PSTNUsage “Default”.
  • Buat voice routing policy dengan nama “DefaultVoicePolicy” dengan PSTNUsage “Default”.
  • Sematkan DID/nomer telepon ke user@domain.tld dan set EnableVoiceEnterprise dengan $true. Setelah itu sematkan routing voice policy yang telah kita buat ke user tersebut.

Kenapa harus seribet itu?

Bayangkan membuat skenario seperti di gambar berikut:

Skenario di atas menunjukkan bahwa sangat memugkinkan setiap user memiliki Voice Policy yang berbeda satu dengan yang lainnya. Dengan mengkelompokkan masing-masing fungsi, kita bisa membuat skenario yang lebih rumit sekalipun.

Dari contoh bagan di atas, kita memiliki dua user yaitu user01@domain.tld dan user02@domain.tld.

user01@domain.tld memiliki policy yang memperbolehkan panggilan ke mana pun (lokal, SLJJ, SLI dan emergency) melalui 3 sbc yang telah disematkan untuknya.

Sedangkan user02@domain.tld hanya memiliki akses panggilan ke nomer lokal, SLJJ dan nomer-nomer emergency walaupun memiliki akses ke 4 sbc. 2 sbc bertama khusus untuk panggilan ke nome-nomer emergency seperti 110, 123, 112, 113, 1500xxx dan 140xx. Dan 2 sbc lainnya ke nomer-nomer dalam nasional (yang diawali dengan +62 atau 0).

Lalu bagaimana jika hanya 1 SBC untuk routing yang berbeda?

Sama seperti bagan di atas, hanya SBC cukup satu saja seperti gambar bagan di bawah ini (sbc01.ofon.biz port 5061) :

Links:

Microsoft Teams Direct Routing (Tulisan 1)

Kali ini saya menambahkan kategori dalam blog saya yang khusus membahas Microsoft Teams Direct Routing. Pembahasan ini akan terbagi menjadi (rencananya sih) dua. Mungkin bisa lebih, karena memang agak panjang ceritanya. Berikut adalah konteks tentang pembahasan Microsoft Teams.

Latar Belakang

Salah satu bundling Office 365 untuk kebutuhan telekomunikasi suara selama ini dilakukan melalui Skype for Business. Di kantor tempat saya bekerja dulu, kebetulan memiliki anak perusahaan yang berkecimpung di licensing Microsoft (Azzure, O365, dst). Waktu itu (2016 – 2017) saya sempat menggunakan Skype for Business Online. Saya tidak paham semua licensing Microsoft jadi saya tidak tau saya menggunakan yang tipe apa. Icon Skype nya yang warna putih seperti ini:

alih-alih yang berlatar belakang biru dengan hurup S putih.

Waktu itu untuk tersambung ke PSTN, dibutuhkan Cloud Connector. Untuk keperluan Cloud Connector ini, jika servernya install sendiri memerlukan 4 node server (bisa VM, bisa baremetal) dengan resource dan kapasitas yang besar sekali. Saya lupa pastinya berapa, tapi cukup besar untuk hitungan resource server pada saat itu (2016). Dan rasanya ndak perlu juga diingat-ingat karena saya tidak tertarik memasangnya. Opsi lain adalah dengan membeli appliance (waktu itu ditawari dari AudioCode) dengan harga mencapai ratusan juta rupiah, sekali lagi saya lupa pastinya berapa tapi mendekati IDR 200 juta. Dan geblegnya, Cloud Connector tersebut hanya bisa satu realm. Tentu saja terlalu overkill untuk perusahaan yang tidak sekelas BUMN atau swasta yang besar.

Lalu pada tanggal 2 November 2016, produk Microsoft Teams diumumkan (selanjutnya saya sebut sebagai MSTeams saja). MSTeams direncanakan akan menggantikan Skype keseluruhan pada tanggal 31 Juli 2021.

Kenapa MSTeams ?

Pernah dengar buzzword Unified Communication? Ceritanya semua kanal komunikasi dikonsolidasikan untuk kemudahan dalam bekerja. Saya pernah baca di buku Cisco lama, menurut mereka (saat itu) Unified Communication itu adalah mengabstraksi *halah* link telekomunikasi seperti POTS, TDM, SIP, H323, fax, dan seterusnya. Mungkin….ini mungkin lhoo.. ini yang disebut UC 1.0. Awal-awal belajar VoIP memang saya sering menggabungkan beberapa protokol sambungan telepon seperti di atas agar dapat diakses dengan mudah.

Lalu belakangan muncul yang namanya konsolidasi komunikasi dengan menggabungkan email, chat, fax, dan telekomunikasi suara menjadi satu platform. Kayaknya sih ini yang namanya UC 2.0.

Lalu sekarang UC 3.0. Saya masih baca-baca lebih jauh tentang definisi terakhir ini tapi sependek yang saya pahami, UC 3.0 ini buzzwordnya menggabungkan 4 pilar utama yaitu Customer Experience (CX), User Experience (UX), Teams Experience (TX), dan Business Experience (BX). Ada dua pemain yang paling keliatan saat penulisan ini yaitu Slack dan MSTeams. Keduanya menyediakan kolaborasi berdasarkan 4 pilar di atas. Gratis sampai dengan penggunaan fitur tertentu dan berbayar ketika mencapai fitur lainnya. Google Hangout Meet yang terus menjadi Google Meet pun akhir-akhir ini juga tampaknya mulai menyusul.

Kembali ke MSTeams. Salah satu kelebihan yang sesuai dengan bidang saya adalah kemampuannya tersambung ke PSTN, yang memungkinkan SBC melayani lebih dari satu realm.

MSTeams menyediakan dua cara untuk tersambung ke PSTN. Yang pertama adalah Calling Plan. Calling Plan ini menjadikan Microsoft sebagai operator/penyedia layanan telepon, tapi hanya di beberapa negara yaitu (per tanggal tulisan ini):

  • Belgium
  • Canada
  • France
  • Germany
  • Ireland
  • Puerto Rico
  • Netherlands
  • Spain
  • United Kingdom (U.K.)
  • United States (U.S.)

Sebenarnya ada dua lagi yatu Jepang dan Australia. Tapi nomer Jepang dan Australia hanya bisa digunakan di dalam negara masing-masing sehingga ada perlakuan khusus.

Jadi pada dasarnya kita bisa menggunakan nomer dari daftar negara di atas (kecuali tentu saja Australia dan Jepang). Lalu membeli talk time nya dengan list harga ada di sini.

Kelebihannya adalah, kita tidak perlu membeli SBC atau berlangganan cloud SBC untuk tersambung ke PSTN, karena semua sudah ditangani oleh Microsoft. Kekurangannya? Khususnya bagi orang Indonesia, tidak ada nomer dengan kepala +62.

Cara kedua untuk tersambung ke PSTN adalah dengan fitur Direct Routing. Cara ini untuk mengakomodasi pengguna yang membutuhkan nomer di luar list negara di atas. Kalau istilah bakulnya, BYOC, Bring Your Own Carrier. Nah, cara ini membutuhkan SBC. SBC nya sendiri bisa dengan dua cara, on premise atau Carrier hosted SBC. On premise artinya, perangkat SBC berada di lokasi pengguna, bisa berupa appliance maupun vm private cloud pengguna, dan digunakan hanya oleh pengguna tersebut (CAPEX). Atau pengguna juga dapat meletakknya di layanan cloud seperti Azure dan AWS. Sedangkan Carrier hosted SBC, perangkat disediakan operator. Perawatan, pemeliharaan, dan operasi dilakukan oleh operator (OPEX), walhasil SBC dapat digunakan rame-rame oleh banyak pengguna dari realm/domain yang berbeda.

Hal lain yang perlu diketahui, untuk on premise SBC diperlukan:

  • CAPEX untuk pembelian perangkat SBC, baik itu VM di private cloud atau public cloud, atau dalam bentuk hardware/appliance.
  • Satu license Phone System untuk “dibakar” sebagai sambugan ke cloud MSTeams.
  • SSL certificate
  • Sambuang telepon yang hendak digunakan di site SBC.

Ke-4 hal pertama di atas tidak diperlukan ketika menggunakan layanan Carrier hosted SBC.

Baik layanan Calling Plan maupun Direct Routing, masing-masing membutuhkan license tambahan yang namanya license Phone System dari Microsoft. Pada awal saya ngoprek, baru ada 2 Office 365 yang bisa ditambahkan license, yaitu E1 dan E3. Sedangkan jika membeli E5, otomatis sudah mendapatkan license Phone System.

Kabar terakhir, di beberapa produk SKU sudah bisa dilakukan license Phone System. Berita lengkapnya bisa dibaca di link ini. Dan perlu diketahui, untuk Audio Conference yang bisa dihost di cloud MSTeams diperlukan license yang berbeda lagi. Sebaiknya dibaca baik-baik kebutuhannya atau bisa berkonsultasi dengan beberapa rekanan Microsoft di Indonesia seperti VibiCloud, Svarakom, Asaba, Master System, dst.

Sepanjang tahun 2019, saya terlibat deployment Carrier hosted SBC yang dilakukan oleh Ofon. Dalam pembahasan teknis nanti, mungkin saya tidak akan menulis setting Carrier hosted SBC, tapi selama bermain dengan MSTeams Direct Routing, saya sempat mendapat pinjaman SBC appliance Ribbon/Sonus SBC1000 dari Svarakom dan AudioCodes Mediant800 dari Tecnomic.

Kalau yang dua ini kapan-kapan saya bisa share. Untuk produk-produk lainnya silahkan hubungi ke-2 vendor di atas untuk keterangan lebih lanjut mengenai produk dari Ribbon Communication dan AudioCodes.

Koneksi Ke MSTeams Phone System

Sebenarnya sambungan SBC ke MSTeams Phone System cloud hanya menggunakan SIPS (Secure SIP) trunk + SRTP. Sesimple itu. Tapi Microsoft melakukan sertifikasi merk SBC yang bisa tersambung ke cloudnya. List SBC tersebut (per tanggal tulisan ini) adalah

  • AudioCodes
  • Ribbon Communications
  • ThinkTel
  • Oracle
  • TE-SYSTEMS
  • Metaswitch

sepertinya daftar tersebut akan terus bertambah. Sebenarnya bisa saja sih menggunakan Asterisk, Kamailio ataupun FreeSWITCH untuk menggantikan brand di atas. Hanya saja, jika suatu saat ada kendala, bakal tidak bisa open ticket ke Microsoft karena jika mereka tau SBC yang bukan Microsoft Certified, konon akan diblacklist. Saya ndak yakin juga sejauh apa blacklistnya.

Sebaiknya yang belum Microsoft certified cukup buat test atau PoC saja, jangan coba-coba dikomersilkan jika tidak ingin pelangguna protes keras karena diblacklist.

Detail produk yang dapat melakukan MSTeams Direct Routing masing-masing brand bisa dilihat update-nya di sini. Di Indonesia, dua merk yang paling banyak digunakan adalah Ribbon Communication (ini dulunya Sonus) dan AudioCodes.

Sertifikat SSL juga hanya boleh dari yang CA yang direkomendasikan oleh Microsoft. Per tulisan ini yang daftarnya adalah:

  • AffirmTrust
  • AddTrust External CA Root
  • Baltimore CyberTrust Root
  • Buypass
  • Cybertrust
  • Class 3 Public Primary Certification Authority
  • Comodo Secure Root CA
  • Deutsche Telekom
  • DigiCert Global Root CA
  • DigiCert High Assurance EV Root CA
  • Entrust
  • GlobalSign
  • Go Daddy
  • GeoTrust
  • Verisign, Inc.
  • SSL.com
  • Starfield
  • Symantec Enterprise Mobile Root for Microsoft
  • SwissSign
  • Thawte Timestamping CA
  • Trustwave

Pastikan selalu memeriksa update daftarnya di sini. Dan pastikan juga untuk mengikuti berita terakhir tentang perusahaan penyedia sertifikat tersebut. Terakhir saya menggunakan Comodo SSL, setelah dibeli oleh perusahaan Sectigo yang notabene tidak masuk dalam list di atas, SBC malah tidak bisa tersambung ke cloud MSTeams Phone System. Padahal sudah tertulis di situ ada Comodo SSL. Sekarang saya menggunakan DigiCert, yang bisa dibeli dari IDWebhost.

Topologi MSTeams Direct Routing kira-kira seperti berikut:

MSTeams Phone System ini bisa dianggap sebagai PBX, dan kebetulan dulu namanya CloudPBX juga. Tidak jauh beda dengan topologi layanan hosted PBX di Ofon (jika butuh perbandingan apple to apple) :

Semua user MSTeams bisa dianggap sebagai “ekstensi” dari Phone System. Tapi tidak semua fitur PBX bisa diterapkan di MSTeams, seperti misalnya jika PBX (hosted maupun on premise) ada fitur global callerid, yaitu satu nomer telepon yang digunakan oleh banyak ekstensi sebagai identitas melakukan panggilan. Di MSTeams Phone System-nya sendiri, fitur tersebut hanya bisa dilakukan dengan layanan Calling Plan, dan belum dilakukan dengan Direct Routing. Pilihan untuk global callerid di Direct Routing hanya Anonymous, nomer telepon tidak ditampilkan. Untuk beberapa operator, setting panggilan Anonymous ini tidak diperbolehkan. Oleh karena itu perlu dibantu di sisi SBC.

Hal lain yang ada di PBX tapi tidak ada di MSTeams Phone System adalah panggilan nomer ekstensi, karena id user sudah berupa email (atau mirip email). Sebenarnya ini adalah bentuk identitas di masa depan (entah kapan). Kelak (mungkin) nomer telpon sudah tidak berlaku. Dalam kartu nama, misalnya, hanya ada alamat email yang berlaku menjadi kontak email, messaging, chat, dan juga telepon. Tapi kayaknya masih lama banget karena dengan format demikian, pengguna akan rentan terhadap robocalling ataupun spam. Jadi nomer telpon sepertinya akan menjadi pilihan identitas dalam jangka waktu yang masih lama.

AutoAttendant juga sudah ada di MSTeams Phone System, dan license untuk instance ini pun digratiskan jika sudah memiliki license Phone System. Namanya Phone System – Virtual User (PSVU). License ini tidak sama dengan license Phone System jadi tidak akan bisa jika disandingkan dengan Office 365 E1/E3 untuk menggantikan Phone System. Lincese ini benar-benar untuk AutoAttendant dan Queue.

Apa yang membedakan client MSTeams dengan Phone System dan yang tanpa Phone System?

Dialpad.

Di MSTeams yang ada license Phone System akan muncul dialpad sehingga pengguna dapat melakukan panggilan ke mana pun.

Sedangkan yang tanpa license Phone System hanya dapat melakukan panggilan ke sesama pengguna MSTeams, baik di dalam realm/domain yang sama ataupun beda.

(Bersambung ke Tulisan 2)

Links:

(Bersambung ke Tulisan 2)