Cisco UC Phone Proxy & A Few Gotchas & IOS-fu #3

Today was another technology milestone day for LifeChurch.tv's remote employees.  For the last year or so we've been experimenting with a few full-time employee positions being "remote" employees – that is – living somewhere we do not currently have a LifeChurch.tv campus.  I believe there are 5 of us now in 5 different states – myself included – I'm in Kentucky.

If I'm not mistaken, I'm the only remote employee with a "company" phone on my desk.  The rest of the gang use the Cisco VPN client to connect back to Oklahoma and they use their cell phones.  The nature of my job is a little different – I have full-remote access via IPSec/VPN (hardware based).  My home router is a Cisco 871w connecting to the Cisco ASA 5520 cluster in Oklahoma.  My desk phone is a Cisco 7941G connecting to our Cisco CallManager cluster in Oklahoma.  Everything has been great.  No problems.

Here's the rub – what if we wanted to provide a deskphone to a remote employee who did not have a fancy IPSec/VPN tunnel at home?  What if we wanted one of our employees to take a phone with them when they traveled overseas, and have that phone "sync up" to the CallManager cluster to have phone service no matter where they are?  How do we do that?  Cisco UC Phone Proxy is how we're doing it.

Here are three great resources to get started configuring UC Phone Proxy – you may need a Cisco CCO login to use these.

Rather than walk through the configuration process on our setup, I'll just let you know we used a combination of CLI and ASDM.  We didn't do anything "out of the ordinary" – it was a very very basic setup following the examples above as closely as made sense.

However.  Phones wouldn't work.  They couldn't get the CTL file (tftp) or Register to the CUCM cluster.  Why?  We went through the config about a bazillion times, and it "looked" right.

During troubleshooting, I remembered a guy I follow on twitterMichael Whaley – tweeting about UC Proxy last week.  I dropped him a line, and he was kind enough to help.  During the course of the day, we traded a dozen emails and scrubbed/partial configs.  His setup is much more complex than ours, but at the end of the day, he uses a similar config.  Why would his work and not ours?

Here are a few things we noticed during debugs (debug phone-proxy tftp):

PP: 74.x.x.223/49161 requesting CTLSEP001AA29699A4.tlv from 172.x.x.10/69
PP: Created entry for secure device Outside:74.x.x.223, MAC 001a.a296.99a4, current count 2, list count 1
PP: opened 0x40a29fc2
PP: Data Block 1 forwarded from CCM-PUB/5321 to 74.x.x.223/49161 ingress ifc Outside
PP: 74.x.x.223/49161 requesting CTLSEP001AA29699A4.tlv from 172.x.x.10/69
PP: Client Outside:74.x.x.223/49161 retransmitting request for CTL file CTLSEP001AA29699A4.tlv

followed by

PP: 74.x.x.223/49161 requesting SEP001AA29699A4.cnf.xml from 172.x.x.10/69
PP: (172.x.x.10/69 <- 74.x.x.x/49161), Error: phone requesting for unsigned config file


So, 74.x.x.223 is my external IP.  172.x.x.10 is the IP of my CUCM Publisher / TFTP – the place my phone is trying to get to.  Lots of retransmits.  And something about an "unsigned" config file.

I'm going to skip forward 8 hours – nothing useful happened here

I got a Cisco TAC Case opened, and engineer Wasan walked through a few things with me.  We ended up on the phone, and Webex, and he jumped in my Cisco ASA config.  I'm thinking he's ran into this problem before, because about 10 minutes later he asked about my IPS (intrusion prevention) situation.  He noticed my ASA Cluster uses the integrated IPS module.  He wanted to do a test and bypass the IPS for any traffic destined for my CUCM cluster.  We did.  It worked.  Yes, you read that right.  The "problem" wasn't a problem at all.  My Cisco IPS was doing it's job – it saw odd traffic, and prevented it from hurting my network.  Ha!  There were a few other things to tighten up too, so I'll give you the breakdown of the three things that we changed.

CTL-FILE
During our UC Proxy Configuration, we created a CTL-FILE – that's what the phones get to create the encrypted traffic between the phone and the UC Proxy.  It contains the CUCM and TFTP information.  Here's what ours ended up looking like:

ctl-file lc_remote_employee_ctl
 record-entry cucm-tftp trustpoint CUCM_SUB address CCM-SUB
 record-entry cucm-tftp trustpoint CUCM_PUB address CCM-PUB
 no shutdown

During our setup, we (by we, I mean Brad – I hate certificates) had the CA trustpoints created for our CUCM cluster SUB (subscriber) and PUB (publisher) – the addesses you see here – CCM-SUB/CCM-PUB are the INSIDE/private addresses of our CUCM cluster.

SERVICE-POLICY
During our UC Proxy Configuration, it is necessary to create a policy-map, and apply that to an interface.  We mistaken thought we could simply apply this to the existing "global policy" – that's not the case.  Here's our full policy information including class-map, policy-map and phone-proxy details.

media-termination asdm_media_termination
 address 12.x.x.95
!
phone-proxy asdm_phone-proxy
 media-termination asdm_media_termination
 tftp-server address 172.x.x.10 interface Inside
 tftp-server address 172.x.x.11 interface Inside
 tls-proxy Rem_Emp_TLS
 ctl-file lc_remote_employee_ctl
 no disable service-settings
!
class-map sec_sip
 match port tcp eq 5061
class-map sec_sccp
 match port tcp eq 2443
!
policy-map voice_policy
 class sec_sccp
  inspect skinny phone-proxy asdm_phone-proxy
 class sec_sip
  inspect sip phone-proxy asdm_phone-proxy
!
service-policy voice_policy interface Outside

Basically, we defined SIP traffic as using port 5061 and skinny (SCCP) traffic as using port 2443.  We then applied those classes to the policy-map "voice_policy" – we inspected for that traffic and then applied the phone-proxy called "asdm_phone-proxy" – details can be found in the documents linked at the beginning of this post.  Finally, we applied this policy to the Outside interface.

IPS Configuration
This was the biggie.  At the end of our global policy, we have the following

 class ips_class
  ips promiscuous fail-open

That means, match the class-map "ips_class" and then run IPS in promiscuous mode.

Let's track that down a little more and look at the "ips_class" map

class-map ips_class
 match access-list ips

Fine… and… the access-list?

access-list ips extended permit ip any any

Yup, you guessed it, that means – block anything you think is bad… but we need to fix that.  We want any UDP traffic going to our CUCM cluster to be allowed.

access-list ips extended deny udp host 172.x.x.10 any
access-list ips extended deny udp host 172.x.x.11 any
access-list ips extended permit ip any any

That's better.  Let's try again.

Will It Work?

Unplug remote phone.  Plug it back in.  Wait a minute and watch the debugs.

PP: 74.x.x.223/49152 requesting CTLSEP001AA29699A4.tlv from 172.x.x.10/69
PP: Created entry for secure device Outside:74.x.x.223, MAC 001a.a296.99a4, current count 2, list count 1
PP: opened 0x7afcf76e
PP: Data Block 1 forwarded from CCM-PUB/22760 to 74.x.x.223/49152 ingress ifc
PP: Received ACK Block 1 from Outside:74.x.x.223/49152 to Inside:172.x.x.10
PP: Data Block 2 forwarded to 74.x.x.223/49152
PP: Received ACK Block 2 from Outside:74.x.x.223/49152 to Inside:172.x.x.10
PP: Data Block 3 forwarded to 74.x.x.223/49152
PP: Received ACK Block 3 from Outside:74.x.x.223/49152 to Inside:172.x.x.10
PP: Data Block 4 forwarded to 74.x.x.223/49152
PP: Received ACK Block 4 from Outside:74.x.x.223/49152 to Inside:172.x.x.10
PP: Data Block 5 forwarded to 74.x.x.223/49152
PP: Received ACK Block 5 from Outside:74.x.x.223/49152 to Inside:172.x.x.10
PP: Data Block 6 forwarded to 74.x.x.223/49152
PP: Received ACK Block 6 from Outside:74.x.x.223/49152 to Inside:172.x.x.10
PP: Data Block 7 forwarded to 74.x.x.223/49152
PP: Received ACK Block 7 from Outside:74.x.x.223/49152 to Inside:172.x.x.10
PP: Data Block 8 forwarded to 74.x.x.223/49152
PP: Received ACK Block 8 from Outside:74.x.x.223/49152 to Inside:172.x.x.10
PP: Data Block 9 forwarded to 74.x.x.223/49152
PP: Received ACK Block 9 from Outside:74.x.x.223/49152 to Inside:172.x.x.10
PP: TFTP session complete, all data sent

Much better.  The phone is now talking!  Wait a minute longer and all the rest of the magic happens and my phone is ready to go.

Anyway, I hope that was helpful for someone.  Mike, thanks so much for sharing your information.  Brad, I'm glad you get certificates – I hate them.  And, Wasan from Cisco, if you stumble here – thank you for being so helpful.

Update 8/24/2009 – I've added a few more things here related to UC Proxy & Directory URLs and Service URLs and One-way Audio.

4 thoughts on “Cisco UC Phone Proxy & A Few Gotchas & IOS-fu #3

  1. Great write up Daryl! Good troubleshooting and good job documenting the steps along the way!

  2. Thanks Daryl. You saved me many more additional hours of troubleshooting. I spent all day on this already.

  3. Hi Daryl – I’m a Voice CCIE, and randomly a big fan of your iPhone, Chrome, and iPad apps! I would recommend checking out the VPN capabilities in UCM 8.0+ as it should answer your initial question a bit more elegantly than the UC Proxy option of the past. Both will terminate on an ASA – one as a TLS proxy client, and the other as a SSL VPN client. In UCM 8.x the VPN parameters are added to the phone config page in UCM, so you configure it once while on your network, unplug it, and ship it to the end user.

    Hope this helps!

Comments are closed.