Configure Cisco Meeting Server and Skype
Configure Cisco Meeting Server and Skype
Configure Cisco Meeting Server and Skype
for Business
Contents
Prerequisites
Requirements
Components Used
Network Topology - Single CallBridge
Network Topology - Clustered CallBridges
Callbridge Certificate Requirements - Single CallBridge
Callbridge Certificate Requirements - Clustered CallBridges
DNS Record Requirements - Single CallBridge
DNS Record Requirements - Clustered CallBridges
SIP Media Encryption
Inbound Rules
Example Inbound Rules configuration - Single CallBridge
Example Inbound Rules configuration - Clustered CallBridges
Outbound Rules
Example Outbound Calls configuration - Single CallBridge
Example Outbound Calls configuration - Clustered CallBridges
Modifying Scope Utilizing the API - Clustered CallBridges only
GET a list of all CallBridges in the cluster
GET a list of all outbound dial rules
PUT the CallBridge Scope in
CMS Service Accounts
Example CMS Service Account Configuration
Verifying CMS Service Accounts
Lync/Skype Configuration
Single CallBridge
Clustered CallBridges
Collecting logs from CMS
Viewing Lync/Skype Configuration
Example output of Lync/Skype Get commands
Introduction
This document describes how to configure Cisco Meeting Server (CMS) CallBridge Cluster with Skype for Business as a complement of the official guides.
This document provides an example of a single CallBridge and another example of a three CallBridge cluster, but additional CallBridges can be added as
necessary. A two CallBridge cluster is also supported.
Contributed by Rogelio Galindo and edited by Viridiana Fuentes, Cisco TAC Engineers.
Prerequisites
Requirements
Cisco recommends that you have knowledge of these topics:
Components Used
Table 1a
Table 1b
Full Name:
URI:ldap:///CN=DC-
CA,CN=DC,CN=CDP,CN=Public%20Key%20Services,CN=Services,CN=Configuration,DC=uc,DC=local?certifica
teRevocationList?base?objectClass=cRLDistributionPoint
Please take note of the Subject and X509v3 Subject Alternative Name fields. These will be extremely important later when we build our trust relationships in
the Microsoft environment.
Table 2a
Table 2b
IP
A Record Description
Example
cms1.uc.local 10.10.10.1 CallBridge 1
cms2.uc.local 10.10.10.2 CallBridge 2
cms3.uc.local 10.10.10.3 CallBridge 3
10.10.10.1
An A record that resolves to all CallBridges in the cluster. This will be referred to
cms.uc.local 10.10.10.2
the CallBridge Cluster Fully Qualified Domain Name (FQDN)
10.10.10.3
fe.skype.local 10.10.10.5 Skype Front End Fully Qualified Domain Name (FQDN)
Configuration
SIP Media Encryption
Navigate to Configuration> Call Settings. SIP media encrpytion must be set to allowed.
Inbound Rules
Table 3 describes what every field in the Incoming Calls - Call Matching configuration means.
Table 3
Incoming Call
Matching Dial Plan Description
Field
If a call is received with this domain then use the user portion of the URI to look for
Domain Name
matches in the enabled targets.
This determines the order in which the rules will be considered. Higher numbers wi
Priority
checked first. Lower numbers will be checked last.
If set to yes: if the user portion of the URI matches a space the call will connect to t
Targets Spaces
space.
If set to yes: if the user portion of the URI matches a CMA user the call will attempt
Targets Users
call that user.
If set to yes: if the user portion of the URI matches a configured IVR the call will co
Targets IVR
to that IVR.
If set to yes: If the user portion of the URI matches a PSTN Dialin Number of a Sky
Targets Lync
for Business Meeting connect to that Meeting as a Dual Homed call.
Targets Lync If set to yes: Convert the user portion of the URI into an HTTPS target and try to fin
Simplejoin Office365 meeting hosted at that URL.
Tenant This determines which tenants this rule will be considered for.
Table 4 describes what every field in the Incoming Calls - Call Forwarding configuration means.
Table 4
Incoming Call
Forwarding Dial Desciption
Plan Field
Domain Matching
If a call is received with this domain then forward or reject the domain as configure
Pattern
Priority This determines the order in which the rules will be considered. Higher numbers w
checked first. Lower numbers will be checked last.
If set to forward the call will be handled by the outbound rules. If set to reject the ca
Forward
be rejected and not forwarded.
If set to pass through the from portion of the domain will be preseved. If set to use
plan the from portion will be rewritten as configured in the outbound rule.
Caller ID
Note: Pass through cannot be used for rules that match a Lync/Skype domain if th
CallBridge is in a cluster. This would break presentation on gateway calls.
If enabled change the called domain to the value configured in the forwarding dom
Rewrite Domain
field.
Forwarding Domain If rewrite domain is enabled the called domain will change to the value of this field.
In this environment things are remarkably simple. Since we are not using clustered CallBridges we can set each domain to use pass through as their Caller
ID. This cannot be done in a clustered environment as it will break presentation sharing.
Additionally there is a call matching rule for the domain Skype.local with "Targets Lync" set to true. This means if we call a Lync/Skype meeting by the PSTN
dialin number, we should be able to connect as a Dual Home call.
In this environment we are using a CallBridge cluster that consists of three CallBridges. Because of this we need one call forwarding rule for each CallBridge
configured to rewrite the domain to uc.local. This is because when Lync/Skype users callback users from the UC environment they will actually be placing
calls to the domain of cms1.uc.local, cms2.uc.local, or cms3.uc.local. Unfortunately this is a limitation of the configuration that is required to have content
working in a clustered CallBridge environment. We need to convert this back to uc.local before forwarding the call to the uc.local sip proxy.
Additionally there is a call matching rule for the domain Skype.local with "Targets Lync" set to true. This means if we call a Lync/Skype meeting by the PSTN
dialin number, we should be able to connect as a Dual Home call.
Outbound Rules
Table 5 describes what every field in the outbound calls configuration means.
Table 5
Outbound
Dial Plan Description
Field
Domain For calls out to this domain use this outbound rule
SIP proxy The SIP proxy to send calls to for this domain
to use
This determines what value will be put in the contact header. For Lync/Skype integration this
Local value must be set to the FQDN of the CallBridge.
contact Note: For any outbound rules using a SIP proxy of Lync/Skype this field MUST be configured.
domain For any outbound rules using a SIP proxy that is not Lync/Skype this field MUST NOT be
configured.
This determines what value will be put in the from header. This will be the caller-ID address
seen on the SIP proxy. If left blank this field will use the "Local contact domain" configured.
Local from
Lync/Skype will use this as the destination URI for callbacks and presentation sharing.
domain
Note: This value is not used if the call is a gateway call and the inbound dial rule used has
"Caller ID" set to passthrough.
Trunk type This determines what variation of SIP will be used in communication with the SIP proxy.
This determines whether or not we will continue checking lower priority rules or stop searching
Behavior
in the event of a match where we were unable to complete the call.
This determines the order in which the rules will be considered. Higher numbers will be
Priority
checked first. Lower numbers will be checked last.
Encryption This determines whether we will use encrypted or unencrypted SIP.
Tenant This determines which tenants this rule will be considered for.
Call This determines which CallBridges this outbound dial rule will be considered for. In clustered
Bridge CallBridges this is required to ensure the correct contact domain is sent from each CallBridge.
Scope Note: This value can only be set utilizing the API as explained below.
Again we see that the single CallBridge environment is considerably simpler than the clustered environment. One thing worth note above is that we have
a contact domain specified. This is because if we do not specify the Fully Qualified Domain Name of our CallBridge as the local contact domain Lync/Skype
will reject calls for security reasons. Since our incoming forwarding rules are set to use pass through, we will not actually be rewriting the from domain in this
example.
In this environment we are using a CallBridge cluster that consists of three CallBridges. Because of this we need one outbound rule for each CallBridge each
with different local contact domains, local from domains, and scopes. Only one outbound rule is needed to route the calls from all CallBridges to the Cisco
Unified Communications Manager. To set the scope we need to utilize the API.
In a browser navigate to the /callbridges page of the CMS API. This will show all of the CallBridges in your cluster.
Now I have the IDs for all of my CallBridges. Your IDs will be different in your environment. I can see that if I want to reference CallBridge cms1.uc.local I
should use the ID of e4ab61ea-b5b4-4fac-ad4a-9979badea4e4.
Next, I need to look up my outbound rules and get their IDs. In a browser navigate to the /outbounddialplanrules page in the API.
<outboundDialPlanRules total="4">
<outboundDialPlanRule id="7c76b6c7-4c42-45b0-af47-796cb6737e4e">
<domain>UC.local</domain>
<priority>0</priority>
</outboundDialPlanRule>
<outboundDialPlanRule id="b8cf4056-7f56-43a5-b67b-861253d5ca32">
<domain>skype.local</domain>
<priority>0</priority>
</outboundDialPlanRule>
<outboundDialPlanRule id="4ae1d777-48b7-423b-a646-a329e1e822af">
<domain>skype.local</domain>
<priority>0</priority>
</outboundDialPlanRule>
<outboundDialPlanRule id="05f00293-50fd-4c17-9452-dec224b43430">
<domain>skype.local</domain>
<priority>0</priority>
</outboundDialPlanRule>
</outboundDialPlanRules>
Now I have the IDs for all of my rules, but I can't tell which is which. We don't care about the first rule since that one is to UC.local and we don't need to set a
scope for that. We do need to know which rule is which for the remaining outbound rules to Skype.local. So starting one at a time I will match the IDs to the
CallBridges.
I will navigate to /outbounddialplanrules/b8cf4056-7f56-43a5-b67b-861253d5ca32 in my browser. Reading the contact header listed there I can tell this rule is
for CMS1.UC.local. So we need to set the scope of this rule to CMS1.UC.local.
Using my favorite API tool I will send a PUT to the api on /outbounddialplanrules/b8cf4056-7f56-43a5-b67b-861253d5ca32 with the following body:
scope: callBridge
callBridge: e4ab61ea-b5b4-4fac-ad4a-9979badea4e4
In this screenshot I am using PostMan to send this request.
If this HTTP PUT was successful the outbound dial rules page in WebAdmin should now reflect a scope has been applied. If viewed from the Webadmin of
the CallBridge that the scope was applied to it should show <local>. If the Webadmin of another CallBridge is used to view the outbound dial rules it should
show the CallBridge FQDN in the scope field. A scope of <all> means the rule will be used on all CallBridges. A scope of <none> means that a scope has
been enabled, but no CallBridges match the scope.
After setting the scope for one CallBridge it needs to be configured for each additional CallBridge. After this configuration has been completed every
outbound rule for your Skype domain should have a scope.
In the general configuration page of the WebAdmin there is a Lync Edge settings section. In order to utilize TURN services or join Dual Home meetings via
the PSTN Dialin number this must be configured.
Table 6 describes what every field in the Lync Edge settings configuration means.
Table 6
Lync Edge
Description
settings field
Server
Fully Qualified Domain Name (FQDN) of your Front End Pool
Address
Username The username of the service account you want to use for CMS
How many different user accounts you would like to register. If a value is not configured her
Number of then only the username as listed above will be registered. If a number is applied here the
Registrations numbers 1-X will be applied as suffixes to the user portion of the URI where X is the numbe
configured in this field.
Configuration on CMS1:
This configuration would register [email protected], [email protected], [email protected], ...
[email protected], and [email protected] to fe.skype.local. Since in this example I'm in a clustered environment I would need
to also create service accounts for my other CallBridges and configure them separately. Please note that the usernames in this example are different. On
CMS1 the usernames are prefixed with cms1. On CMS2 the usernames are prefixed with cms2. On CMS3 the prefix is cms3. All of these accounts were
made and enabled in the Skype for Business environment. Since our Trusted Application Pool is configured with "Treat as authenticated" we do not need to
supply passwords to register.
Configuration on CMS2:
Configuration on CMS3:
Apply the below commands in the Lync/Skype Management Shell. Apply the commands on the Front End server.
Note: The suggested commands are for guidence. In case you have doubts about the
configuration on Skype server, you will need to contact your Lync/Skype administrator and/or
support team.
Single CallBridge
First, we need to tell Skype to trust our CallBridge. To do this we add a Trusted Application Pool. In Microsoft terminology "Pool" just means "Cluster." In this
scenario our cluster is just a cluster of one CallBridge. The Identity of our cluster MUST match the common name of the certificate in use on our CallBridge.
Microsoft uses this as a security check. Having the Identity in a SAN is not enough. If the common name does not match Microsoft will tear down the TCP
connection. When using this command the identity should be the CallBridge FQDN. The Registrar whould be the FQDN of the Front End Pool servicing these
connections. The site should be the Lync/Skype site identifier. If you are unsure of the values that should be used for registrar or site please contact your
Lync/Skype administrator.
Enable-CsTopology
Clustered CallBridges
First, we need to tell Skype to trust our CallBridge cluster. To do this we add a Trusted Application Pool. In Microsoft terminology "Pool" just means "Cluster."
The Identity of our cluster MUST match the common name of the certificate(s) in use on our CallBridge(s). Microsoft uses this as a security check. Having the
Identity in a SAN is not enough. If the common name does not match Microsoft will tear down the TCP connection. When using this command the identity
should be the CallBridge FQDN. ComputerFqdn should be the FQDN of the first CallBridge in your cluster. By specifying a ComputerFqdn you are indicating
to the Lync/Skype environment that this is not a cluster with only a single server in it. The Registrar whould be the FQDN of the Front End Pool servicing
these connections. The site should be the Lync/Skype site identifier. If you are unsure of the values that should be used for registrar or site please contact
your Lync/Skype administrator.
Enable-CsTopology
Troubleshooting
Collecting logs from CMS
The first step in diagnosing any issue is determining where the issue is. To do this we need to analyze the logs from the Cisco Meeting Server, but first we
need to collect them. Here are my personal recommendations on logs to collect.
First, enable SIP and DNS debugging for all CallBridges via the WebAdmin interface. To do this navigate to the WebAdmin and then to Logs > Detailed
Tracing. From here enable SIP and DNS logging for the next thirty minutes. This should be more than enough time to catch and diagnose the issue. Keep in
mind this needs to be done individually for all CallBridges as log enablement is not shared across a cluster.
Second, enable packet captures on all CallBridges. To do this connect via SSH to each CallBridge and run the command pcap <interface> where <interface>
is the interface traffic should use. In most cases this will be interface a. So the command "pcap a" would start a packet capture on interface a for the
CallBridge we are connected to.
Once the packet capture is running on all interfaces the next step is to produce the problem. Go ahead and attempt a call or do whatever it was that was
failing. After this is completed terminate all of the packet captures. This can be done by entering Ctrl-C in all of the SSH windows. Once the packet capture is
completed the name of the file generated will be written to the screen. Keep track of this filename as we will need to download it in the next step.
Finally we need to collect the logs from the CallBridges. To do this connect via SFTP to each CallBridge. Download the file logbundle.tar.gz and the packet
capture file generated. This file is only available in CMS2.2+. In CMS versions 2.3+ it will include the full configuration of your CMS. If you are running version
2.2 it will not include your inbound/outbound rules, so it would be good to take screenshots of those pages as well as the Lync Edge settings for reference.
Make sure to store the logs/screenshots collected in separate folders that has a name matching the CallBridge the logs were pulled from. This will help make
sure the logs don't get mixed up.
Command Description
This command lists clusters (pools) trusted by Lync/Skype. The
identity of this pool MUST match the common name of the
Get-CsTrustedApplicationPool
CallBridge certificate(s). Even in a single CallBridge environment a
CallBridge cluster (pool) of one must be specified here.
This command lists servers trusted by Lync/Skype and which Pool
these servers are associated with. All computers here MUST be
identified in the certificate sent by the CallBridges. In a single
CallBridge environment this is typically the common name. In a
Get-CsTrustedApplicationComputer
clustered environment these computers MUST be listed as Subject
Alternative Name (SAN) entries. Additionally, all computers here
MUST be identified by local contact domain entries on the
CallBridge outbound dial rules.
This command lists which services trusted application pools are
Get-CsTrustedApplication allowed to communicate with. For CMS communication with
Lync/Skype we will use TCP port 5061 for TLS encrypted SIP.
This command lists the static routes that Lync/Skype uses for
Get-CsStaticRoutingConfiguration |
forwarding requests. The MatchURI field is the destination domain
Select-Object -ExpandProperty
of the SIP message. The "TLS Fqdn" field in the XML should show
Route
the destination server for this traffic.
Below is the output of the above Lync/Skype Get commands issued in the three CallBridge cluster
scenario covered in this document
PS C:\Users\administrator.SKYPE> Get-CsTrustedApplicationPool
Identity : TrustedApplicationPool:CMS.UC.local
Registrar : Registrar:lyncpoolfe01.skype.local
FileStore :
ThrottleAsServer : True
TreatAsAuthenticated : True
OutboundOnly : False
RequiresReplication : False
AudioPortStart :
AudioPortCount : 0
AppSharingPortStart :
AppSharingPortCount : 0
VideoPortStart :
VideoPortCount : 0
Applications : {urn:application:acanoapplication}
DependentServiceList : {}
ServiceId : 1-ExternalServer-1
SiteId : Site:RTP
PoolFqdn : CMS.UC.local
Version : 7
Role : TrustedApplicationPool
PS C:\Users\administrator.SKYPE> Get-CsTrustedApplicationComputer
Identity : CMS1.UC.local
Pool : CMS.UC.local
Fqdn : CMS1.UC.local
Identity : CMS2.UC.local
Pool : CMS.UC.local
Fqdn : CMS2.UC.local
Identity : CMS3.UC.local
Pool : CMS.UC.local
Fqdn : CMS3.UC.local
PS C:\Users\administrator.SKYPE> Get-CsTrustedApplication
Identity : CMS.UC.local/urn:application:acanoapplication
ComputerGruus : {CMS1.UC.local
sip:[email protected];gruu;opaque=srvr:acanoapplication:GMqDXW_1rVCEMQi4qS6ZxwAA,
CMS2.UC.local
sip:[email protected];gruu;opaque=srvr:acanoapplication:_Z9CnV49LFufGDXjnFFi4gAA,
CMS3.UC.local
sip:[email protected];gruu;opaque=srvr:acanoapplication:dt8XJKciSlGhEeT62tyNogAA}
ServiceGruu :
sip:[email protected];gruu;opaque=srvr:acanoapplication:dQFM4E4YgV6J0rjuNgqxIgAA
Protocol : Mtls
ApplicationId : urn:application:acanoapplication
TrustedApplicationPoolFqdn : CMS.UC.local
Port : 5061
LegacyApplicationName : acanoapplication
Transport :
TransportChoice=Certificate=Microsoft.Rtc.Management.WritableConfig.Settings.SipProxy.UseDefault
Cert;Fqdn=CMS.UC.local;Port=5061
MatchUri : UC.local
MatchOnlyPhoneUri : False
Enabled : True
ReplaceHostInRequestUri : False
Element : <Route
xmlns="urn:schema:Microsoft.Rtc.Management.Settings.SipProxy.2008" MatchUri="UC.local"
MatchOnlyPhoneUri="false" Enabled="true" ReplaceHostInRequestUri="false">
<Transport Port="5061">
<TLS Fqdn="CMS.UC.local">
<UseDefaultCert />
</TLS>
</Transport>
</Route>
Transport :
TransportChoice=Certificate=Microsoft.Rtc.Management.WritableConfig.Settings.SipProxy.UseDefault
Cert;Fqdn=CMS1.UC.local;Port=5061
MatchUri : CMS1.UC.local
MatchOnlyPhoneUri : False
Enabled : True
ReplaceHostInRequestUri : False
Element : <Route
xmlns="urn:schema:Microsoft.Rtc.Management.Settings.SipProxy.2008" MatchUri="CMS1.UC.local"
MatchOnlyPhoneUri="false" Enabled="true" ReplaceHostInRequestUri="false">
<Transport Port="5061">
<TLS Fqdn="CMS1.UC.local">
<UseDefaultCert />
</TLS>
</Transport>
</Route>
Transport :
TransportChoice=Certificate=Microsoft.Rtc.Management.WritableConfig.Settings.SipProxy.UseDefault
Cert;Fqdn=CMS2.UC.local;Port=5061
MatchUri : CMS2.UC.local
MatchOnlyPhoneUri : False
Enabled : True
ReplaceHostInRequestUri : False
Element : <Route
xmlns="urn:schema:Microsoft.Rtc.Management.Settings.SipProxy.2008" MatchUri="CMS2.UC.local"
MatchOnlyPhoneUri="false" Enabled="true" ReplaceHostInRequestUri="false">
<Transport Port="5061">
<TLS Fqdn="CMS2.UC.local">
<UseDefaultCert />
</TLS>
</Transport>
</Route>
Transport :
TransportChoice=Certificate=Microsoft.Rtc.Management.WritableConfig.Settings.SipProxy.UseDefault
Cert;Fqdn=CMS3.UC.local;Port=5061
MatchUri : CMS3.UC.local
MatchOnlyPhoneUri : False
Enabled : True
ReplaceHostInRequestUri : False
Element : <Route
xmlns="urn:schema:Microsoft.Rtc.Management.Settings.SipProxy.2008" MatchUri="CMS3.UC.local"
MatchOnlyPhoneUri="false" Enabled="true" ReplaceHostInRequestUri="false">
<Transport Port="5061">
<TLS Fqdn="CMS3.UC.local">
<UseDefaultCert />
</TLS>
</Transport>
</Route>
PS C:\Users\administrator.SKYPE>
Contacting TAC
If you encounter errors with this implementation please contact Cisco TAC. When opening the service request please include a link to this document. It will
help the TAC engineers understand your configuration. Additionally, it would be extremely helpful if the Cisco Meeting Server logs are attached to the case as
described above and the output of all of the Get commands from the Lync/Skype Front End are entered into the case notes. If you don't include this
information it's sure to be one of the first things the TAC engineers ask for so please go ahead and collect it before opening your case.