You are currently browsing the archive for the VOIP category.

A typical type of outbound connectivity defined on a IP telephone system is a SIP trunk.  SIP is Session Initiation Protocol which is, ironically, what it stands for as well.  The description couldn’t be more accurate.  SIP as protocol defines the way that voice calls are setup, maintained, and terminated in an IP telephony network.  SIP, in my mind, offers ISDN/PSTN like features over existing infrastructure (in many cases), at significantly lower costs, and with extended capabilities.

One misconception I’ve heard rather frequently is that SIP is the protocol used to carry voice and data packets between the endpoints.  This isn’t true at all.  SIP is the protocol used to establish the session and maintain it, it does not actually carry the voice payload.  In most cases RTP is the protocol that is used to transfer the traffic between the endpoints.  So while the two protocols are directly related to each other, they both perform their own separate tasks.

At the core level there are two types of SIP network objects, clients and servers.  The clients can be something like an actual IP phone that has SIP functionality or a gateway device that is the terminating point for a SIP trunk.  The clients are often referred to as user agents (UA) or endpoints.  On the server side there are a few different types of servers.  I’ll talk about the 2 main server types briefly.

Proxy Server – The server that receives the SIP request from a SIP client and forwards the request to its next hop.  The next hop can be another proxy server or a receiving user agent.  Proxies general support basic functionality such as AAA, routing, and other security features.
Registrar Server – Handles the registration for a client user agent.

SIP uses what many call a ‘HTTP-like’ request and response model for communication between the network objects.  The user agents in a SIP network are identified by a email like address in this format…

sip:<SIP-UA ID>@SIPgateway.com

The SIP-UA ID can be a username or a standard telephone number.  The SIPGateway can be a a domain or a specific IP address.

While that was by no means a detailed description, it should give you some base understanding of what SIP is and its function in an IP telephony network.  In my last post, we did a full CME 7.1 setup but we didn’t talk much about the SIP trunk setup piece of the configuration.  Let’s run through that configuration now.

The entire SIP trunk configuration we did looked like this…

  credentials username <username> password <passwd> realm sip-ua.com
  registrar dns:proxy.sip-ua.com expires 60
  authentication username <username> password
  sip-server dns:proxy.sip-ua.com

So from what we’ve learned above, we know that the 2801 in this case is acting as SIP user agent.  So that fact that we are in ‘SIP-UA’ configuration mode makes sense.  The line…

credentials username <username> password <passwd> realm sip-ua.com

Provides the user agent with the credentials it needs to log into the SIP server to receive inbound calls.  The ‘realm’ piece of it tells the user agent that these credentials should be used when registering to a gateway that’s in the ‘sip-ua.com’ diomain.  The next line…

registrar dns:proxy.sip-ua.com expires 60

Tells the user agent that proxy.sip-ua.com is the registrar it should be using to register itself with the SIP server.  Note how its prefaced with ‘dns’.  If we wanted to use an IP address we could use the ‘ipv4’ preface followed by a version 4 IP address.  These two lines alone are all the configuration that is required to allow inbound calling.  The next two lines, are what is required to make outbound calling on the same SIP trunk.  The line…

  authentication username <username> password <passwd>

Provides the authentication needed when making an outbound call on the SIP trunk.  The next line…

  sip-server dns:proxy.sip-ua.com

Configures a SIP server interface on the gateway.  Again, we point this towards the proxy.sip-ua.com FQDN.  These two lines together are what is required to make outbound calls.

As you saw in the full example, we put a button on the phone for the external line.  Once that’s done, the system knows that inbound calls should ring on that button.  For outbound calls, we just need to have a dial peer that matches the digits dialed and has a destination of the ‘sip-server’ defined in the last line of the sip-ua configuration.  In our example, dial peers 1, 2, and 3 all have that as their destination…

dial-peer voice 1 voip
  description *** 10 Digit Calls ***
  destination-pattern [2-9]..[2-9]……
  session protocol sipv2
  session target sip-server
  dtmf-relay rtp-nte
  codec g711ulaw
  no vad

In the next post, we’ll talk more about dial-peers in more detail.


This post will document my first attempt at setting up a basic CME install.  I’ve got a free lab SIP trunk from SIP-UA (Thanks again!), a 2801 route that will support the CME instance, and a 7960 VOIP phone.  It’s probably worthwhile to mention that CME itself is usually just considered as the GUI for managing the routers VOIP instance.  You can configure all of the options through the command line which is what I’ll be doing today.  I will, however, still install the GUI and set it up so you can see the process.  Alright, let’s get started.

I’ve created another VLAN (20) of my Cisco 3750 called ‘Voice’.  This will be the voice VLAN and will be where the CME instance lives.  My standard data VLAN is 10 so I used the ‘switchport access vlan 20’ command on the port connecting to the 2801 interface and the ‘switchport voice vlan 20’ command on the port connecting to the phone.  Additionally, I created a SVI on VLAN 20 to route traffic back and forth between VLANs.

2801 Configuration
First things first, we need the right code and the right CME version.  I can’t stress enough that these need to match the Cisco specification exactly.  Make sure that your CME version and IOS version are the same per the Cisco document listed here…


If you don’t use the recommended combination of IOS and CME you can run into weird issues.

Basic Setup – Configure the hostname and basics
Router(config)#hostname VOIP2801
VOIP2801(config)#int faste0/0
VOIP2801(config-if)#ip address
VOIP2801(config-if)#no shut
*Apr 17 22:14:24.767: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/0, changed state to up
VOIP2801(config)#ip route
VOIP2801(config)#ip domain-lookup
VOIP2801(config)#ip name-server

Configure NTP
Note: NTP Is important in CME since that’s what the phone will get their time from.  I resolved ‘time.gov’ to an IP and used that.

clock timezone CST -5
VOIP2801(config)#ntp server
*Apr 17 22:17:04.295: %SYS-6-CLOCKUPDATE: System clock has been updated from 22:17:04 UTC Sun Apr 17 2011 to 17:17:04 CST Sun Apr 17 2011, configured from console by console.

DHCP Scope configuration
Note: I define the DHCP scope for the phones on the router itself.  If you wanted it somewhere else you could use the ‘ip-helper’ command to send the DHCP requests somewhere else.

ip dhcp excluded-address
VOIP2801(config)#ip dhcp pool VOIP
VOIP2801(dhcp-config)# network
VOIP2801(dhcp-config)# option 150 ip
VOIP2801(dhcp-config)# lease 7

Install CME Code
Note: The Version of 7.1 I downloaded was a ZIP file. I opened the Zip and extracted the files and TARs I wanted to a new folder called ‘CME71’.  I extracted the following files…
cme-gui- – The Web GUI files for CME
P00308000500.tar – The phone files for my 7960G
ringtones.tar – Ringtone files, we’ll talk about these in a later post
I use the archive command to copy the files and install them into specific folders at the same time.  I also use FTP rather than TFTP.

VOIP2801# archive tar /xtract flash:CME_GUI
Loading CME71/cme-gui-
extracting admin_user.html (3987 bytes)!
extracting admin_user.js (650596 bytes)!!
<***Output Omitted***>
[OK – 800768/4096 bytes]


archive tar /xtract flash:CME_PhoneLoads
Loading CME71/P00308000500.tar
extracting P00308000500.bin (129824 bytes)!
extracting P00308000500.loads (458 bytes)
extracting P00308000500.sb2 (705536 bytes)!!!
extracting P00308000500.sbn (130228 bytes)
<***Output Omitted***>
[OK – 969728/4096 bytes]


archive tar /xtract flash:CME_RingTones
Loading CME71/ringtones.tar
extracting Analog1.raw (8160 bytes)!
extracting Analog2.raw (8160 bytes)
<***Output Omitted***>
[OK – 326144/4096 bytes]

VOIP2801#dir flash:
Directory of flash:/
    1  -rw-    47773976  Oct 26 1906 00:15:44 -05:00  c2801-advipservicesk9-mz.124-22.YB8.bin
    2  drw-           0  Apr 17 2011 17:26:24 -05:00  CME_GUI
   21  drw-           0  Apr 17 2011 17:26:38 -05:00  CME_PhoneLoads
   26  drw-           0  Apr 17 2011 17:26:52 -05:00  CME_RingTones

512065536 bytes total (462004224 bytes free)

Note: So as you can see, we have three separate folders.  One for the GUI, one for actual phone code, and one for ringtones.

Configure the Router to host phone files through local TFTP Server
Note: Now we need to tell the router to host the phone loads on a local TFTP server.  The phones will use option 150 to find the phone loads and download them locally.  Take note that we are using the ‘alias’ command because the files are not in the root of the flash directory.

tftp-server flash:/CME_PhoneLoads/P00308000500.bin alias P00308000500.bin
VOIP2801(config)# tftp-server flash:/CME_PhoneLoads/P00308000500.loads alias P00308000500.loads
VOIP2801(config)# tftp-server flash:/CME_PhoneLoads/P00308000500.sb2 alias P00308000500.sb2
VOIP2801(config)# tftp-server flash:/CME_PhoneLoads/P00308000500.sbn alias P00308000500.sbn

Configure the router for CME Web GUI
Note: The only thing we have to do here is tell the router where the HTTP files are to host and turn on the local HTTP server.  Then we enable telephony services on the router, set a web admin account, and enable configuration from the web GUI.

ip http server
VOIP2801(config)#ip http path flash:CME_GUI
VOIP2801(config-telephony)# web admin system name admin secret 0 cisco
VOIP2801(config-telephony)# dn-webedit

Note: At this point you should be able to get to the web GUI by browsing to…

http://<Router IP>/telephony-service.html

Login using the credentials you just configured.  We won’t be using the GUI for any other configuration.

Finish the default settings for CME in Telephony-Service
VOIP2801(config-telephony)#load 7960-7940 P00308000500
Updating CNF files
CNF-FILES: Clock is not set or synchronized, retaining old versionStamps
CNF files update complete for phonetype(7940)
CNF-FILES: Clock is not set or synchronized, retaining old versionStamps
CNF files update complete for phonetype(7960)
Note: This command loads the phone code as part of the CME instance.  It also updates the CNF files which are used for phone configuration.

VOIP2801(config-telephony)#max-ephones 8
VOIP2801(config-telephony)#max-dn 8
Note: These commands set the max values for extensions and phones.  Its required to set these values so the system knows what it has to work with.

VOIP2801(config-telephony)#ip source-address
Updating CNF files
CNF-FILES: Clock is not set or synchronized, retaining old versionStamps
CNF files updating complete
Note: This command sends the IP address of the CME system.  Another CNF update occurs when this is modified.

VOIP2801(config-telephony)#create cnf-files
Creating CNF files
CNF-FILES: Clock is not set or synchronized, retaining old versionStamps
Note: This command actually creates the CNF files.  It’s probably not required at this point since they were already updated twice but I always do it for good measure.

Check your phone
At this point if your phone is plugged in it should boot and you should see the standard phone window.  Date, time, and a message indicating that you are on a ‘Cisco Unified CME’.  If the phone is not booting, check your switchport configuration.

Configure the extension and phone
VOIP2801(config)#ephone-dn 1
VOIP2801(config-ephone-dn)#number 1000 secondary 4175209020
VOIP2801(config-ephone-dn)#label Jon’s Extension
VOIP2801(config-ephone-dn)#name Jon’s
Note: The number command sets the extension.  The label command sets what the line button on the phone displays as.  The name command is for caller ID purposes. 

VOIP2801(config)# ephone-dn 2
VOIP2801(config-ephone-dn)# number 4175209020
VOIP2801(config-ephone-dn)# label External Line
VOIP2801(config-ephone-dn)# name External Line
Note: For this second DN I’m configuring the external phone number.  I’ll attach this to the phone so that the incoming calls ring on this particular phone.

VOIP2801(config)#ephone 1
VOIP2801(config-ephone)#description Jon’s Phone
VOIP2801(config-ephone)#mac-address <Phone’s MAC>
VOIP2801(config-ephone)#type 7960
VOIP2801(config-ephone)#button 1:1 2:2
Note: The type defines what type of handset the phone is.  The button command maps ‘ephone-dn 1’ to button 1 and ‘ephone-dn 2’ to button 2 on the physical phone.

Reboot the phone to make sure the settings come through
VOIP2801#config t
Enter configuration commands, one per line.  End with CNTL/Z.
VOIP2801(config-telephony)#reset <Phone’s MAC>

Configure the SIP trunk
VOIP2801(config)# sip-ua
VOIP2801(config-sip-ua)# credentials username <SIP Username> password <SIP Password> realm sip-ua.com
VOIP2801(config-sip-ua)# registrar dns:proxy.sip-ua.com expires 60
VOIP2801(config-sip-ua)# authentication username <SIP Username> password <SIP Password>
VOIP2801(config-sip-ua)# sip-server dns:proxy.sip-ua.com
Note: I’m not going to really discuss this just yet.  I’m putting it in so you can get SIP working but I plan on doing an entire post on the SIP trunk configuration so we’ll talk about it then.  Same thing goes for the dials plans covered next.

Configure Inbound and Outbound dial plans
VOIP2801(config)# dial-peer voice 1 voip
VOIP2801(config-dial-peer)#  description *** 10 Digit Calls ***
VOIP2801(config-dial-peer)#  destination-pattern [2-9]..[2-9]……
VOIP2801(config-dial-peer)#  session protocol sipv2
VOIP2801(config-dial-peer)#  session target sip-server
VOIP2801(config-dial-peer)#  dtmf-relay rtp-nte
VOIP2801(config-dial-peer)#  codec g711ulaw
VOIP2801(config-dial-peer)#  no vad
VOIP2801(config)# dial-peer voice 2 voip
VOIP2801(config-dial-peer)#  description *** 11 Digit Calls ***
VOIP2801(config-dial-peer)#  destination-pattern 1[2-9]..[2-9]……
VOIP2801(config-dial-peer)#  session protocol sipv2
VOIP2801(config-dial-peer)#  session target sip-server
VOIP2801(config-dial-peer)#  dtmf-relay rtp-nte
VOIP2801(config-dial-peer)#  codec g711ulaw
VOIP2801(config-dial-peer)#  no vad
VOIP2801(config)# dial-peer voice 3 voip
VOIP2801(config-dial-peer)#  description *** Lab Extensions ***
VOIP2801(config-dial-peer)#  destination-pattern 7……
VOIP2801(config-dial-peer)#  session protocol sipv2
VOIP2801(config-dial-peer)#  session target sip-server
VOIP2801(config-dial-peer)#  dtmf-relay rtp-nte
VOIP2801(config-dial-peer)#  codec g711ulaw
VOIP2801(config-dial-peer)#  no vad
VOIP2801(config)#dial-peer voice 100 voip
VOIP2801(config-dial-peer)#  description *** Incoming Dial-Peer ***
VOIP2801(config-dial-peer)#  session protocol sipv2
VOIP2801(config-dial-peer)#  incoming called-number .
VOIP2801(config-dial-peer)#  dtmf-relay rtp-nte
VOIP2801(config-dial-peer)#  codec g711ulaw
VOIP2801(config-dial-peer)#  no vad
Note: As I said above, we’ll talk about these in more detail in a future post.  I actually got these straight from the SIP-UA website.

Testing and Conclusion
At this point inbound and outbound calling should work just fine.  I apologize for not talking about the SIP and dial peer configuration just yet.  Both those topics deserve their own posts to do any sort of justice to the topic.  Hopefully this has been enough to get you up and running.  Feel free to ping me with questions, I’m still learning the CME piece as well.


So I decided that it would be fun to play around with Call Manager Express in my home lab and get some experience with SIP and Cisco voice technologies.  Initially, I held back from playing around with it since I didn’t want to pay for DIDs and SIP trunks (despite them being very reasonable) just for a lab environment.  After some googling, I came up with this…


Free SIP trunks for lab testing!  What a steal!  I’ve had some brief communications with the guys over at SIP-UA and they are very helpful.  It works like this…

-All lab users share a single DID.  When you call the DID, it asks you for your lab extension (you get assigned one when you sign up) and then forwards the call to you.
-Outbound calling is allowed in the US but limited to 2 minutes
-No monthly fees, no commitments, and no contracts

Pretty cool huh?  I’m a big fan and I think it’s really nice of the guys over there to offer this service to people who are trying to learn the technology.

In the next post, I’m going to a single phone base CME setup using a SIP-UA SIP trunk.



Newer entries »