Olle E. Johansson
2004-Jun-06 03:42 UTC
[Asterisk-Users] *** Asterisk Sunday News: The SIP NAT Special
This week, I've been really busy with the launch of a new Swedish Voip provider, www.bbtele.se, so I haven't been able to follow the Asterisk community and haven't been very responsive either. My apologies if you've tried to contact me and I did not reply quickly or at all. So to cover up (can't report on what is happening :-) I dedicate this issue of Asterisk Sunday News to the Asterisk SIP channel. Inside you'll find more information on why SIP and NAT doesn't really work as clockwork, as well as some other notes. This week's topics: ------------------- * A new mailing list: Asterisk-BSD * AST_DATA: Now on the bug tracker * Theme: SIP and NAT - what is the problem, really? ------------------------------------------------- ** One way audio? Why? ** The phone can call Asterisk, but I get no incoming calls? ** What can STUN do for me? ** Asterisk on the INSIDE of a NAT device ** Outbound SIP proxy - what is that? * What's the difference between SIP and IAX2? * Patch-of-the-week: SIP realm authentication *** A new mailing list: Asterisk-BSD ------------------------------------ This week, a new Asterisk mailing list was born. The Asterisk-BSD list will be the meeting place for all of us using Asterisk on FreeBSD systems. There are drivers for Digium hardware working now, we have patches for recursive mutexes and a lot of other issues solved. Some of these are integrated into cvs-head now, but not all. Since Asterisk is being developed primarily on Linux systems, we need a mailing list to discuss current and future issues and resolve them, as we've done with mutexes and a lot of compile-time errors. Subscribe now if you're running FreeBSD. If you're not, install FreeBSD today! * http://lists.digium.com : Asterisk mailing lists * http://www.freebsd.org : FreeBSD home * http://www.asteriskdocs.org : A project with too little FreeBSD information *** AST_DATA: Now on the bug tracker ------------------------------------ AST_DATA, the database abstraction layer I wrote about last week, is now added to the bug tracker. http://bugs.digium.com/bug_view_page.php?bug_id=0001765 *** SIP and NAT - what is the problem, really? ---------------------------------------------- Every day, there's a question related to SIP and NAT on the asterisk-users mailing list. That's no wonder, SIP and NAT is tricky. And Asterisk, SIP and NAT have many different configurations that could lead to problems. A SIP call involves both SIP signalling and RTP audio streams with the RTCP control streams as a hang-around. Let's look at it from above: SIP CLIENT SIP SERVER (phone) (phone) ---------------------> SIP SIP <--------------------- ---------------------> RTP RTP <--------------------- ---------------------> RTCP RTCP <--------------------- This means that we have six different UDP streams for one call. Each one have a sender's address (IP) and a sender's port (UDP) and a recepients address and port. In most cases, the RTP ports are dynamic, to enable multiple calls at a time. If you place a firewall in between the phone, you can imagine that there's a lot of ports to open and close for a call. *** One way audio? Why? If both client and server are located on the same network, which was the assumption of the SIP architects, this is rather elegant. It get's messy if they are on two different networks with a NAT (Network Address Translator) device between them. Let me explain. SIP PHONE (A)------------NAT--------------SIP PHONE (B) Local network INTERNET Now, the SIP phone A tries to call SIP phone B. The NAT device let's the SIP message go out to SIP phone B, and "remembers" that A is talking UDP to B. When B answers, the NAT device looks the address up in memory, figuring out that B was contacted by A and sends the packet to A. In the SIP answer from B, B told a that "I listen for your audio on this RTP port". In the original message from A to B, A told B that "I listen for incoming audio on this IP and this port". Here's where the problematic area begins. Phone A is able to send audio to phone B. But the message from A to B included a non-existing IP address (Internal RFC1918 IP address) so there's no way B can send audio to A. This is the reason for a lot of messages on the list saying -"I only get audio in one direction in my SIP call". There's no way B can send audio to A. Period. We need to change the behaviour of A and B to get calling out to work. * Solution: The Asterisk NAT fix Imagine that Phone B is your Asterisk server. In the Asterisk SIP channel, there's a peer setting called "nat=yes". This changes the behaviour of phone B, i.e. Asterisk. When phone A sends an invitation to a call, it includes the IP address and port where it listens for audio from phone B, your Asterisk server. If "nat=yes" is set, Asterisk says "fine, dude" and totally ignores this data. Instead, it checks the IP address the message was sent from, i.e. your NAT device. This IP address is used instead of the local private address (RFC1918) and audio is sent to that address instead. With most NAT devices, the audio is then forwarded to the client and we have two way audio. Conclusion: If Asterisk is on a public address (on the Internet) and your phone is behind a NAT (from the server's point of view), setting nat=yes fixes your audio problem. *** The phone can call Asterisk, but I get no incoming calls? The NAT device is like an old relative, it has got a very short memory. So after a while, the relationship between phone A and phone B is totally forgotten. Beacuse of this, when phone B wants to place a call to phone A, the NAT device looks at the IP sender's address and can't relate it to any device on the inside. It drops the packet and forgets all about it ever having been sent there in the first place. This is how NAT devices work. If communication starts from the inside, going out, answers are handed back to the inside. If someone on the outside wants to communicate to someone on the inside, that will not work. * Solution: Keep the gates open - NAT-keep-alives A SIP phone usually registers with a SIP proxy. This message comes from the inside of the NAT to the server on the outside. Now, there's an open connection in the NAT device. As soon as there's no more packets on that connection, the NAT device cancels the connection and forgets all about it. The trick is to keep the packets flowing, forcing the NAT device to keep the connection open. Some phones send NAT "keep-alive" packets by themselves. X-lite and Sipura have this feature. If the phone can't do it, configure Asterisk to do it. Setting "qualify=yes" in the [peer] section for this device, Asterisk starts sending packets to the device, keeping the NAT connection open. You will also be able to see some timing for packets between Asterisk and the phone when you do "sip show peers" at the CLI. Now, when Asterisk wants to place a call to the phone, the NAT welcomes the packets and forwards them happily to your phone. Conclusion: If Asterisk is on a public IP address and your phone is on the inside of a NAT device, we need to keep the NAT connection open by frequently sending dummy packets between the devices. This will keep the connection open for incoming calls. *** What can STUN do for me? STUN, Simple Traversal of UDP over NAT devices, is a *discovery* protocol. With STUN, the phone on the inside of the NAT device can send discovery packets to a STUN server, trying to figure out how the NAT device works. NAT devices can work in many ways, and there are evil ones that will not let phone calls go through, regardless of what you do. STUN-enabled phones will discover those. STUN tells the phone, among other things, what IP address the NAT device is using on the outside. When the phone then signals to the SIP proxy/server, it sends the proper IP address, not the private IP address used on the inside. With a proper implementation, you don't need nat=yes for STUN- enabled phones. The data sent to Asterisk will be correct. *** And UPNP, will that help? UPNP, Universal Plug'n'play, is another solution. It's a protocol that the phone can use to communicate with the NAT device, allocating ports and getting a proper configuration. With UPNP enabled phones and NAT devices, your Asterisk server doesn't need nat=yes. *** Asterisk on the INSIDE of a NAT device If you have Asterisk on the INSIDE of a NAT device, trying to communicate with a SIP proxy (like Free World Dialup) on the outside or having phones on the outside, you're in another ball game. Check the sip.conf.sample in the Asterisk configs directory for the externalip and localnet settings, that tells Asterisk what the outside IP address is. And yes, we could use a STUN client in Asterisk so that Asterisk could figure out what to do. Any coders? You're wanted. If you have phones on the outside, port forwarding is your best friend. As you can imagine, this is not an easy task. Check the wiki for help. *** Outbound SIP proxy - what is that? An outbound SIP proxy is a SIP proxy in the same sense as you can configure a web proxy on the edge of your LAN, handling all web traffic between your LAN and the outside world. An outbound SIP proxy would take care of all SIP messages between your LAN and the outside world, the Internet. This proxy could also handle conversion of IP addresses, and assist the firewall in opening and closing RTP/RTCP ports to let the call go through. The Internet IX66 works like this, and there are ways to configure the SIP Express Router to be part of the Firewall DMZ, handling the SIP messaging and working with an RTP proxy to handle the audio. Currently, there's no support in Asterisk for an outbound SIP proxy. I am working on it, but need some help. Check chan_sip2 in the bug tracker. *** Summary: NAT - It's a big mess, and it ain't easy SIP and NAT is not an easy topic, since there are so many different NAT devices out there. It's getting easier with SIP devices detecting type of NAT with STUN, delivering correct and useful data to the SIP proxy. There's also a lot of topics I haven't covered in this short essay, like handling the media path (canreinvite=no for devices on the inside of a NAT), RTP proxies and Session Border Controllers. We'll come back to that later, possibly when we document all of this in the Asterisk handbook. Read more: * http://www.voip-info.org/wiki-NAT+and+VOIP * http://www.voip-info.org/wiki-Asterisk+SIP+NAT+solutions * http://www.voip-info.org/wiki-Asterisk+sip+nat *** What's the difference between SIP and IAX2? ----------------------------------------------- While SIP is a protocol that is being developed, but not yet standardized, in the IETF, IAX2 is more of a proprietary development that is created for Asterisk to Asterisk communcation. Nowadays, there are many soft phones created using the IAX2 protocol as well as ATA devices, like Digium's IAXY. IAX2 uses one port for signalling and audio. If the "client" is on the inside of a NAT device, it registers and then keeps the connection open with keep-alives. This way, calls can be placed in both directions. IAX2 doesn't use dynamically allocated ports for audio like SIP, thus making it much easier to traverse NAT devices and to configure Firewalls to support IP telephony. * Patch-of-the-week: SIP realm authentication --------------------------------------------- There's a patch I want you to test in the bug tracker. It adds realm- based authentication to the Asterisk SIP channel. What is this? If you want to place outbound calls to a SIP proxy that needs you to authenticate, you can now add the credentials (username/password) you use for this service, without having to add a register=> line or a [peer] section. Also, one [peer] can have multiple authentications, based on realm. This is handy with a protected outbound proxy. Please test and add your comments to the bug tracker. * http://bugs.digium.com/bug_view_page.php?bug_id=0001723 *** Useful Asterisk web links: ------------------------------ * Asterisk: http://www.asterisk.org * Asterisk mailing lists: http://lists.digium.com (users, dev, biz, bsd and cvs mailing list) * Asterisk bug tracker: http://bugs.digium.com * Asterisk IRC channel: #asterisk on irc.freenode.net * Digium: http://www.digium.com * Wiki: http://www.voip-info.org * Voip Search: http://search.voip-forum.com * Astricon: http://www.astricon.net That's all for this week. The SIP and NAT problem is really caused by the collission between reality and the beautiful vision. The vision is an Internet with only public addresses. The reality is that we have a shortage and only get a few IP addresses from our ISP's, forcing us to use NAT devices. Maybe the vision will come true with IPv6, but for most of us, that's also a vision of the future. (And there's no IPv6 support in Asterisk - until you start adding it!) There's sunshine and blue skies outside, so you will not find me on the IRC today, more likely in the garden outside taking care of my flowers or playing Boule Petanque. Maybe later this evening, european time... And if you have topics for me to include in Asterisk Sunday News, mail me off list :-) Have a nice Asterisk week! /Olle