RTCQuick Start Guide
User Manual: Pdf
Open the PDF directly: View PDF .
Page Count: 88
Download | |
Open PDF In Browser | View PDF |
Real-Time Communications Quick Start Guide Daniel Pocock [http://danielpocock.com] Real-Time Communications Quick Start Guide Daniel Pocock [http://danielpocock.com] Copyright © 2013, 2014, 2015 Daniel Pocock Table of Contents Preface ........................................................................................................................ xi 1. Introduction .............................................................................................................. 1 Federation ............................................................................................................ 1 Independent and decentralized alternatives to federation ............................................... 1 Private networks ............................................................................................ 1 Decentralized networks ................................................................................... 1 Conclusion ................................................................................................... 2 Choosing between SIP and XMPP ............................................................................ 2 Choice of operating system ..................................................................................... 3 Using a ready-to-run or turn-key solution .......................................................... 3 Using a generic GNU/Linux distribution ............................................................ 3 Use latest software versions .................................................................................... 3 Using IPv6 ........................................................................................................... 4 Example network used in the documentation .............................................................. 4 2. Architecture overview ................................................................................................. 5 The big picture ...................................................................................................... 6 TLS is essential ............................................................................................. 7 All SIP connectivity through a SIP proxy .......................................................... 7 SIP federation between two autonomous sites ............................................................. 8 Routing calls within a site ....................................................................................... 8 WebRTC peer-to-peer calling .................................................................................. 9 WebRTC calling to call centers .............................................................................. 10 3. User Experience ....................................................................................................... 11 First time setup and provisioning ............................................................................ 11 Dialing ............................................................................................................... 11 Usernames or phone numbers? ....................................................................... 11 Dial plans ................................................................................................... 11 Dialing Internet addresses .............................................................................. 12 4. Optimizing Connectivity ............................................................................................ 13 Codec selection ................................................................................................... 13 Recommendations ........................................................................................ 15 Media stream encryption compatibility .................................................................... 15 Supporting multiple schemes ......................................................................... 16 Recommendations for maximizing connectivity ................................................. 16 Recommendations for security ....................................................................... 17 Use ICE and a TURN server ................................................................................. 17 Use the TLS transport for SIP signalling .................................................................. 17 Getting through firewalls ....................................................................................... 18 5. DNS setup .............................................................................................................. 20 Using non-standard ports ....................................................................................... 20 Sample DNS zone file .......................................................................................... 21 Testing the DNS settings ....................................................................................... 21 6. Firewall rules .......................................................................................................... 22 Overview of firewall ports ..................................................................................... 22 NAT considerations .............................................................................................. 22 Setup with iptables on Linux ............................................................................ 23 7. User and credential storage ........................................................................................ 24 Credentials .......................................................................................................... 24 Personal account names or extension numbers .................................................. 24 Password encryption ..................................................................................... 25 HA1 in detail .............................................................................................. 25 Databases ........................................................................................................... 25 RADIUS ..................................................................................................... 25 LDAP ........................................................................................................ 26 SQL databases ............................................................................................. 26 iii Real-Time Communications Quick Start Guide Product-specific file formats .......................................................................... 27 Conclusion .......................................................................................................... 27 8. Server setup ............................................................................................................ 29 9. TLS certificate creation ............................................................................................. 30 Certificate Common Name .................................................................................... 30 Install the OpenSSL utility .................................................................................... 31 Install the Let's Encrypt certbot utility ................................................................ 31 Install a TLS certificate using Let's Encrypt (certbot) ................................................. 31 Install a TLS certificate manually ........................................................................... 32 10. ICE/STUN/TURN server installation .......................................................................... 34 Choosing a TURN server ...................................................................................... 34 reTurnServer from reSIProcate ............................................................................... 34 Installation .................................................................................................. 34 Configuration .............................................................................................. 35 Provisioning users ........................................................................................ 35 Testing the TURN server ...................................................................................... 36 11. SIP proxy server installation ..................................................................................... 37 Choose your SIP proxy ......................................................................................... 37 repro SIP proxy ................................................................................................... 37 Package installation ...................................................................................... 37 Configuration .............................................................................................. 37 Testing with s_client ............................................................................... 40 Login to web administration .......................................................................... 41 User management ........................................................................................ 41 Adding a user .............................................................................................. 41 Adding routes for numeric dialing .................................................................. 43 Kamailio SIP proxy .............................................................................................. 45 Package installation ...................................................................................... 45 Configuration .............................................................................................. 45 12. XMPP (Jabber) server installation ............................................................................. 46 Choosing an XMPP server .................................................................................... 46 Prosody XMPP server .......................................................................................... 46 Package installation ...................................................................................... 46 Configuration .............................................................................................. 46 User management ........................................................................................ 47 Further reading ............................................................................................ 47 ejabberd XMPP server .......................................................................................... 48 Package installation ...................................................................................... 48 Configuration .............................................................................................. 48 jabberd2 XMPP server .......................................................................................... 48 Package installation ...................................................................................... 48 Configuration .............................................................................................. 49 Further reading ............................................................................................ 49 13. WebRTC ............................................................................................................... 50 Technical overview .............................................................................................. 50 Media streaming capabilities .......................................................................... 50 Signalling protocols ...................................................................................... 51 User privacy and security .............................................................................. 51 Authentication ............................................................................................. 51 Practical WebRTC deployment ............................................................................... 52 WebRTC clients and firewalls ........................................................................ 52 JsSIP and JSCommunicator ........................................................................... 52 Content Management Systems and other frameworks ......................................... 53 Troubleshooting ........................................................................................... 53 14. Client devices and softphones ................................................................................... 54 Softphones .......................................................................................................... 54 IP desk phones .................................................................................................... 54 Smartphone apps .................................................................................................. 55 iv Real-Time Communications Quick Start Guide Click-to-dial ........................................................................................................ 55 The Firefox Telify plugin .............................................................................. 55 Mozilla Thunderbird and GNOME Evolution address books ................................ 55 Using sipdialer ...................................................................................... 55 Using Asterisk or FreeSWITCH ..................................................................... 55 15. Adding ENUM to DNS ........................................................................................... 56 How ENUM works .............................................................................................. 56 Consuming ENUM data ........................................................................................ 57 Publishing ENUM data ......................................................................................... 57 Public ENUM ............................................................................................. 57 Private and third-party ENUM suffixes ............................................................ 57 Dynamic ENUM from LDAP with dlz-ldap-enum ....................................... 58 16. Troubleshooting ...................................................................................................... 59 Common problems and solutions ............................................................................ 59 Google Talk/Hangouts users not receiving XMPP chat messages .......................... 59 Audio and video quality issues ....................................................................... 59 Techniques .......................................................................................................... 60 Monitoring tools .......................................................................................... 60 Check the logs ............................................................................................ 60 Check the web interface ................................................................................ 60 Operating system utilities .............................................................................. 60 Packet sniffers ............................................................................................. 61 Debugging mode .......................................................................................... 61 WebRTC and WebSockets ............................................................................ 61 17. PBX Setup ............................................................................................................ 62 The all-in-one myth .............................................................................................. 62 Choosing between Asterisk and FreeSWITCH .......................................................... 62 Official packages ......................................................................................... 63 Contributing patches ..................................................................................... 63 Licensing .................................................................................................... 63 Community ................................................................................................. 63 Scalabiltiy and code quality ........................................................................... 64 Using Asterisk with the repro SIP proxy .................................................................. 64 18. PSTN connectivity .................................................................................................. 66 Methods of PSTN connectivity ............................................................................... 66 ingress call handling ............................................................................................. 66 egress call handling .............................................................................................. 66 Emergency calls .................................................................................................. 67 19. Frequently Asked Questions ..................................................................................... 68 20. Community support ................................................................................................. 69 Mailing lists ........................................................................................................ 69 Major announcements ................................................................................... 69 Strategy and advocacy .................................................................................. 69 Collaboration between operators and service providers ....................................... 69 Server support ............................................................................................. 69 Softphones .................................................................................................. 69 Popular blogs and news sites ................................................................................. 69 A. Building reSIProcate packages on Debian/Ubuntu ......................................................... 70 B. Building reSIProcate RPMs on RHEL and CentOS ........................................................ 71 C. Configuring Nagios to monitor SIP, XMPP and TURN .................................................. 72 Nagios plugins .................................................................................................... 72 Nagios service checks ........................................................................................... 72 D. Mitigating VoIP fraud risk ........................................................................................ 74 Legal insurance ................................................................................................... 74 Trade body membership ........................................................................................ 74 Set a credit limit .................................................................................................. 74 Use a different phone company for inbound numbers ................................................. 75 E. Directory of RTC and VoIP Service Providers .............................................................. 76 v Real-Time Communications Quick Start Guide apidaze ............................................................................................................... Circuit ................................................................................................................ Developers .................................................................................................. Gradwell ............................................................................................................. RestComm .......................................................................................................... Tropo ................................................................................................................. Truphone ............................................................................................................ Voxbone ............................................................................................................. Voxhub .............................................................................................................. VoxImplant ......................................................................................................... vi 76 76 76 76 76 76 76 77 77 77 List of Figures 2.1. Overview ............................................................................................................... 6 2.2. SIP federation between two sites ................................................................................ 8 2.3. Four stages of call routing ........................................................................................ 8 2.4. WebRTC basic peer-to-peer ...................................................................................... 9 2.5. WebRTC from customer web browser to call center ..................................................... 10 4.1. Metcalfe's law ....................................................................................................... 13 11.1. repro web administration: adding a domain ............................................................... 41 11.2. repro web administration: adding a user ................................................................... 42 11.3. repro web administration: listing users ..................................................................... 42 11.4. repro web administration: adding a route .................................................................. 43 11.5. repro web administration: listing routes .................................................................... 44 11.6. repro web administration: routing test ...................................................................... 44 13.1. DruCall/JSCommunicator/JsSIP software stack .......................................................... 53 vii List of Tables 4.1. Common codecs .................................................................................................... 5.1. DNS records for the example ................................................................................... 5.2. Protocols using port 443 ......................................................................................... 6.1. Firewall rules summary ........................................................................................... 6.2. Firewall rules summary (IPv6) ................................................................................. 11.1. Comparison of SIP proxy servers ............................................................................ 11.2. TLS client verification modes ................................................................................ 17.1. repro route configuration ....................................................................................... viii 14 20 20 22 22 37 39 64 List of Examples 2.1. Splitting Asterisk extensions.conf ...................................................................... 9 5.1. ISC Bind zone file entries ....................................................................................... 21 5.2. Inspecting DNS entries with dig ............................................................................. 21 6.1. Firewall setup with iptables ............................................................................... 23 7.1. Computing HA1 .................................................................................................... 25 7.2. OpenLDAP ACL for protecting ha1Password ......................................................... 26 7.3. SQL table for repro users ........................................................................................ 26 7.4. SQL view presenting Asterisk users to repro .............................................................. 27 7.5. Install PostgreSQL on Debian or Ubuntu ................................................................... 27 7.6. Configure PostgreSQL and load schema .................................................................... 27 8.1. Adding IP addresses in /etc/network/interfaces ............................................. 29 9.1. Installing openssl on Debian/Ubuntu ..................................................................... 31 9.2. Installing openssl on Fedora/RHEL/CentOS ............................................................ 31 9.3. Installing certbot on Debian/Ubuntu ..................................................................... 31 9.4. Installing certbot on Fedora/RHEL/CentOS ............................................................ 31 9.5. PKI directories (Debian/Ubuntu) .............................................................................. 32 9.6. PKI directories (Fedora/RHEL/CentOS) ..................................................................... 32 9.7. Creating RSA key pair and CSR .............................................................................. 32 9.8. Installing the certificate ........................................................................................... 32 10.1. Installing reTurnServer on Debian/Ubuntu .......................................................... 34 10.2. Install reTurnServer on Fedora/RHEL/CentOS .................................................... 34 10.3. reTurnServer.config entries ......................................................................... 35 10.4. Restarting the reTurnServer daemon (systemd) ................................................. 35 10.5. Using netstat to verify reTurnServer is running .............................................. 35 10.6. crontab entry for psql-user-extract ........................................................... 36 10.7. Sample /etc/reTurn/psql-user-extract.config ...................................... 36 10.8. Installing the stun client utility ............................................................................. 36 10.9. Using the stun client utility ................................................................................. 36 11.1. Installing repro on Debian/Ubuntu ........................................................................ 37 11.2. Install repro on Fedora/RHEL/CentOS .................................................................. 37 11.3. Sample values for repro.config ........................................................................ 38 11.4. Using PostgreSQL ................................................................................................ 39 11.5. Using MySQL ...................................................................................................... 40 11.6. Using htdigest to set admin user password ......................................................... 40 11.7. Restarting the repro daemon (systemd) ............................................................... 40 11.8. Using s_client to test SIP ports (Debian/Ubuntu) .................................................. 40 11.9. Using s_client to test SIP ports (Fedora/RHEL/CentOS) ........................................ 40 11.10. Installing kamailio on Debian/Ubuntu ................................................................ 45 11.11. Install kamailio on Fedora/RHEL/CentOS .......................................................... 45 11.12. Restarting the kamailio daemon (systemd) ....................................................... 45 12.1. Installing Prosody on Debian/Ubuntu ...................................................................... 46 12.2. Install Prosody on Fedora/RHEL/CentOS ................................................................. 46 12.3. Domain configuration file (Let's Encrypt / certbot) ................................................ 46 12.4. Domain configuration file (manual) ......................................................................... 47 12.5. Restarting the prosody daemon (systemd) ........................................................... 47 12.6. Using prosodyctl to add a user ......................................................................... 47 12.7. prosody.cfg.lua settings for mod_auth_ldap ................................................ 47 12.8. Installing ejabberd on Debian/Ubuntu ...................................................................... 48 12.9. Install ejabberd on Fedora/RHEL/CentOS ................................................................ 48 12.10. ejabberd interface example .............................................................................. 48 12.11. Installing jabberd2 on Debian/Ubuntu .................................................................... 48 12.12. Install jabberd2 on Fedora/RHEL/CentOS .............................................................. 48 12.13. jabberd2 c2s.xml example ................................................................................ 49 12.14. jabberd2 sm.xml example ................................................................................ 49 13.1. repro.config settings for cookie and URL parameter authentication ........................ 52 ix Real-Time Communications Quick Start Guide 15.1. Using dig to perform ENUM queries ..................................................................... 15.2. Installing dlz-ldap-enum on Debian/Ubuntu ........................................................ 15.3. Install dlz-ldap-enum on Fedora/RHEL/CentOS .................................................. 15.4. Sample dlz_ldap_enum.conf .......................................................................... 15.5. Additions to named.conf for Debian/Ubuntu ......................................................... 15.6. Additions to named.conf for Fedora/RHEL/CentOS ............................................... 17.1. Asterisk sip.conf ............................................................................................. 17.2. Asterisk extensions.conf ............................................................................... 18.1. Asterisk extensions.conf for specifying caller ID ............................................... A.1. Installing the debuild command ........................................................................... A.2. Installing the compiler and dependencies ................................................................... A.3. Running the debuild command ............................................................................ A.4. Running the debuild command using code from Git ................................................ B.1. Installing the rpmbuild command ......................................................................... B.2. Installing the compiler and dependencies ................................................................... B.3. Creating the rpmbuild directories ......................................................................... B.4. Running the rpmbuild command .......................................................................... C.1. Sample /etc/nagios-plugins/config/stun.cfg ......................................... C.2. Sample /etc/nagios-plugins/config/sip.cfg ........................................... C.3. Sample /etc/nagios-plugins/config/xmpp.cfg ......................................... C.4. Sample service check for STUN/TURN .................................................................... C.5. Sample service check for SIP over TLS .................................................................... C.6. Sample service check for SIP over TLS (port 443) ...................................................... C.7. Sample service check for XMPP .............................................................................. x 57 58 58 58 58 58 64 65 67 70 70 70 70 71 71 71 71 72 72 72 72 73 73 73 Preface Mission This book aims to provide practical strategies for deploying RTC with the technology available today. Vision A world where open standards and free software are the foundation of personal and business communications, enabling genuine innovation and the emergence of more disruptive technologies. Who is this document for? IT managers, system administrators, developers, web designers, product managers and IT users who want best-practice Real-Time Communications (RTC) technology for business or private use. What is Free RTC? Running your own, independent, federated and peer-to-peer RTC solutions, including instant messaging (IM), voice-over-IP (VoIP), video/webcam, social networking and WebRTC, using open standards and, in many cases, free, open source software. Why? There are many reasons organizations and individuals need to run their own RTC infrastructure: Resilience: operating RTC servers to the same high standard as the rest of your non-stop infrastructure rather than relying on some vendor who provides a free download for anybody and everybody. Security: avoid installing proprietary, third party communications apps and plugins. Privacy: avoid letting sensitive information be harvested by cloud providers. Brand building: keep users on your own web site, assert your domain name in all communication sessions. Control: recognize callers who are already logged in to your web site and route their call efficiently based on language, account size or other factors. Innovation: in traditional phone companies, technical innovation has slowed. Open standards and free software allow individuals and businesses of any size to engage in genuine innovation, creating new and original services that run across the network. How? This documentation aims to help you choose strong, best of breed, stable and supported components based on genuinely free software [https://www.gnu.org/philosophy/free-sw.html] and open standards. There are step-by-step instructions for DNS, firewall and server configuration and testing to achieve maximum chance of success for every call or chat connection your users need to make. Thanks to the convenient packages in Linux (Debian, Ubuntu, Fedora and Red Hat/RHEL/CentOS), most IT professionals will be able to set this up in less than one day, the most experienced reader will find that it can be set up in less than an hour. xi Chapter 1. Introduction This quick start guide walks through the essential steps to build a working real-time communications platform with full support for federation with other autonomous domains over the public Internet. We show the essential steps first: setting up a TURN server, SIP proxy and an XMPP server. Setting up an Asterisk or FreeSWITCH PBX is not essential, these are supplementary services that should be added in a later stage of the project. Federation Federation enables direct and efficient communication between any two autonomous organizations connected to the public Internet. Email is already distributed thanks to SMTP federation. The same paradigm has taken hold in the world of voice and video communications. Any two users or organisations can connect to each other dynamically without requiring cumbersome, outdated and expensive solutions from traditional phone companies. A number of technologies help make federation work optimally. ENUM helps map traditional phone numbers to Internet domains, it is described in Chapter 15, Adding ENUM to DNS. DNS NAPTR and SRV records make it possible to locate servers willing to accept calls any given domain, they are described in Chapter 5, DNS setup. The SIP and XMPP protocols allow users to do much more than they can do with traditional phones, including cost-effective chat messaging, desktop sharing and videoconferencing. Independent and decentralized alternatives to federation Federation takes a lot of power from the telephone industry and places more power and control in the hands of organizations and individuals who run their own servers. This is generally a good thing for innovation, cost-efficiency, privacy and many other reasons. Critics of federation observe that while this model is not as tightly centralized as a traditional telephone network, it is built around a client-server model, leaving power in the hands of those who are able to operate the servers. Like many Internet-based technologies, it also relies heavily on other centralized services: the DNS protocol and the certificate authorities. Private networks Some operators have created private networks, where users can only call other users with the same softphone. All the users communicate through a central server. The operator chooses to locate the server in a location they believe to be secure and where they believe the risk of surveillance is low, such as Switzerland. Signal [https://en.wikipedia.org/wiki/Signal_(software)], the successor to RedPhone and TextSecure from Open Whisper Systems, operates through privately run servers. Administrators of the servers are able to observe who is calling who but without knowing what they are saying. Decentralized networks Various solutions have begun to emerge in the hope of further eliminating these dependencies and offering a genuinely decentralized service. In a truly decentralized service, the developer/founder of the service is not even able to see which users are calling each other, making it more secure than privately run services such as Signal. 1 Introduction A fundamental issue for these alternatives is the addressing scheme. Some rely on phone numbers and some of these solutions require their users to use an identifier other than a phone number, exchanging the identifiers in person or though some other communications channel. If phone numbers are used, it makes the service more convenient but this implies placing some trust in the phone numbering scheme operated by the telephone industry. Another fundamental issue for these services is bootstrapping: how the client finds other peer-to-peer participants the first time the user runs the software. The current solution to this is usually a central server keeping a list of peers to seed the clients. Examples of some decentralized and peer-to-peer networks include the Ring softphone from Savoir Faire Linux [https://ring.cx], using the OpenDHT [https://github.com/savoirfairelinux/opendht] network, the Tox app [http://tox.chat/] and the Matrix.org [https://matrix.org/] service. Conclusion While some of these alternatives are promising, none of them offers a silver bullet. Private and decentralized services are only useful for specific purposes where two people know each other personally, such as calling a spouse, a physician calling a patient or a lawyer communicating with a client. For large organizations that deal with other large organizations and with the public in a less personal manner, the decentralized model is not universally applicable and a federated model is more likely to gain traction and meet operational needs. That said, it is not uncommon for senior executives in some large corporations to seek out specialized communications solutions so they can have private conversations with each other and their closest advisors. Decentralized services are not mutually exclusive with federated RTC. It is quite feasible for an organization to operate standard SIP or XMPP internally but setup a gateway at the edge of their network to accept calls from customers using alternative services. The external user needs to have some way to be certain that their call is connected to an account controlled by the organization they want to contact and not an imposter or a man-in-the-middle who is relaying the call while monitoring it. Choosing between SIP and XMPP The IETF has documented two standards for real-time communications that are widely implemented: SIP and XMPP. XMPP is sometimes referred to as Jabber. This has left many system administrators pondering the question: which one do I need? Both SIP and XMPP can do all the same things. SIP can make phone calls, video calls and instant messaging (IM) sessions. XMPP can also make phone calls, video calls and IM sessions. There has been a tendency to use SIP more for voice and use XMPP more for IM. Both have evolved into different markets. SIP is particularly well supported by telecommunications vendors (for example, companies offering trunking to or from the PSTN) and manufacturers of related hardware, such as ISDN gateways. Many larger corporate phone systems also have some kind of SIP interface. XMPP has become very prominent as a system for federated IM and many companies have deployed it for this purpose without necessarily using it for voice and video. Just as a significant number of voice related products and services use SIP, there is a significant quantity of high quality IM client software and third-party frameworks for interaction with XMPP and this has helped it remain dominant in the IM domain. In many cases, a SIP user ID and an XMPP user ID look identical, except for the URI prefix and both can be used to reach the same physical person. For example, sip:alice@example.org and xmpp:alice@example.org both provide a means to contact the same fictitious Internet user prominent in so many of the IETF's publications. 2 Introduction From the user's perspective, when they see an address without a scheme prefix such as sip: or xmpp:, they have no way to know if it is useful for email, SIP or XMPP and may have to manually try it in several applications. Some users may not even realize that these different protocols exist for RTC and if the address doesn't appear to work in the first application where they try to use it, they make come to the conclusion that the address is invalid or the other person is unreachable. The overwhelming recommendation of the author of this guide and the software described here is that to maximise your chance of communicating with as many users as possible, you should operate both SIP and XMPP servers in parallel. Fortunately, some of the infrastructure for these servers (such as TURN servers and the X.509 certificates) can be shared by both protocols. Choice of operating system RTC is possible using a range of operating systems, including those popular on desktop computers, servers and smartphones. This guide does not recommend a specific operating system. However, we believe that for people who want to mix and match individual packages, the most recent stable releases of popular GNU/Linux distributions, including Debian, Ubuntu and Fedora, provide a convenient way to get all the necessary software in ready-to-run packages. For people who want a turn-key solution, it may be better to choose one of the self-installing or ready-to-run RTC or groupware solutions. Using a ready-to-run or turn-key solution There are various turn-key solutions for building servers for RTC or generic office/groupware purposes. These typically run off a live ISO image, provide a script to pre-install and configure packages or they are an image for a platform like Docker. Examples of these platforms include WikiSuite [http://WikiSuite.org] (based on RHEL) and Turnkey Linux [https://www.turnkeylinux.org/] (based on Debian). Using a generic GNU/Linux distribution Users of Red Hat Enterprise Linux, CentOS, openSUSE, SLES and other platforms may need to build the packages manually using rpmbuild as described in Appendix B, Building reSIProcate RPMs on RHEL and CentOS. Several of the components described in this guide have been tested on a much wider range of platforms. The reSIProcate products, including the repro SIP proxy and reTurn TURN server, are extremely versatile and known to run successfully on Microsoft Windows, Apple OS, iOS, BSD variants, Android and several Linux based routers including OpenWRT, CeroWRT and DD-WRT. Use latest software versions It is recommended that the latest software versions are used, especially for components such as the TURN server, SIP proxy and XMPP server as these components need to achieve connectivity with a wide range of peers on the public Internet. This does not imply using an unstable or beta version of your preferred Linux distribution, such as Debian sid or Fedora rawhide. Rather, it is recommended that the current stable release of the operating system is used and the RTC components can then be installed from a source such as Debian's stablebackports or Red Hat's EPEL. Sometimes stable-backports or EPEL won't have the latest version of a particular package or you want to test some bleeding edge version of the package to see if it fixes a particular bug. Many of the packages can be built manually from the source code. All the leading RTC server projects make this very easy as they support tools like debuild for Debian/Ubuntu (see Appendix A, 3 Introduction Building reSIProcate packages on Debian/Ubuntu) or rpmbuild for RedHat/CentOS/Fedora (see Appendix B, Building reSIProcate RPMs on RHEL and CentOS). Using IPv6 Now that IPv4 address space is fully allocated, it is highly desirable for organizations to include IPv6 when implementing any new network services. Therefore, both IPv4 and IPv6 are used in all examples throughout this guide. All of the recommended software products work on both IP versions. Everything in this guide will still work even if you only use IPv4 or IPv6 alone. Example network used in the documentation For the purposes of this guide, the following conventions are used: The DNS domain name is example.org. All the applications run on a server called server1.example.org. In practice, you could run each service on a different server and you may duplicate services across multiple servers for N+1 redundancy. The ICE/STUN process requires two public IPv4 addresses, either on the same interface or on different interfaces. In the examples, the server has two IPv4 addresses on the same interface/subnet, they are 198.51.100.19 and 198.51.100.20. These IP addresses come from the RFC 5737 documentation subnets [https://tools.ietf.org/html/rfc5737]. For IPv6, RFC 3849 reserves the address prefix 2001:DB8::/32 for documentation. In the examples, server1.example.org uses the address 2001:DB8:1000:2000::19/64. The users have existing email addresses such as first.last@example.org and will use the same addresses for both SIP and XMPP. The internal phone numbers are four digit extensions, such as 8001, 8002 and 8003. 4 Chapter 2. Architecture overview This chapter gives a high-level overview of the RTC architecture. Each component is explained in more detail in its own chapter. 5 Architecture overview The big picture Figure 2.1. Overview 6 Architecture overview Figure 2.1, “Overview” demonstrates each of the components and how they are interconnected. The diagram includes an example of an external softphone user calling an internal softphone user, the call is setup with SIP and the RTP media streams (dotted lines) pass through the TURN server. TLS is essential SIP, XMPP and WebSockets can be easily configured to run without TLS encryption. Unfortunately, doing so would lead to many of the same problems as email, including spam and impersonation. Impersonation is even more troublesome in RTC than in an email exchange. If a user replies to an email with a forged From header, the reply will go to the person who was impersonated. The imposter is unable to receive replies to the emails they send. If a user answers a phone call from a forged SIP address, however, they are immediately engaged in two-way communication with the imposter. Therefore, when RTC protocols are used on the public Internet, TLS should always be used. Additional reasons for using TLS are discussed in the section called “Use the TLS transport for SIP signalling”. SMTP is a much older protocol than SIP and XMPP and while it does now boast support for STARTTLS, it doesn't clearly specify a mechanism for validation of message headers against the certificates [http://tools.ietf.org/html/rfc6125#appendix-B.4]. All SIP connectivity through a SIP proxy The SIP proxy acts as a router between the external peers, internal peers and the soft PBX. The soft PBX is typically a server running Asterisk or FreeSWITCH. It is important to note that the soft PBX does not connect directly to the public Internet and none of the internal users connect directly to the soft PBX. SIP proxy servers are generally more stable and more secure than soft PBXes. SIP proxy servers typically have more connectivity options, including best-of-breed support for IPv6, TLS and WebRTC. In particular, the Asterisk PBX advertises support for TLS but it doesn't support mutual TLS certificate verification, something that works seamlessly in the SIP proxy repro. This means that Asterisk accepts TLS connections from users and other servers but is unable to verify local devices with built-in certificates such as Polycom phones. If Asterisk is configured to accept TLS connections from the public Internet, Asterisk accepts any call from the peer without validating the domain in the From header. Soft PBXes tend to have many more features and vastly more configuration options, this also means upgrades to the SIP proxy are relatively easy compared to upgrades of the soft PBX. Finally, some people like to be able to make configuration changes to their PBX during business hours. If users are maintaining connections and SIP registrations through the SIP proxy, they are much less likely to notice if the soft PBX is restarted or crashes. One consequence of this design strategy is that it is usually best to install, test and configure the SIP proxy before starting a soft PBX installation. In this guide, SIP proxy installation is covered in Chapter 11, SIP proxy server installation and soft PBXes are discussed in Chapter 17, PBX Setup. 7 Architecture overview SIP federation between two autonomous sites Figure 2.2. SIP federation between two sites Figure 2.2, “SIP federation between two sites” emphasizes those components that are involved in routing a federated SIP call from one site, example.org, to another site, example.edu. For simplicity, this diagram does not show the firewalls, soft PBX or other components. Assuming the softphone users are both using NAT addresses, the TURN servers may be relaying all the media streams on their behalf. Routing calls within a site Figure 2.3. Four stages of call routing Local users Int ernet Local users Ingress Inbound SIP or ISDN t runks Rout ing Applicat ion Egress Int ernet Out bound SIP or ISDN t runks If you have just started looking at the configuration of a SIP proxy or soft PBX, you have probably observed that the scripting languages provide almost infinite flexibility to route the calls in different ways. If you have been working with such configurations for a while, you may have seen some that have become tremendously convoluted. Figure 2.3, “Four stages of call routing” demonstrates a high-level approach to routing calls within your site, whether you are using a single SIP proxy or soft PBX or a combination of different components. There are four general stages. All calls, whether they come from SIP trunking providers, ISDN or local users should start in an ingress stage. The goal of the ingress stage is simply normalizing the numbers into a standard form that will be useful in all further stages of call processing. For example, if calls are coming in over an ISDN connection the provider may only be sending the last six digits of each destination DDI that has been dialed. The ingress stage handling calls from this ISDN circuit adds the country code and other 8 Architecture overview leading digits to normalize the numbers in the E.164 format (see Chapter 18, PSTN connectivity for more specific details about this type of ingress handling). When calls are sent to their final destination, whether it is a SIP trunking provider, ISDN circuit or a local user, the final stage it should go through is an egress stage. The format of the number/address usually needs to be modified again in the egress stage. For example, some providers expect E.164 numbers to have a 00 prefix, as this is the dialing prefix many countries use to call international numbers. Many deployments involve some services where calls are handled by an application. This is the application stage. These applications are typically voicemail services, call queues and DTMF-driven menus. Finally, all these stages are joined together by a routing stage. The routing stage accepts calls from the ingress stage, considers both the source of the call and the desired destination (both of which have been normalized already) and decides where to send them in the egress and application stages. All these stages can be implemented in a single system such as an Asterisk PBX. For ease of administration, it is advisable to break the extensions.conf file up into different files for each stage as demonstrated in Example 2.1, “Splitting Asterisk extensions.conf”. The more powerful approach is to transpose this paradigm over several individual processes and devices. For example, the ingress stage for calls from local users may be implemented in the SIP proxy and the ingress stage for calls from an ISDN circuit may be implemented using the configuration file in a media gateway. Example 2.1. Splitting Asterisk extensions.conf #include #include #include #include #include #include "/etc/asterisk/extensions/ingress/local_users.conf" "/etc/asterisk/extensions/ingress/trunks.conf" "/etc/asterisk/extensions/routing.conf" "/etc/asterisk/extensions/applications.conf" "/etc/asterisk/extensions/egress/local_users.conf" "/etc/asterisk/extensions/egress/trunks.conf" WebRTC peer-to-peer calling Figure 2.4. WebRTC basic peer-to-peer 9 Architecture overview Figure 2.4, “WebRTC basic peer-to-peer” demonstrates how two browsers can communicate with each other using WebRTC. The web browsers start by downloading the HTML, CSS and JavaScript from a normal web server such as Apache httpd. The JavaScript uses the WebSocket protocol to initiate a connection to the SIP proxy. When a call is made, the request is sent over the WebSocket connection and the media streams pass through the TURN server. In this case, the browsers are not relaying the media streams through the TURN server, possibly because they have discovered they are both on the same IP network. WebRTC calling to call centers Figure 2.5. WebRTC from customer web browser to call center Figure 2.5, “WebRTC from customer web browser to call center” demonstrates a more elaborate WebRTC architecture, a customer using a web browser to call a corporate call center. When a call is made, the request is sent over the WebSocket connection and the media streams pass through the TURN server. The SIP proxy routes all calls to the corporate PBX which routes the calls to an agent. The media streams must also pass through the PBX for transcoding from the Opus codec to one of the codecs supported by the desk phones, perhaps G.711 or G.722. 10 Chapter 3. User Experience Any successful IT project needs to focus on the needs of the user. This is particularly important for communications technology. First time setup and provisioning The most successful RTC projects all have a convenient means of user provisioning. In an office environment, this may mean that the softphone or desk phone is automatically configured for the user by a system administrator. Chapter 14, Client devices and softphones discusses the provisioning facilities of some types of phone. For a generic SIP service, an ISP or a corporate/campus environment with a bring-your-own (BYO) device policy, the ideal setup process should only require the user to enter their SIP/XMPP address and their password and the softphone/device should discover all other parameters using DNS NAPTR and DNS SRV queries. For this to be effective, softphones and devices aiming to be used in this way need to ensure they have suitable codec and encryption settings enabled by default so the user won't have to tweak them as recommended in Chapter 4, Optimizing Connectivity. Dialing At first glance, dialing a telephone may appear to be a trivial task. Some attention to detail is required to maximize user convenience. Usernames or phone numbers? A user may want to call or chat to various people. For some people, they may only have the email/ SIP/XMPP address and for other people they may only have a phone number. It is important to select phones that work intuitively for either type of input, an address of the form user@example.org or a phone number. It is also important to ensure that the server processes, such as SIP proxies, are correctly configured to route calls to arbitrary Internet addresses. The repro SIP proxy and most XMPP servers work this way by default. Some phones can even help convert from a phone number to a SIP or XMPP address, see Chapter 15, Adding ENUM to DNS. If the user has an entry in their address book with both a phone number and an email/SIP/XMPP address, then it is important that the phone gives the user a helpful way to choose which one to dial without asking too many questions about whether the user wants to use SIP or XMPP. This process can be optimized if the phone uses presence (a buddy list) to work out which contact mechanisms are unreachable. All of this can be made easier by using named accounts (like email addresses) instead of extension numbers within the server configuration, this is explained in more detail in the section called “Personal account names or extension numbers”. Dial plans Users find it easier to dial numbers in a local format (without a country code). Many personal address books and company databases store phone numbers in a local format. This can lead to confusion in situations where somebody tries to use a number in a different country, for example, if they take their mobile/cell phone to another country and try to dial a number stored in the address book. A dial plan should be designed to convert phone numbers to the international format (E.164), even if a user dials the number in a local format. This makes it easier to send some calls to carriers in different 11 User Experience countries and it makes life easier for organizations that expand into multiple countries. This means the user can dial in the local or international format but the phone system will work either way. Dialing Internet addresses In many cases, an email address may also be a SIP address or XMPP address. Ideally, when a user tries to dial a contact from their phone, the software should identify whether the contact is reachable over SIP or XMPP and use that route for the call if appropriate. 12 Chapter 4. Optimizing Connectivity People who have tried many of the free RTC softphones have observed that they don't always work through firewalls or NAT networks. Sometimes these problems give visual feedback, in the form of error messages advising that the call can't proceed. In other cases, the call appears to be connected but audio only works in one direction or stops after some brief period of time. Metcalfe's law tells us that the value of a telecommunications network is proportional to the square of the number of connected users of the system (n2), demonstrated in Figure 4.1, “Metcalfe's law”. Figure 4.1. Metcalfe's law 10000 f(n) 9000 8000 va lue of ne twork 7000 6000 5000 4000 3000 2000 1000 0 0 20 40 60 80 100 numbe r of us e rs Therefore, the benefit of making the solution work for all those users who may suffer in certain NAT environments does not just have a gradual or linear impact, the benefit is quadratic. Today's RTC technology gives us the tools to deal with these problems in the vast majority of cases. This chapter gives an overview of the main concerns. Codec selection Codec is a portmanteau of coder-decoder. A codec is an algorithm for encoding an audio or video signal for storage or transmission over a digital communications network. Codecs are responsible for compression of the data stream and may also take some responsibility for error correction, packet loss concealment and silence suppression. 13 Optimizing Connectivity Each device or softphone typically has one or more codec algorithms included. Some software, such as the Asterisk PBX, can support additional codecs with the help of modules or plugins. The list of codecs supported by a product depends on the age of the product, patents and the type of products it is intended to interact with. Open source solutions generally avoid patented codecs, although unofficial implementations of them can be found online, such as the popular G.729 codec for Asterisk. Table 4.1. Common codecs Name Type Bitrate (kbps) Patented Comments G.711 (alaw, audio ulaw) 64 N Widely supported in phones, WebRTC browsers, ISDN gateways and virtually everywhere else. Quality of traditional phone calls. G.722 audio 64 N Supported in most modern software and high quality desk phones. Transmits higher quality wideband audio in the same 64kbps bandwidth used by G.711 Opus audio 6 - 510 N Support in more modern software, WebRTC browsers and some very recent desk phones. G.729 audio 8 Y A low bitrate codec supported in a lot of older VoIP phones and related hardware. Voice quality less than a standard telephone call. G.723.1 audio 5.3, 6.3 Y An ultra-low bitrate codec support in some older VoIP phones and related hardware. Voices sound very bad. GSM rate full audio 13 N The original codec for GSM mobile telephony. Supported in many older open source products and some VoIP hardware. iLBC audio 15 N A codec developed for Internet use before Opus. Supported in many older open source products but not widely supported in VoIP hardware. speex audio 2-44 N A codec developed for Internet use before Opus. Supported in many older open source products but not widely supported in VoIP hardware. VP8 video depends N Mandatory part of WebRTC, supported in browsers. Bitrate depends on resolution and frame rate. H.264 video depends Y Mandatory part of WebRTC, supported in browsers and in many existing video conferencing hardware products. The person configuring the software or device can typically select which codecs are permitted and also specify which codecs are preferred over others. When a call is made, the endpoints negotiate to select a codec that is supported at both ends. If both endpoints have no codecs in common, the call is not possible and the user may see a message telling them the call failed. If both endpoints have more than one codec in common, the exact codec selected 14 Optimizing Connectivity in this negotiation algorithm depends on the relative priorities specified by the administrators of each endpoint. Some software has the ability to dynamically change the list of permitted codecs. For example, some mobile apps will only enable high-bandwidth codecs when they detect the mobile device is using wifi or a 4G/LTE network. More modern codecs support a variable bit rate that can be changed automatically during a call to adapt to poor network conditions. The Opus codec used for WebRTC has this capability. Recommendations Enable as many codecs as possible to maximize the chance of connection. This reduces the number of calls where the endpoints fail to find a common set of codecs. Disable those codecs that won't possibly work given the available bandwidth. For example, in a remote location with a 128kbit DSL broadband connection it is usually necessary to disable 64kbit codecs like G.711 and G.722 and use codecs that have lower audio quality such as Opus, GSM and G.729. However, in a location with good bandwidth, don't disable the low-bit rate/low-quality codecs. They will still be needed when calling a user who doesn't have great bandwidth. Order the remaining codecs based on the quality, with the best quality codec first. G.711 is typically present for compatibility but other codecs like G.722 offer better quality for the same amount of bandwidth, so rate G.722 ahead of G.711 and G.722 will be used whenever possible. Example 1: a mobile app: enable, in order of priority starting with the most preferred: Opus, Silk and GSM codecs. Example 2: a soft PBX in an office accessed by local users and mobile users: enable, in order of priority starting with the most preferred: Opus, G.722, G.711, Silk, iLBC, GSM, G.729. Media stream encryption compatibility RTC voice and video (media) streams are almost always transmitted using Real Time Protocol (RTP). Encrypting RTP streams is a popular requirement. Some organizations are subject to regulations requiring encryption. In other cases, there is a commercial imperative to use encryption. Just as HTTP sessions can be encrypted with HTTPS, RTP streams can be encrypted using SRTP. SRTP is optimized for the real-time nature of the media stream and it permits packet loss. However, thanks to the way that SRTP has involved, just looking for the encryption setting and turning it on may lead to a big loss in compatability with other users if the products you are using don't support the right combination of encryption protocols. We consider the issues here and then provide some recommendations. While SRTP itself is relatively standard, there are several different ways to exchange keys for an SRTP session. If the two endpoints trying to setup a call are not trying to use the same method for key exchange, or if one of them hasn't enabled encryption at all, the call will not connect. To meet our goal of maximizing connectivity, these mismatches must be avoided. The original method of key exchange for SRTP involves exchanging SDES keys through the signalling channel, which may be a SIP or XMPP connection. Most of the original products supporting this standard take an all-or-nothing approach: if encryption is disabled, they will only talk to other endpoints without encryption and if encryption is enabled, they will only talk to other endpoints capable of the same key exchange protocol. One disadvantage of sending the keys through the signalling channel is that the operator of the SIP proxy can easily observe the keys and use them to decrypt the RTP streams. Another risk is that the end-user has no way to know if a man-in-the-middle has swapped the keys, decrypting the streams, recording or modifying them and then sending them on to the other endpoint using a different key. Two alternative solutions to these problems have emerged. 15 Optimizing Connectivity Phil Zimmerman, the legendary creator of PGP encryption, created the ZRTP key exchange protocol. When the endpoints support ZRTP, they typically send signalling messages (SDP) specifying that regular, unencrypted RTP will be used for the call. When the call is answered, each endpoint tries to send some special ZRTP "hello" packets to the peer on the port normally used for the RTP. At this stage, the phones will indicate to the users that they are in a call without encryption. If the endpoints both support ZRTP then they recognize the "hello" packets from the peer and they perform a key exchange using the Diffie-Hellman algorithm. Once the key exchange is completed, the interface on the phone changes somehow to advise the user that the call is now encrypted. Due to the nature of the Diffie-Hellman algorithm and the verification of the algorithm by a short authentication string (SAS) that the users read to each other, the keys can not be observed or substituted by any man-in-the-middle. Nonetheless, the use of the SAS may appear slightly geeky and it is only valid if you know the other person personally and can recognize their voice when they are reading the SAS to you. If you are calling an organization, such as the call center at the bank or a Government department, the person you are speaking to is likely to be a complete stranger, you will not have be familiar with the sound of their voice when they read the SAS and so you will not be able to rely on this algorithm. The DTLS-SRTP standard provides another alternative, although on its own, it does not provide certainty that there is no man-in-the-middle. DTLS-SRTP provides a way to use DTLS key agreement before starting SRTP media streams. To provide security against a man-in-the-middle, DTLS-SRTP can be combined with another mechanism for the exchange of key fingerprints. For example, RFC 5763 specifies a mechanism for exchanging tamper-proof key fingerprints in SDP using SIP Identity (RFC 4474). DTLS-SRTP is the mechanism that has been chosen for the WebRTC standard and it is widely implemented in web browsers. It is also supported by the Asterisk and FreeSWITCH projects and some softphones including Jitsi. ZRTP is also supported in a number of products, including Asterisk, FreeSWITCH and the Jitsi softphone. ZRTP is not currently supported in WebRTC browsers although it is preferred by products that focus on the privacy of personal communication between people who know each other, such as the Lumicall app. Supporting multiple schemes For encryption to be effective, users must know when it is working. For this reason, many products started out with a simple all-or-nothing approach. If the encryption setting is enabled, the product will only permit calls to and from peers using them same encryption settings. Users could then conclude that any call that connects successfully is encrypted correctly. Furthermore, the way that an SDP offer/answer exchange is designed, a media descriptor either has crypto attributes or it doesn't. There is no simple way for an endpoint to insert the attributes in the SDP and hint that they are optional. If they are present, the peer must act as if they are mandatory and reject the call if it is not capable of using encryption. Some phones have an option to send two media descriptors in SDP, one of them with crypto attributes and the other without. However, some other phones don't understand this type of SDP and reject the call completely, so it is not a reliable strategy. Some phones have an option to try the call with encryption enabled and if it is rejected, automatically try again without encryption. This strategy is not glamorous but it has wider compatibility. Recommendations for maximizing connectivity Generally, SDES SRTP should be avoided and should not enabled except for very specific cases. Do not enable SDES SRTP for arbitrary calls across the Internet as a means to improve compatability: the risks outweigh the benefits. The cases where you may use SDES SRTP include situations where you have IP phones that don't support any other form of encryption and connections to SIP trunking 16 Optimizing Connectivity providers who don't support any other form of encryption. In these special cases, ensure that the SDES SRTP calls are only possible for the specific IP addresses or SIP accounts that you designate. Note that when you configure a connection profile in the PBX to use this encryption mode with certain peers, it may not be able to use the same connection profile for any other peers who don't use SDES SRTP. This is the all-or-nothing scenario. When making calls, do not try to use the approach that involves sending multiple media descriptors, one with crypto attributes and the other without. For all other calls, use software that tries to make the call using DTLS-SRTP and if that fails retries the call using ZRTP. If encryption is not essential for you, allow calls to proceed even when ZRTP does not secure a connection. When receiving calls, be willing to accept calls using either DTLS-SRTP or ZRTP and possibly without any encryption at all, depending upon your requirements. A SIP proxy can inspect the SDP to determine which type of encryption is attempted and route the call appropriately. For example, depending upon which attributes are present, the SIP proxy could route the call to an Asterisk sip.conf profile with DTLS-SRTP support or to another profile with ZRTP support. Alternatively, you may use a softphone that is capable of recognizing and accepting either type of encryption. Throughout this guide, we present further details about how to achieve all of the above with the products described herein. Recommendations for security The recommendations in the previous section will help optimize connectivity, by enabling more calls to connect successfully. Additional steps are required to ensure you fully benefit from the security that encryption can provide, these are described here. If you are enabling and relying on DTLS-SRTP with SIP, make sure you also use SIP Identity (RFC 4474) and use SIP Identity to authenticate the key fingerprints (RFC 5763). If you pass calls through intermediate network components such as Session Border Controllers or a PBX where the media streams are decrypted and re-encrypted, you need to think carefully about the impact on authentication. For example, you may configure the PBX to enforce identity verification and then tell users that all calls that have come through the PBX can be trusted. If using phones or softphones that are configured to work with or without encryption (this is referred to as opportunistic encryption), it is very desirable for them to give the user an indication about whether each call is encrypted. Otherwise, the user should be told to assume that calls are not encrypted. Use ICE and a TURN server A TURN server provides a standard way to relay media on behalf of users who are stuck on a NAT network. The Interactive Connectivity Establishment (ICE) protocol uses the TURN server to help explore network topology and give immediate feedback if the call is not possible, eliminating the menace of ghost calls. Several TURN servers are now available in convenient Linux packages, see Chapter 10, ICE/STUN/ TURN server installation for details about selecting and installing one. Use the TLS transport for SIP signalling When SIP messages are sent over UDP, there are several things that go wrong. The first problem is that large SIP messages can be fragmented by the IP stack and some fragments are not delivered. When ICE is used, the SIP message contains a larger SDP body to encapsulate the ICE candidates. When a softphone attempts a video call, the combination of the video and audio descriptors further enlarges the SDP. More and more frequently in modern RTC deployments, SIP messages sent over 17 Optimizing Connectivity UDP exceed the maximum transmission unit and are subject to fragmentation. IP packet fragments are not always routed correctly by other intermediate network components. This was not a problem in the early days of SIP when the vast majority of devices only supported a limited number of audio codecs and overall packet sizes were well under one kilobyte. A more obscure issue is the presence of routers in homes and small offices that claim to have SIP helper capabilities. These routers try to modify the SIP messages to help them through NAT. In reality, the modifications made by the router can clash with the ICE protocol or other NAT discovery techniques used by the phone or the server. Sending all the SIP messages over a TLS connection eliminates all of these problems. While there is slightly more effort involved to create a certificate for the server, it saves an enormous amount of ongoing support effort. See Chapter 9, TLS certificate creation for details about creating the TLS certificates for SIP and XMPP. Getting through firewalls When a user is in a developed country, at their home or using a mobile Internet connection, they may be behind a NAT router but the firewall on these devices is usually very permissive for connections initiated by the user. In the vast majority of cases, the user will be able to initiate outbound TCP connections to any destination (such as a SIP, XMPP or WebSocket server on any arbitrary port number) and will be able to send and receive UDP. For some NAT routers, the UDP flows will only work reliably when the peer is using a public IP address. This problem is automatically detected by ICE connectivity checks and it is resolved by sending the UDP packets through the TURN server. For users with more repressive Internet providers, in some less sophisticated wifi hotspots and in some corporate networks there are more aggressive firewall policies. With a little care, the RTC deployment can be designed to work reliably in many of these environments too. The first issue is the signalling connection, whether it is SIP, XMPP or WebSockets. More restricted corporate networks block outgoing TCP connections, except for those on port 80 or 443, which they redirect to a transparent proxy. As a consequence of this TCP blocking, it should be anticipated that the user's softphone may need to use the HTTP proxy for all RTC traffic, including media streaming and signalling. HTTP Proxy servers have a number of issues. Older proxy servers do not understand the WebSocket protocol and newer proxy servers are not always configured to allow the WebSocket protocol by default. To avoid these problems, it is recommended that the WebSocket connection should always use TLS (WebRTC clients uses a wss:// URL instead of a ws:// URL) and the port 443 only. Many HTTP proxy servers are correctly configured to allow the web browser to use the HTTP CONNECT method to initiate pass-through connections to https:// URLs using the default port, 443. Sometimes, however, the HTTP proxy does not allow any port other than 443. Thanks to the encryption provided by TLS, the proxy server can not observe whether the HTTP CONNECT method is being used to reach a web server, a SIP server, a WebSocket server or even something else such as an ssh server. Therefore, all services, including SIP over TLS, XMPP client connectivity (c2s), TURN over TLS and WebSockets, should listen on port 443 so that any of them can be reached by a user stuck behind a HTTP proxy. The next issue is the transmission of UDP. In some networks, users simply can not exchange any UDP packets with external hosts. The only resolution to this issue is to tunnel the UDP packets through TCP. Fortunately, the TURN server can also assist, as the TURN specification includes support for tunneling packets through a TLS connection. To maximize the chance of success, it is recommended that the TURN server is also configured to listen on port 443 so that the connection to the TURN server will be able to pass through HTTP proxy servers using the HTTP CONNECT method. 18 Optimizing Connectivity This strategy often requires several different processes (the standard SIP server, the XMPP c2s service, the webserver hosting a WebRTC phone, the WebSocket server and the TURN server) to all listen on the same port, 443. For multiple processes to use the same port, it is necessary to either have a different public IP address for each process or to use a solution for port multiplexing, such as the sslh daemon. With these strategies, connectivity will be possible for the vast majority of Internet users, whether at home, at the office or on the road. 19 Chapter 5. DNS setup The DNS records to be created are detailed in Table 5.1, “DNS records for the example” Table 5.1. DNS records for the example Record Name Type Value server1 A 198.51.100.19 server1 AAAA 2001:DB8:1000:2000::19 turn-server A 198.51.100.19 turn-server AAAA 2001:DB8:1000:2000::19 sip-proxy A 198.51.100.19 sip-proxy AAAA 2001:DB8:1000:2000::19 xmpp-gw A 198.51.100.19 xmpp-gw AAAA 2001:DB8:1000:2000::19 _stun._udp SRV 0 1 3478 turn-server.example.org. _turn._udp SRV 0 1 3478 turn-server.example.org. _sips._tcp SRV 0 1 5061 sip-proxy.example.org. _xmpp-client._tcp SRV 5 0 5222 xmpp-gw.example.org. _xmpp-server._tcp SRV 5 0 5269 xmpp-gw.example.org. @ NAPTR 10 0 "s" "SIPS+D2T" _sips._tcp.example.org. "" @ NAPTR 10 0 "s" RELAY:turn.udp _turn._udp.example.org. "" Using non-standard ports RTC makes use of DNS SRV records for load-balancing and failover. A key feature of the SRV record is that the TCP or UDP port number is specified in the record. Table 5.1, “DNS records for the example” demonstrates the use of standard port numbers for SIP, TURN and XMPP. If users are connecting to the service from arbitrary locations, including public wi-fi hotspots, hotels and the offices of other companies, they will almost certainly encounter firewalls that only allow traffic to pass on a limited range of port numbers or through HTTP proxy servers. For this reason, it is common to operate RTC services on port 443 instead of the normal port numbers. Two or more processes can't listen on the same port number on the same IP address. When all the RTC processes have to use port 443, it is necessary to have a different IP address for each process. Table 5.2, “Protocols using port 443” gives a summary of the ports to change. Table 5.2. Protocols using port 443 Protocol Default port Non-standard port STUN / TURN over TLS 5349 443 SIP over TLS 5061 443 XMPP client 5222 443 20 DNS setup Sample DNS zone file See Example 5.1, “ISC Bind zone file entries” for an example of how to write the entries for the zone file. For the purposes of the example, this file would be /etc/bind/db.example.org on the nameserver host. Example 5.1. ISC Bind zone file entries ; the server where everything will run server1 IN A 198.51.100.19 server1 IN AAAA 2001:DB8:1000:2000::19 ; Use different names for each service. ; Don't use CNAMEs, the SRV records (further down) ; can't point to CNAME records. turn-server IN A 198.51.100.19 turn-server IN AAAA 2001:DB8:1000:2000::19 sip-proxy IN A 198.51.100.19 sip-proxy IN AAAA 2001:DB8:1000:2000::19 xmpp-gw IN A 198.51.100.19 xmpp-gw IN AAAA 2001:DB8:1000:2000::19 ; DNS SRV for STUN / TURN _stun._udp IN SRV 0 1 3478 turn-server.example.org. _turn._udp IN SRV 0 1 3478 turn-server.example.org. ; DNS SRV and NAPTR records for SIP _sips._tcp IN SRV 0 1 5061 sip-proxy.example.org. @ IN NAPTR 10 0 "s" "SIPS+D2T" "" _sips._tcp.example.org. @ IN NAPTR 10 0 "s" RELAY:turn.udp "" _turn._udp.example.org. ; DNS SRV records for XMPP Server and Client modes: _xmpp-client._tcp IN SRV 5 0 5222 xmpp-gw.example.org. _xmpp-server._tcp IN SRV 5 0 5269 xmpp-gw.example.org. Testing the DNS settings Use the dig command to test, as demonstrated in Example 5.2, “Inspecting DNS entries with dig” Example 5.2. Inspecting DNS entries with dig $ dig -t naptr +short example.org 10 0 "s" "SIPS+D2T" "" _sips._tcp.example.org. $ dig -t srv +short _sips._tcp.example.org. 0 1 5061 sip-proxy.example.org. 21 Chapter 6. Firewall rules Overview of firewall ports Table 6.1, “Firewall rules summary” and Table 6.2, “Firewall rules summary (IPv6)” list each firewall rule that is required for the test addresses described in the section called “Example network used in the documentation”. Table 6.1. Firewall rules summary Purpose IP Source Source Protocol Addr Port Dest Addr Dest Port RTP media (both SIP UDP and XMPP, audio and video) Any Any 198.51.100.19 TURN control session UDP Any Any 198.51.100.19, 198.51.100.20 3478 NAT UDP (RFC Any Any 198.51.100.19, 198.51.100.20 3479 TCP Any Any 198.51.100.19 5061 SIP over WebSocket TCP (TLS) Any Any 198.51.100.19 443 XMPP signalling Server TCP Any Any 198.51.100.19 5222 XMPP signalling Client TCP Any Any 198.51.100.19 5269 STUN discovery 3489) SIP signalling 49152 to 65535 Table 6.2. Firewall rules summary (IPv6) Purpose IP Source Source Protocol Addr Port Dest Addr Dest Port RTP media (both SIP UDP and XMPP, audio and video) Any Any 2001:DB8:1000:2000::19 49152 to 65535 TURN control session UDP Any Any 2001:DB8:1000:2000::19 3478 TCP Any Any 2001:DB8:1000:2000::19 5061 SIP over WebSocket TCP (TLS) Any Any 2001:DB8:1000:2000::19 443 XMPP signalling Server TCP Any Any 2001:DB8:1000:2000::19 5222 XMPP signalling Client TCP Any Any 2001:DB8:1000:2000::19 5269 SIP signalling NAT considerations Many networks use NAT to minimize cost, conserve public IP addresses and to avoid direct routing from the public Internet. RTC applications can work in a NAT environment, however, there are some points to be aware of. 22 Firewall rules One common technique used for web servers involves hosting the public IP address on the firewall and creating a port forwarding rule redirecting all incoming connections to the internal IP address of a web server. This approach works for some types of services, such as HTTP, but it does not work for all types of RTC traffic. In particular, it is essential that the TURN server process runs on a host with two public IP addresses. A SIP server may work with port forwarding, but care needs to be taken to ensure the record-route URI matches the external IP address. Using SIP over TLS and SIP over WebSockets with port forwarding is more likely to work than trying to port-forward SIP over UDP traffic. The TURN server does not need to have an IP address on the private network but it does need to be routable from the private network. The TURN server could be hosted in a DMZ or even using an external hosting provider. If you choose to operate a SIP Session Border Controller (SBC), it will probably need to have both a public IP address and a private IP address. Setup with iptables on Linux Example 6.1, “Firewall setup with iptables” provides a basic example for Linux firewalls using iptables. If using a firewall framework like Shorewall then please consult the relevant documentation to open the same ports. Example 6.1. Firewall setup with iptables iptables -I INPUT -p udp -d iptables -I INPUT -p udp -d iptables -I INPUT -p udp -d --dport 49152:65535 198.51.100.19 --dport 3478 -j ACCEPT 198.51.100.20 --dport 3478 -j ACCEPT 198.51.100.19 \ -j ACCEPT iptables -A INPUT -p tcp -d 198.51.100.19 --dport 5061 -j ACCEPT iptables -A INPUT -p tcp -d 198.51.100.19 --dport 5222 -j ACCEPT iptables -A INPUT -p tcp -d 198.51.100.19 --dport 5269 -j ACCEPT ip6tables -I INPUT -p udp -d 2001:DB8:1000:2000::19 \ --dport 3478 -j ACCEPT ip6tables -I INPUT -p udp -d 2001:DB8:1000:2000::19 \ --dport 49152:65535 -j ACCEPT ip6tables -A INPUT -p tcp -d 2001:DB8:1000:2000::19 \ --dport 5061 -j ACCEPT ip6tables -A INPUT -p tcp -d 2001:DB8:1000:2000::19 \ --dport 5222 -j ACCEPT ip6tables -A INPUT -p tcp -d 2001:DB8:1000:2000::19 \ --dport 5269 -j ACCEPT It is highly recommended that the firewall rules for RTP packets are placed at the beginning of the chain, as these packets are time sensitive and over 99% of the RTC traffic is carried in the RTP packets. Putting them lower in the chain will mean that the CPU does more work evaluating each packet before it finds the matching rule. That would lead to wasted CPU cycles and potential latency or congestion issues for all real-time applications on the server. When you deploy additional RTC applications (such as Asterisk or FreeSWITCH) behind the firewall, you may want to allow RTP traffic to travel directly to those servers too while only allowing the SIP traffic to go through the SIP proxy. 23 Chapter 7. User and credential storage Most of the products described in this document, including SIP proxy servers, XMPP servers, TURN servers and soft PBXes offer a range of choices for maintaining a user database and storing user credentials. Credentials Personal account names or extension numbers An issue that arises early in many discussions about this topic is whether to use email addresses of the form username@example.org or to use extension numbers as the account identifiers. In most cases, users still need to be able to be contactable using either type of address, but the question remains: should their phone login to the system using a named username or using an extension number? Extension numbers are the standard in many traditional phone systems and some people have simply tried to replicate this model when moving to IP-based RTC. There are three big reasons why numbers are popular: numbers can be dialed from anywhere else in the PSTN, numbers are easier to dial for people who are not calling from a computer (phones only have 12 buttons) and there is not always a one-to-one mapping between people and phones. One additional feature of numbers is that they are slightly less personal, somebody does not know exactly who will answer when they call a landline in a house shared by a large family and when somebody leaves a job, their phone number can be assigned to their successor. Mobile telephones and smartphones in particular have dramatically reduced the significance of these factors that encouraged the continued use of numbers. For example, the inconvenience of manually dialing a SIP or XMPP address is not such a big factor because people are more likely to have these details in their address books. Phone numbers also have disadvantages. One of these is the dependency on phone companies, the ITU and government bureaucracies who administer the numbering system. Users can be forced to change their phone number when changing provider. Dialing codes change, making it necessary to update old records in an address book. Each group of numbers is tightly bound to the infrastructure of a specific the telephone exchange, leading to inflexibility when relocating or when a local service outage occurs. Recommendation Use alphabetic usernames rather than extension numbers internally. SIP, XMPP and email each support a slightly different set of characters in usernames so only use the set of characters supported for all protocols. Wherever a device is being used with named accounts, such as a desktop PC where users login and have access to their own company email account, or a smartphone that is only used by one person and has been configured to access a named email account, provision the same personalized SIP/XMPP address on that device. Where a device is shared, such as a conference room phone, create a named account for that purpose. It is generally helpful if the same username is used for login, email address, SIP and XMPP addresses. If the login names are not the same as email addresses, use the email addresses as the SIP and XMPP addresses. To give users the convenience of dialing extension numbers from regular phones, create mappings from the extension numbers to the usernames. 24 User and credential storage This strategy offers significantly more potential for the future as more and more services will rely on usernames and fewer services will place emphasis on phone numbers. When using this strategy, it is necessary to implement mappings from phone numbers to usernames as part of the ingress processing and for calls that go out to the PSTN over SIP or ISDN trunks, it is necessary to implement the reverse mapping, ensuring that the caller ID of each outgoing call is personalized based on the internal username. Password encryption It is not strictly necessary to use passwords for SIP, XMPP and TURN, you can use certificate authentication instead. Nonetheless, many people find that some of their users can only support password authentication or they don't want the complexity of managing public key infrastructure (PKI). XMPP transmits passwords in cleartext, so all XMPP connections should be secured with TLS to avoid eavesdropping. The benefit of this approach is that XMPP users can be authenticated against any type of pre-hashed passwords or using a method such as LDAP bind to verify the supplied credential. SIP and TURN use a DIGEST algorithm very similar to HTTP DIGEST. The DIGEST algorithm requires the server to have either an unencrypted copy of the password, a password encrypted with the HA1 algorithm or a service (such as RADIUS) that can perform delegated DIGEST authentication. If unencrypted passwords are available, then the SIP and TURN servers can use them to construct the HA1 hash value or you can precompute the HA1 values and store them in a database. Warning HA1 hash values should be considered as sensitive as unencrypted passwords. Even though the plaintext password can't be recovered in a simple manner, anybody in possession of the HA1 value is able to use it to construct a response to a HTTP or SIP DIGEST challenge, thereby impersonating the user who owns that password. Therefore, do not keep HA1 hash values in world-readable configuration files or publicly accessible in LDAP. HA1 in detail The HA1 hash includes the username, the password and the realm. A HA1 hash can be easily constructed at the UNIX command line as demonstrated in Example 7.1, “Computing HA1”. Example 7.1. Computing HA1 $ echo -n "alice:example.org:secret" | md5sum 543e1aec5d3614f03141652d6ada51b2 $ echo -n "alice@example.org:example.org:secret" | md5sum 1441a999b257bcd0cf5166930039876a In both examples, the realm is example.org. In the first case, the user authenticates using the username alice. In the second case, the user authenticates using the username alice@example.org. This second permutation is referred to by some products as HA1B. Some people prefer to use the full user@domain syntax to support virtual hosting with a single realm value on a single SIP proxy or TURN server. Databases RADIUS IETF draft-sterman-aaa-sip-04 describes a mechanism for RADIUS servers to participate in a SIP DIGEST challenge/response without the SIP proxy having a copy of the password or HA1 25 User and credential storage value at all. This is implemented by the FreeRADIUS project in the module rlm_digest [http:// wiki.freeradius.org/modules/Rlm_digest] and supported by all the major SIP proxy servers. At the time of writing, work is in progress to enable RADIUS to participate in TURN authentication in the same way. LDAP If LDAP is in use, you may wish to consider storing the HA1 values in the LDAP directory. Each time a user is created or a user changes their password, the LDAP server will need to update the HA1 hash as well as updating any other copies of the password hashed with other algorithms. For example, the OpenLDAP server allows such logic to be implemented in an overlay, this is already demonstrated in the smbk5pwd module for hashing copies of the user's password in various algorithms used by Windows. Due to the sensitive nature of the HA1 values, they should be stored in an attribute that is not readable to any other user or anonymous access. Example 7.2, “OpenLDAP ACL for protecting ha1Password” demonstrates how to protect the ha1Password so it can only be read by a user cn=sip-proxy,dc=example,dc=org. Example 7.2. OpenLDAP ACL for protecting ha1Password access by by by by to attr=ha1Password self =xw dn="cn=sip-proxy,dc=example,dc=org" read anonymous auth * none LDAP can also be used to assist in routing as described in Chapter 15, Adding ENUM to DNS. SQL databases Many RTC products have some capability to interact with an SQL database to obtain user credentials, configuration settings and routing information. Example 7.3, “SQL table for repro users” demonstrates a typical schema. Example 7.3. SQL table for repro users CREATE TABLE users ( id SERIAL PRIMARY KEY, username VARCHAR(64) NOT NULL, domain VARCHAR(253), realm VARCHAR(253), passwordHash VARCHAR(32), passwordHashAlt VARCHAR(32), name VARCHAR(256), email VARCHAR(256), forwardAddress VARCHAR(256) ); Each product has a different schema, however, it is possible to create a user list table that aggregates all the columns required to satisfy multiple processes and then create SQL views to present the data with the column names required by the individual applications. For example, a single user list table can be created for use by Asterisk (the sippeers table) and used by repro (using a view instead of a real users table) as demonstrated in Example 7.4, “SQL view presenting Asterisk users to repro”. repro simply doesn't require many of the columns used by Asterisk. Notice that Asterisk's sippeers table doesn't contain a domain or realm column for each user, these are stored elsewhere in the sip.conf file, so for repro, they are specified as constant values in the SELECT query. 26 User and credential storage Example 7.4. SQL view presenting Asterisk users to repro CREATE VIEW users AS SELECT id, name AS username, 'my_domain' AS domain, 'my_realm' AS realm, md5secret AS passwordHash, NULL As passwordHashAlt, NULL AS name, NULL AS email, NULL AS forwardAddress FROM sippeers; Setting up PostgreSQL for SIP users The packages for the repro SIP proxy include SQL schema files for creating tables. Example 7.5, “Install PostgreSQL on Debian or Ubuntu” demonstrates how to install the PostgreSQL server package. Example 7.6, “Configure PostgreSQL and load schema” demonstrates how to use the createdb command to create a database called repro and use the psql command to log in as the DBA and create a user called repro for the SIP proxy. The final psql command uses the schema file to create the tables. Example 7.5. Install PostgreSQL on Debian or Ubuntu $ sudo apt-get install postgresql postgresql-client Example 7.6. Configure PostgreSQL and load schema $ sudo su - postgres postgres$ createdb repro postgres$ psql postgres=# create user repro password 'abc'; postgres=# \q postgres$ exit $ su vi /etc/postgresql/9.4/main/pg_hba.conf $ su systemctl restart postgresql $ psql -U repro -W repro < /usr/share/doc/repro/create_postgresql_reprodb.sql Product-specific file formats Each product also supports some native file formats. For example, repro can store user data in Berkeley DB files while Asterisk can store users in the sip.conf text file. The Prosody XMPP server can store its data in JSON files. In some cases, the files are maintained by the administrator using a text editor and in other cases they are updated at runtime by the application. To eliminate the risk of runtime dependencies on databases, it is relatively straightforward to create a script that periodically extracts user data from a database and creates files for the relevant processes to consume. If one of the processes has to start up or continue operating during a database outage, it will be able to do so using the last copy of the file. Conclusion A guide like this can't proscribe the correct solution for every scenario. This chapter simply aims to raise awareness of all the options for storing usernames and credentials and making them accessible 27 User and credential storage to RTC processes. System administrators and developers will need to consider the infrastructure that is already present when deciding which of these options are most relevant for a given site. 28 Chapter 8. Server setup The packages are available in a convenient format in popular Linux operating systems including Debian [http://www.debian.org/distrib/], Ubuntu [http://www.ubuntu.com] and Fedora [http:// fedoraproject.org/get-fedora-all]. the section called “Choice of operating system” discusses the choice of operating system. If using Debian 8 (jessie) you must use the reSIProcate 1.10.x packages from jessie-backports [http:// backports.debian.org/Instructions/]. Users of Red Hat Enterprise Linux (RHEL) and CentOS can easily build the reSIProcate package using rpmbuild. All required dependencies are available in the operating system or the EPEL collection. It is strongly recommended that you either use 1.9.7-4 or later. Previous versions available in older distributions do not have the most recent fixes for OpenSSL SSLv23_method issues. For any new installations, it is recommended to start with version 1.10.0 or later as it offers several more improvements in features and interoperability. Install the operating system using the normal process, set up an IP address on the machine and make sure network connectivity is working. If you are not familiar with server installation, a useful resource is the Debian Administrator's Handbook [http://debian-handbook.info]. Debian/Ubuntu servers To set up both of the IP addresses on the same box (as required by the ICE/STUN/TURN protocol), modify the /etc/network/interfaces file as demonstrated in Example 8.1, “Adding IP addresses in /etc/network/interfaces”. Example 8.1. Adding IP addresses in /etc/network/interfaces allow-hotplug eth0 iface eth0 inet static address 198.51.100.19 netmask 255.255.255.0 network 198.51.100.0 broadcast 198.51.100.255 gateway 198.51.100.1 up ip addr add dev eth0 198.51.100.20/24 scope global iface eth0 inet6 static address 2001:DB8:1000:2000::19 netmask 64 gateway 2001:DB8:1000:2000::1 dns-nameservers 2001:DB8:1000:2000::5 dns-search example.org Notice the line using the ip addr add command to add the additional IP address. Fedora, RHEL and CentOS servers To set up both of the IP addresses on the same box (as required by the ICE/STUN/TURN protocol), see the documentation about alias and clone files [http://docs.fedoraproject.org/en-US/Fedora/17/html/ System_Administrators_Guide/s2-networkscripts-interfaces-alias.html] for network interfaces 29 Chapter 9. TLS certificate creation Certificates are an essential security mechanism for most federated and distributed technologies on the Internet. Certificates may be referred to as X.509 certificates, SSL certificates or TLS certificates. For most purposes, these terms all refer to the same thing and the term TLS certificate is used throughout this documentation. The prices of TLS certificates vary significantly. It is not necessarily useful to purchase the most expensive one. The free TLS certificates from the Let's Encrypt Project [https://letsencrypt.org/], which is supported by the EFF and Linux Foundation, are a good choice for the vast majority of RTC projects, including WebRTC. Let's Encrypt is not just a new Certificate Authority, they also promote the use of an automated tool for the acquisition and renewal of certificates. This dramatically reduces the amount of manual effort involved in using certificates, especially for people who host multiple sites and domains. That said, the initial version of the Let's Encrypt tool has been designed for use with web servers and some manual tweaking is required to use it with SIP, XMPP, WebSocket and TURN servers. Early versions of the tool also failed to operate correctly on some servers with IPv6 addresses and some Apache configurations, although most of these issues were resolved by mid-2016. You do need to make sure that the certificate issued by the Certificate Authority (CA) includes both the TLS client and TLS server Extended Key Usage (EKU) extensions, some only include the latter. The free certificates from StartSSL/StartCom do not have the TLS client extension and can't be used. The Gandi.net SSL Standard certificate [https://www.gandi.net/ssl/standard#single] which costs about $16 (free with a domain registration or transfer) is known to be suitable. If you are using some older IP desk phones, the phones may not have support for the Let's Encrypt root certificate in their firmware. If this is the case, you may need to update the firmware, obtain a newer model phone or use certificates from a more established Certificate Authority. For example, some older Polycom phones do not work with Let's Encrypt but they work fine with the low cost Gandi.net certificates. Certificate Common Name Certificates confirm the identity of a service. The identity is specified by the Common Name (CN) and in some cases the subjectAltName embedded in the certificate. Some vendors refer to subjectAltName certificates as SAN certificates. This acronym is more commonly used for Storage Area Network and can cause confusion. Early versions of the federated XMPP specification proposed a custom OID, xmppAddr, rather than using subjectAltName. This practice was not widely supported by certificate authorities. Furthermore, it meant that such certificates could not be used for purposes other than XMPP, such as SMTP email or SIP. The XMPP specification has since been relaxed and it is now possible to use a single certificate on a server for SIP, XMPP, SMTP and other purposes. Many web sites use a name such as www.example.org and include the www prefix in the CN in their certificate. When purchasing a certificate for SIP and XMPP, it is important to ensure that the certificate contains a CN or subjectAltName that specifies the domain alone. For the example.org domain, the certificate should include CN=example.org or subjectAltName=example.org and not something like CN=www.example.org. In a wildcard certificate, the CN will include an asterisk (*), for example, CN=*.example.org. This type of certificate can be used for the domain example.org and subdomains or hostnames such as www.example.org or mail.example.org. 30 TLS certificate creation Some organizations have wildcard certificates for all servers/subdomains in the organization. These are not always suitable for RTC purposes, in particular, RFC 5922 section 7.2 [https://tools.ietf.org/ html/rfc5922#section-7.2] prohibits the use of wildcard certificates for SIP. Some SIP products offer the ability to override this restriction and use wildcard certificates anyway, however, this is not suitable for the public Internet as you can't be sure that other servers will have the same override enabled. The correct domain needs to be specified when creating the certificate signing request (CSR) and should be confirmed by the CA in their web-based ordering form. If using the Let's Encrypt utility to obtain certificates, this part of the process is automated. Install the OpenSSL utility Make sure the OpenSSL package is available, it can be installed using the package manager as demonstrated in Example 9.1, “Installing openssl on Debian/Ubuntu” and Example 9.2, “Installing openssl on Fedora/RHEL/CentOS”. Example 9.1. Installing openssl on Debian/Ubuntu $ sudo apt-get install ssl-cert openssl Example 9.2. Installing openssl on Fedora/RHEL/CentOS $ sudo yum install openssl Install the Let's Encrypt certbot utility If you have decided to use Let's Encrypt certificates, it is necessary to install the certbot utility or an equivalent utility implementing the Automated Certificate Management Environment (ACME) [https://en.wikipedia.org/wiki/Automated_Certificate_Management_Environment]. Install certbot using the package manager as demonstrated in Example 9.3, “Installing certbot on Debian/Ubuntu” and Example 9.4, “Installing certbot on Fedora/RHEL/CentOS”. Example 9.3. Installing certbot on Debian/Ubuntu $ sudo apt-get install -t jessie-backports ssl-cert certbot Example 9.4. Installing certbot on Fedora/RHEL/CentOS $ sudo yum install certbot Install a TLS certificate using Let's Encrypt (certbot) If using a web server for exactly the same domain name as your RTC service, it is possible to use the certbot command for your web server to setup the certificate the first time. If there is no HTTPS web server for the domain, it is possible to use the certbot certonly subcommand to request a certificate. As the certbot utility is still quite new and evolving, it is recommend that you consult the certbot web site [https://certbot.eff.org/] for the most up-to-date detailed instructions. After running certbot, the certificate files will be present at locations such as /etc/ letsencrypt/live/example.org/fullchain.pem and the private key files will be present at locations such as /etc/letsencrypt/live/example.org/privkey.pem 31 TLS certificate creation Install a TLS certificate manually If you have decided not to use Let's Encrypt and certbot, use these instructions to create your certificate(s) manually. Otherwise, this section can be skipped. On each Linux platform, there are different locations for private key files and local server certificates. To simplify the examples, we define environment variables referring to them. See Example 9.5, “PKI directories (Debian/Ubuntu)” and Example 9.6, “PKI directories (Fedora/RHEL/CentOS)”. On the server, create an RSA key pair and a certificate signing request (CSR) as demonstrated in Example 9.7, “Creating RSA key pair and CSR”. Example 9.5. PKI directories (Debian/Ubuntu) $ $ $ $ PKI_HOME=/etc/ssl PRIVATE_KEY_DIR=${PKI_HOME}/private CERT_DIR=${PKI_HOME}/public CSR_DIR=${PKI_HOME}/csr Example 9.6. PKI directories (Fedora/RHEL/CentOS) $ $ $ $ PKI_HOME=/etc/pki/tls PRIVATE_KEY_DIR=${PKI_HOME}/private CERT_DIR=${PKI_HOME}/certs CSR_DIR=${PKI_HOME}/csr Example 9.7. Creating RSA key pair and CSR $ $ $ $ $ $ $ $ $ MY_DOMAIN=example.org sudo mkdir -p $PRIVATE_KEY_DIR PRIVATE_KEY_PEM=${PRIVATE_KEY_DIR}/${MY_DOMAIN}-key.pem CSR_PEM=${CSR_DIR}/${MY_DOMAIN}-csr.pem sudo openssl genrsa -out ${PRIVATE_KEY_PEM} 2048 sudo chmod 0640 ${PRIVATE_KEY_PEM} sudo chgrp ssl-cert ${PRIVATE_KEY_PEM} sudo mkdir -p ${CSR_DIR} ${CERT_DIR} sudo openssl req -new \ -key ${PRIVATE_KEY_PEM} \ -out ${CSR_PEM} \ -subj "/CN=${MY_DOMAIN}" $ sudo cat ${CSR_PEM} Your CA will ask you to copy the CSR text and paste it into a form on their web site. The CA will now issue a certificate; it may be displayed in the browser or sent to you by email. Copy and paste it into the server after the cat command in Example 9.8, “Installing the certificate”, pressing CTRLD or typing EOF to finish. If the CA provides an intermediate certificate, you must also append it to the certificate file. The certificate file should contain the certificate for your domain, following by each intermediate certificate in order up to but not including the root. Example 9.8. Installing the certificate $ sudo cat > /etc/ssl/public/${MY_DOMAIN}.pem << EOF -----BEGIN CERTIFICATE----MIIHWTCCBUGgAwIBAgIDCkGKMA0GCSqGSIb3DQEBCwUAMHkxEDAOBgNVBAoTB1Jv b3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEiMCAGA1UEAxMZ Q0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSc3VwcG9y 32 TLS certificate creation . . . d+pLncdBu8fA46A/5H2kjXPmEkvfoXNzczqA6NXLji/L6hOn1kGLrPo8idck9U60 4GGSt/M3mMS+lqO3ig== -----END CERTIFICATE----EOF The certificate is now ready for use by both the SIP and XMPP servers. It can also be used to secure a web server, SMTP server or any other application. 33 Chapter 10. ICE/STUN/TURN server installation Choosing a TURN server There are several TURN servers you can choose from. Any TURN server works for SIP, TURN, WebRTC and other protocols. reTurnServer is the TURN server from the reSIProcate project. It is easy to set up using the packages, instructions are below. CoTurn evolved from the rfc5766-turn-server project. See the CoTurn web site for instructions [https://code.google.com/p/coturn/] and then come back to this document to continue setting up your RTC environment. TurnServer.org comes from the Jitsi [http://jitsi.org] team. See the TurnServer.org web site for instructions [http://www.turnserver.org] and then come back to this document to continue setting up your RTC environment. restund is another option. See the restund web site [http://www.creytiv.com/restund.html] for details. There are various factors to consider when choosing a TURN server. Scalability: if you need to support thousands of users or more, you will want to test each of the servers for performance and evaluate the clustering capabilities. Authentication: where do you store your user credentials? TURN servers use the same HA1 hashed passwords that HTTP DIGEST and SIP authentication uses so if you have such passwords in a database or LDAP server already you will want to evaluate which TURN servers can use that database or look at options for exporting the credentials into a file format for the TURN server. Packaging: is the TURN server supported in a package on common Linux distributions? Most of those on the list above can be installed using official packages on Debian, Ubuntu and Fedora. Many people prefer to use packages so they don't have to spend time building from source code. IPv6: do you need IPv6 support? reTurnServer from reSIProcate Installation Install the package using the appropriate tool, as demonstrated in Example 10.1, “Installing reTurnServer on Debian/Ubuntu” and Example 10.2, “Install reTurnServer on Fedora/ RHEL/CentOS”. If the package is not available for your platform, you may be able to build it using the instructions in Appendix B, Building reSIProcate RPMs on RHEL and CentOS. Example 10.1. Installing reTurnServer on Debian/Ubuntu $ sudo apt-get install resiprocate-turn-server Example 10.2. Install reTurnServer on Fedora/RHEL/CentOS $ sudo yum install resiprocate-turn-server 34 ICE/STUN/TURN server installation Configuration Edit the configuration file, /etc/reTurn/reTurnServer.config, there are certain values that must be changed from the default values. These are demonstrated in Example 10.3, “reTurnServer.config entries”. Example 10.3. reTurnServer.config entries # your IP addresses go here: TurnAddress = 198.51.100.19 TurnV6Address = 2001:DB8:1000:2000::19 AltStunAddress = 198.51.100.20 AltStunPort = 3479 # your domain goes here, it must match the value used # to hash your passwords if they are already hashed # using the HA1 algorithm: AuthenticationRealm = example.org UserDatabaseFile = /etc/reTurn/users.txt UserDatabaseHashedPasswords = true The host server1 in this example MUST have two IP addresses, in the example, 198.51.100.19 and 198.51.100.20. This is essential for the ICE/STUN/TURN protocols. Now (re)start the reTurnServer daemon to use the new settings as demonstrated in Example 10.4, “Restarting the reTurnServer daemon (systemd)” Example 10.4. Restarting the reTurnServer daemon (systemd) $ sudo systemctl restart resiprocate-turn-server Restarting TURN relay: reTurnServer. $ The TURN server should now be running and listening for client connections. You can verify it is running as demonstrated in Example 10.5, “Using netstat to verify reTurnServer is running”. Example 10.5. Using netstat to verify reTurnServer is running $ sudo netstat -nlp | grep reTurnServer udp 0 0 198.51.100.19:3478 0.0.0.0:* udp 0 0 198.51.100.20:3478 0.0.0.0:* ... 2460/reTurnServer 2460/reTurnServer Check the system log for messages or run it in foreground mode on the console if it fails to start. Provisioning users The reTurnServer daemon expects to load a list of users and password hashes from a text file specified by the UserDatabaseFile parameter in reTurnServer.config. Note that the order of the columns in this file is not the same as that used by repro and the htdigest utility. The file can be generated by using a script to read values from a database table or LDAP directory. The reTurnServer caches the file in memory when it starts. If the file is modified or regenerated while reTurnServer is running, send it the HUP signal to reload the file without restarting. 35 ICE/STUN/TURN server installation Synchronizing users from a PostgreSQL table When the users are stored in a PostgreSQL table, such as the users table used by the repro daemon, the psql-user-extract script from reSIProcate can be used to maintain the users.txt file for reTurnServer. The script is contained in a separate package or it can be downloaded directly from the source repository. psql-user-extract can be invoked from cron, see Example 10.6, “crontab entry for psqluser-extract”. Example 10.6. crontab entry for psql-user-extract * * * * * /usr/lib/resiprocate/reTurnServer/psql-user-extract psql-user-extract requires a configuration file specifying the database connection parameters, see Example 10.7, “Sample /etc/reTurn/psql-user-extract.config”. Example 10.7. Sample /etc/reTurn/psql-user-extract.config psql_conninfo = "dbname=repro user=repro host=localhost password=foobar" # create this directory if it doesn't exist dest_file = "/var/cache/reTurn/users.txt" auth_user_alt = True Testing the TURN server As the TURN server speaks the STUN protocol, a simple way to test it is with a STUN client. Example 10.8. Installing the stun client utility $ sudo apt-get install stun Example 10.9. Using the stun client utility $ stun turn-server.example.org STUN client version 0.96 Primary: Firewall Return value is 0x00000b 36 Chapter 11. SIP proxy server installation Choose your SIP proxy Table 11.1. Comparison of SIP proxy servers Feature repro Kamailio Packages Available in Debian, Ubuntu and Fedora Other Either SIP proxy can be installed from source code on any platform Ease of installation Single config file, federated mode is Flexible config file format, enabled by simple config settings which is more like a scripting language and suitable for advanced customization. If a sample config from the Kamailio teams meets your needs, then it is very easy to install. Module/plugin support Extensions can be developed in C+ Modular plugin architecture with + or Python many plugins available Database/user storage Both support a common SQL table structure, so you can start with one and switch to the other, using either PostgreSQL or MySQL server. Management UI HTML web interface enabled by Optional HTML UI available default Recommendation: If you are not sure, or can't find a suitable Kamailio configuration file for your needs, start with repro and you can change to Kamailio later if you find a reason to do so. repro SIP proxy Package installation Install the package using the appropriate tool, as demonstrated in Example 11.1, “Installing repro on Debian/Ubuntu” and Example 11.2, “Install repro on Fedora/RHEL/CentOS”. If the package is not available for your platform, you may be able to build it using the instruction in Appendix B, Building reSIProcate RPMs on RHEL and CentOS. Example 11.1. Installing repro on Debian/Ubuntu $ sudo apt-get install repro $ sudo addgroup repro ssl-cert Example 11.2. Install repro on Fedora/RHEL/CentOS $ sudo yum install resiprocate-repro $ sudo addgroup repro ssl-cert Configuration The configuration file is /etc/repro/repro.config. Make essential changes to the configuration file, all other values can remain with default settings. Example 11.3, “Sample values for repro.config” demonstrates the main things you need to add or change from default values. 37 SIP proxy server installation An important thing to note about the example is that we explicitly configure each transport. The Transport1... settings declare a TLS transport binding on a specific IP address and port. When one or more transports are defined in this way, the settings for global transport configuration, such as IPAddress and UDPPort, are completely ignored. For SIP to work reliably, binding to specific IP addresses is highly recommended. This ensures that outgoing TCP or TLS connections always use the correct source address and that the intended addresses are always included in Via headers. The exact location of the *.pem files can be changed if necessary. Example 11.3. Sample values for repro.config # To trust email certificates as SIP client certificates: TLSUseEmailAsSIP = true # Transport1 will be for SIP over TLS connections # We use port 5061 here but if you have clients connecting from # locations with firewalls you could change this to listen on port 443 Transport1Interface = 198.51.100.19:5061 Transport1Type = TLS Transport1TlsDomain = example.org Transport1TlsClientVerification = Optional Transport1RecordRouteUri = sip:example.org;transport=TLS # Configuration for manually maintained TLS certificates: Transport1TlsPrivateKey = /etc/ssl/private/example.org-key.pem Transport1TlsCertificate = /etc/ssl/public/example.org.pem # Configuration for certificates obtained using Let's Encrypt / certbot: #Transport1TlsPrivateKey = /etc/letsencrypt/live/example.org/privkey.pem #Transport1TlsCertificate = /etc/letsencrypt/live/example.org/fullchain.pem # Transport2 is the IPv6 version of Transport1 Transport2Interface = 2001:DB8:1000:2000::19:5061 Transport2Type = TLS Transport2TlsDomain = example.org Transport2TlsClientVerification = Optional Transport2RecordRouteUri = sip:example.org;transport=TLS # Configuration for manually maintained TLS certificates: Transport2TlsPrivateKey = /etc/ssl/private/example.org-key.pem Transport2TlsCertificate = /etc/ssl/public/example.org.pem # Configuration for certificates obtained using Let's Encrypt / certbot: #Transport2TlsPrivateKey = /etc/letsencrypt/live/example.org/privkey.pem #Transport2TlsCertificate = /etc/letsencrypt/live/example.org/fullchain.pem # Transport3 will be for SIP over WebSocket (WebRTC) connections # We use port 8443 here but you could use 443 instead Transport3Interface = 198.51.100.19:8443 Transport3Type = WSS Transport3TlsDomain = example.org # This would require the browser to send a certificate, but browsers # don't currently appear to be able to, so leave it as None: Transport3TlsClientVerification = None Transport3RecordRouteUri = sip:example.org;transport=WSS # Configuration for manually maintained TLS certificates: Transport3TlsPrivateKey = /etc/ssl/private/example.org-key.pem Transport3TlsCertificate = /etc/ssl/public/example.org.pem # Configuration for certificates obtained using Let's Encrypt / certbot: #Transport3TlsPrivateKey = /etc/letsencrypt/live/example.org/privkey.pem #Transport3TlsCertificate = /etc/letsencrypt/live/example.org/fullchain.pem 38 SIP proxy server installation # Transport4 is the IPv6 version of Transport3 Transport4Interface = 2001:DB8:1000:2000::19:8443 Transport4Type = WSS Transport4TlsDomain = example.org Transport4TlsClientVerification = None Transport4RecordRouteUri = sip:example.org;transport=WSS # Configuration for manually maintained TLS certificates: Transport4TlsPrivateKey = /etc/ssl/private/example.org-key.pem Transport4TlsCertificate = /etc/ssl/public/example.org.pem # Configuration for certificates obtained using Let's Encrypt / certbot: #Transport4TlsPrivateKey = /etc/letsencrypt/live/example.org/privkey.pem #Transport4TlsCertificate = /etc/letsencrypt/live/example.org/fullchain.pem # Transport5: this could be for TCP connections to an Asterisk server # in your internal network. Don't allow port 5060 through the external # firewall. Transport5Interface = 198.51.100.19:5060 Transport5Type = TCP Transport5RecordRouteUri = sip:198.51.100.19:5060;transport=TCP # Transport6 is the IPv6 version of Transport6 Transport5Interface = 2001:DB8:1000:2000::19:5060 Transport5Type = TCP Transport5RecordRouteUri = sip:2001:DB8:1000:2000::19:5060;transport=TCP HttpBindAddress = 198.51.100.19, 2001:DB8:1000:2000::19 HttpAdminUserFile = /etc/repro/users.txt RecordRouteUri = sip:example.org;transport=tls ForceRecordRouting = true EnumSuffixes = e164.arpa, sip5060.net, e164.org DisableOutbound = false EnableFlowTokens = true EnableCertificateAuthenticator = True Table 11.2, “TLS client verification modes” explains the options that can be used for the ClientVerification parameters on each transport. Table 11.2. TLS client verification modes (Transport)TLSClientVerification Impact None The peer is not asked to send a certificate. Optional The peer is asked to send a certificate. If the peer sends a valid certificate or if no certificate is sent at all, the connection will be established. Mandatory Every connection, from client/user devices or external callers must have a client certificate. This is more secure, but some devices don't support client certificates. If you are not sure, start with the setting Optional As of v1.10.0, repro provides a simpler syntax for configuring database access. Create the databases and tables as described in the section called “SQL databases”. To configure repro to use your tables, see the examples Example 11.4, “Using PostgreSQL” and Example 11.5, “Using MySQL”. Example 11.4. Using PostgreSQL DefaultDatabase = 101 39 SIP proxy server installation Database101Type = postgresql Database101ConnInfo = host=pg1 port=5432 dbname=repro user=repro password=abc Example 11.5. Using MySQL DefaultDatabase = 101 Database101Type = mysql Database101Host = mysql1 Database101Port = 3306 Database101DatabaseName = repro Database101User = repro Database101Password = abc If you need help with the configuration settings, please join the mailing list repro-users [http:// list.resiprocate.org/mailman/listinfo/repro-users] and the reSIProcate team will try to help. Use the htdigest utility from the Apache web server to set the password for the web interface admin user, as demonstrated in Example 11.6, “Using htdigest to set admin user password” Example 11.6. Using htdigest to set admin user password $ sudo htdigest -c /etc/repro/users.txt repro admin Adding password for admin in realm repro. New password: Re-type new password: $ Now restart the repro daemon to use the new settings, as demonstrated in Example 11.7, “Restarting the repro daemon (systemd)”. Example 11.7. Restarting the repro daemon (systemd) $ sudo systemctl restart repro Restarting repro Testing with s_client You can test that the repro daemon is listening on the correct ports and that the certificates are valid by using the OpenSSL s_client utility. This is demonstrated in Example 11.8, “Using s_client to test SIP ports (Debian/Ubuntu)” and Example 11.9, “Using s_client to test SIP ports (Fedora/ RHEL/CentOS)”. Example 11.8. Using s_client to test SIP ports (Debian/Ubuntu) $ openssl s_client -connect sip-proxy.example.org:5061 \ -CApath /etc/ssl/certs ... Verify return code: 0 (ok) --- Example 11.9. Using s_client to test SIP ports (Fedora/RHEL/CentOS) $ openssl s_client -connect sip-proxy.example.org:5061 \ -CAfile /etc/ssl/certs/ca-bundle.crt 40 SIP proxy server installation ... Verify return code: 0 (ok) --The output should finish with Verify return code: 0 (ok). If you don't see that then the server is not running, the firewall is blocking the connection, the port is wrong or there is some problem with the certificate file or the repro.config configuration file. You may also find clues in Syslog or the repro.log file. Login to web administration Go to http://server1.example.org:5080 and log in as the admin user you created. Click to add a domain. The screenshot in Figure 11.1, “repro web administration: adding a domain” demonstrates how to add the domain example.org. Figure 11.1. repro web administration: adding a domain Now you must restart the repro daemon again to use the new domain, as demonstrated in Example 11.7, “Restarting the repro daemon (systemd)”. User management It is not necessary to add users manually through the web interface. If users are identified by TLS client certificates or WebSocket cookie authentication, the SIP proxy does not need to have its own list of users at all. If users are stored in an SQL database, it is possible for other processes to INSERT new users into the table and repro will see them immediately. Adding a user The screenshot in Figure 11.2, “repro web administration: adding a user” demonstrates adding a user called alice to the domain example.org: 41 SIP proxy server installation Figure 11.2. repro web administration: adding a user The list of all users can be easily viewed, as demonstrated in Figure 11.3, “repro web administration: listing users”. Figure 11.3. repro web administration: listing users 42 SIP proxy server installation Adding routes for numeric dialing Sometimes, when using a SIP phone, it is easier to dial a number than a full SIP address. In the example.org demonstration, the users have the phone numbers 8001 and 8002. Figure 11.4, “repro web administration: adding a route” demonstrates how to set up the number 8001 for Alice. Figure 11.4. repro web administration: adding a route Once the numbers have been added, it is easy to view them all using the `Show Routes' page: 43 SIP proxy server installation Figure 11.5. repro web administration: listing routes It is also possible to test the regular expressions to see how they are evaluated. This can be very useful when using replacement strings (where a single rule automatically maps to many different results), an example is given in Figure 11.6, “repro web administration: routing test”. Figure 11.6. repro web administration: routing test If you need help with the configuration settings, please join the mailing list repro-users [http:// list.resiprocate.org/mailman/listinfo/repro-users] and the reSIProcate team will try to help. 44 SIP proxy server installation Kamailio SIP proxy Package installation For Debian/Ubuntu, install the package using apt, as demonstrated in Example 11.10, “Installing kamailio on Debian/Ubuntu”. Fedora, RHEL and CentOS users need to manually add the appropriate repository from rpm.kamailio.org [http://rpm.kamailio.org/] and then use yum to install, as demonstrated in Example 11.11, “Install kamailio on Fedora/RHEL/CentOS”. Example 11.10. Installing kamailio on Debian/Ubuntu $ sudo apt-get install kamailio $ sudo addgroup kamailio ssl-cert Example 11.11. Install kamailio on Fedora/RHEL/CentOS $ sudo yum install kamailio $ sudo addgroup kamailio ssl-cert Configuration The configuration file is /etc/kamailio/kamailio.cfg. The configuration file is written in a scripting language specific to the Kamailio project. It is recommended that you look for and adapt an example configuration file that meets your needs rather than trying to write one from scratch. After you complete the configuration, restart the daemon as demonstrated in Example 11.7, “Restarting the repro daemon (systemd)”. Example 11.12. Restarting the kamailio daemon (systemd) $ sudo systemctl restart kamailio Restarting kamailio 45 Chapter 12. XMPP (Jabber) server installation Choosing an XMPP server It is recommended that you use the Prosody XMPP server. It is widely used and relatively easy to configure. Latest releases of Prosody are being made available as packages on the major Linux distributions. You can also use ejabberd, jabberd2 or another server if you prefer. Prosody XMPP server Package installation Install the package using the appropriate tool, as demonstrated in Example 12.1, “Installing Prosody on Debian/Ubuntu” and Example 12.2, “Install Prosody on Fedora/RHEL/CentOS”. Example 12.1. Installing Prosody on Debian/Ubuntu $ sudo apt-get install prosody $ sudo addgroup prosody ssl-cert Example 12.2. Install Prosody on Fedora/RHEL/CentOS $ sudo yum install prosody $ sudo addgroup prosody ssl-cert Configuration Prosody can use the certificates created in Chapter 9, TLS certificate creation. In the Prosody configuration, you can refer to the PEM files directly under /etc/ssl. Alternatively, you can copy the certificate files and private key PEM files to /etc/prosody/certs or create symbolic links from that location to the real PEM files. Whichever approach you choose, make sure that the private key file (or a copy of it) is readable by the user that Prosody runs as but be careful to ensure they are not world-readable. Using the example provided, create configuration files for each domain you want to host under / etc/prosody/conf.d. Example 12.3, “Domain configuration file (Let's Encrypt / certbot)” demonstrates the minimum configuration for a domain using Let's Encrypt certificates and Example 12.4, “Domain configuration file (manual)” demonstrates the equivalent configuration for a domain using manually maintained certificates. Example 12.3. Domain configuration file (Let's Encrypt / certbot) -- Section for VirtualHost example.com VirtualHost "example.org" ssl = { key = "/etc/letsencrypt/live/example.org/privkey.pem"; certificate = "/etc/letsencrypt/live/example.org/fullchain.pem"; 46 XMPP (Jabber) server installation } Example 12.4. Domain configuration file (manual) -- Section for VirtualHost example.com VirtualHost "example.org" ssl = { key = "/etc/ssl/private/example.org-key.pem"; certificate = "/etc/ssl/public/example.org.pem"; } Edit the file /etc/prosody/prosody.cfg.lua. This is where you can do things like enabling the LDAP authentication module or enabling SQL storage for user data. Once configuration is complete, restart the daemon as demonstrated in Example 12.5, “Restarting the prosody daemon (systemd)”. Example 12.5. Restarting the prosody daemon (systemd) $ sudo systemctl restart prosody Restarting prosody User management It is not necessary to add users manually. If users are authenticated by LDAP, for example, Prosody will dynamically create the XMPP account the first time the user logs in. If such a system is not in use, users can be added manually using the command line utility prosodyctl or using a web interface. Example 12.6, “Using prosodyctl to add a user” demonstrates how to add a user at the command line. Example 12.6. Using prosodyctl to add a user $ sudo prosodyctl adduser alice@example.org To use LDAP authentication, make sure that mod_auth_ldap.lua is in the Prosody lib directory and add the LDAP settings to prosody.cfg.lua as demonstrated in Example 12.7, “prosody.cfg.lua settings for mod_auth_ldap”. Example 12.7. prosody.cfg.lua settings for mod_auth_ldap authentication = "ldap" ldap_server = "ldap-server.example.org" ldap_rootdn = "" ldap_password = "" ldap_filter = "(mail=$user@$host)" ldap_scope = "subtree" ldap_tls = true; ldap_base = "dc=example,dc=org" ldap_mode = "bind" Further reading The Prosody web site gives more detailed documentation about setting up the user accounts and other steps [https://prosody.im/doc/install]. 47 XMPP (Jabber) server installation ejabberd XMPP server Package installation Install the package using the appropriate tool, as demonstrated in Example 12.8, “Installing ejabberd on Debian/Ubuntu” and Example 12.9, “Install ejabberd on Fedora/RHEL/CentOS”. Example 12.8. Installing ejabberd on Debian/Ubuntu $ sudo apt-get install ejabberd $ sudo addgroup ejabberd ssl-cert Example 12.9. Install ejabberd on Fedora/RHEL/CentOS $ sudo yum install ejabberd $ sudo addgroup ejabberd ssl-cert Configuration Modify the file /etc/ejabberd/ejabberd.cfg, add the server IP address and the path to the certificate as demonstrated in Example 12.10, “ejabberd interface example”. Example 12.10. ejabberd interface example {listen, [ {5222, ejabberd_c2s, [ {access, c2s}, {ip, {195, 8, 117, 19}}, {shaper, c2s_shaper}, {max_stanza_size, 65536}, %% {certfile, "/etc/ssl/private/example.org-key_combined starttls_required ]}, Set up the users: go to http://server1.example.org:5280, log in and set up the user accounts. jabberd2 XMPP server Package installation Install the package using the appropriate tool, as demonstrated in Example 12.11, “Installing jabberd2 on Debian/Ubuntu” and Example 12.12, “Install jabberd2 on Fedora/RHEL/CentOS”. Example 12.11. Installing jabberd2 on Debian/Ubuntu $ sudo apt-get install jabberd2 $ sudo addgroup jabber ssl-cert Example 12.12. Install jabberd2 on Fedora/RHEL/CentOS $ sudo yum install jabberd $ sudo addgroup jabberd ssl-cert 48 XMPP (Jabber) server installation Configuration jabberd2's configuration files are in /etc/jabberd2/ (Debian/Ubuntu) or /etc/jabberd/ (Fedora/RHEL/CentOS). It can use the certificates created in Chapter 9, TLS certificate creation. jabberd2 is modular and each of the components needs to be configured. The most basic jabberd configuration requires setting the hostname of the server in c2s.xml as demonstrated in Example 12.13, “jabberd2 c2s.xml example” and the JID domain in sm.xml as demonstrated in Example 12.14, “jabberd2 sm.xml example” The default storage module in sm.xml and authreg module in c2s.xml are sqlite which works well for most installations. Example 12.13. jabberd2 c2s.xml example xmpp-gw.example.org Example 12.14. jabberd2 sm.xml exampleexample.org Further reading The jabberd2 web site [http://jabberd2.org] gives more detailed documentation about setting up the server. 49 Chapter 13. WebRTC WebRTC, also known as RTCWeb, puts two-way media streaming capabilities into the web browser and provides an API to manage them (starting and stopping calls) from the JavaScript embedded in any web page. The technology has been pioneered in the two major browsers, Mozilla Firefox and Google Chrome. Other browsers have been following their lead. There was some instability in the early years of WebRTC but since mid-2014 the technology has stabilised significantly. There have been some pseudo-WebRTC solutions as well, specifically, browser plugins that offer behavior similar to WebRTC with an emphasis on a specific provider. These solutions are not true WebRTC and they are largely becoming irrelevant now that most users have upgraded to browsers with genuine WebRTC support built in. WebRTC provides a mechanism for peer-to-peer media streaming (audio or video) but it does not specify the use of any particular signalling system, the mechanism responsible for locating other users and routing calls to them. Technical overview Media streaming capabilities The media streaming capabilities of WebRTC are similar to those used for traditional VoIP and RTC but they differ slightly. WebRTC mandates support for two audio codecs, Opus and G.711. In practice, browsers are unlikely to implement proprietary codecs such as G.729 that are implemented in many desk phones. Opus is superior to many of the legacy codecs but it does mean there is a possibility of transcoding with a slight degradation in quality when there is interoperability with legacy technology. Since November 2014, two video codecs, VP8 and H.264 are mandatory for the browser. VP8 is a royalty-free codec that is likely to be widely adopted by newer technologies. H.264 exists in many legacy video/webcam/teleconferencing solutions and its presence in the browser enables end-to-end video without transcoding, reducing complexity and CPU requirements and avoiding degradation of the picture. Despite the support for legacy codecs, many other features of the browser's media stack differ and do not offer direct connectivity to most legacy technology. A major feature of WebRTC is the use of Interactive Connectivity Establishment (ICE) for effective NAT discovery and traversal. Many legacy technologies, including a lot of softphones and desk phones, do not support ICE or have support for its predecessor, STUN. The next major feature of WebRTC is encryption. Many legacy phones support basic SDES encryption, with key exchange in the Session Description Protocol crypto attributes. WebRTC insists on the use of DTLS-SRTP which offers more security but with a complete loss of backwards compatibility. The final point is the RTP packet itself. Many traditional devices and softphones support RTP/AVP. WebRTC requires RTP/AVPF. The combined effect of these small differences is that WebRTC media streams have a higher quality than traditional RTC but they can't interoperate directly with the majority of desk phones and softphones already deployed. Given the extremely wide deployment of web browsers (hundreds of millions of users have already upgraded to browser versions that include WebRTC support) it is 50 WebRTC envisaged that vendors of related technologies will aim to interoperate with the browser in future versions of their products. In the meantime, it is necessary for media streams to be passed through some intermediate network component that can transform the streams between the standards. This component is referred to by different names, including Session Border Controller (SBC), Back-to-Back User Agent (B2BUA) and Media Breaker. In practice, it is relatively easy to configure an Asterisk or FreeSWITCH server to perform this role. Signalling protocols As already mentioned, WebRTC does not provide a signalling protocol for the purpose of locating other users and establishing the media streams to start a call. JavaScript does provide the WebSockets API, a mechanism for asychronously passing messages back and forth between JavaScript and a WebSocket server. Many WebRTC implementors have chosen to use WebSockets as a transport for their signalling protocols. SIP and XMPP, the most common signalling protocols from traditional RTC, have both between adapted to support WebRTC. RFC 7118 specifies the SIP over WebSocket transport and many leading SIP implementations have implemented it. XMPP supports both a HTTP binding and more recently a WebSocket binding specified in RFC 7395. Using one of these protocols is highly recommended for the vast majority of WebRTC projects. User privacy and security While media streaming allows for more powerful applications to be deployed through the web, it also creates a greater risk to user security and privacy. When the JavaScript on a site attempts to activate the webcam or microphone, the browser shows a prompt asking the user to authorize the streaming session. The prompt usually allows the user to choose which devices will be used if they have more than one webcam or microphone/audio source. Authentication Authentication between a browser and a server can take place in various ways. If a WebSocket connection is used for signalling and if a user has a client certificate in their browser then it should theoretically be possible to use the certificate to authenticate the WebSocket connection. In practice, this is supported by the repro SIP proxy but it is not yet supported by the browsers. Another possibility is the use of cookies or WebSocket URL parameters. Browser security mechanisms (to protect users from cross-site-scripting) only allow cookies to be used if the web server and WebSocket server have the same domain name. If the servers don't use the same domain, URL parameters must be used instead of the cookie. The web server serving the HTML and JavaScript can send an authentication token to the browser as a cookie and the browser can then present this to the WebSocket signalling server. If using the URL parameter method, the script running on the serverside usually constructs a WebSocket URL and embeds it in the HTML sent to the browser. When the JavaScript activates the WebSocket connection, the request-URL, including the parameters, are sent in the WebSocket upgrade request. Both of these mechanisms are supported in the repro SIP proxy. Standard SIP DIGEST authentication can also be used over the WebSocket transport. One benefit of DIGEST authentication is that challenges can be sent from SIP proxy servers or other network components behind the WebSocket server. Cookie and URL parameter authentication in repro To use either of these mechanisms with the repro SIP proxy, simply make sure that there is a value for the WSCookieAuthSharedSecret parameter in repro.config. If desired, the actual cookie or URL parameter names can be customized, otherwise they use default values. 51 WebRTC Example 13.1. repro.config settings for cookie and URL parameter authentication WSCookieAuthSharedSecret = some-random-string # Names of the cookies to use for the cookie authentication protocol # These are the default values: #WSCookieNameInfo = WSSessionInfo #WSCookieNameExtra = WSSessionExtra #WSCookieNameMAC = WSSessionMAC # Name of the extension header that must match the content of # the authenticated WSSessionExtra cookie #WSCookieExtraHeaderName = X-WS-Session-Extra To send the authentication values as URL parameters, the WebSocket URL passed to JSCommunicator or JsSIP may resemble wss://ws.example.org:8443/ WSSessionInfo=1%3A1429975989%3A142997 6889%3A%2A%40example.org%3A %2A%40%2A;WSSessionExtra=;WSSessionM AC=7bf9ed44bfe7e10153762639419c52fd712de58e. Notice that the parameters are sent with the semicolon as a separator, do not send them as query parameters with the ampersand (&) separator. The value of each parameter has to be URL encoded (for example, using the urlencode() function in PHP). This is demonstrated in the DruCall source code. Further details and examples are present in the page on the reSIProcate project wiki [http:// www.resiprocate.org/SIP_Over_WebSocket_Cookies]. Practical WebRTC deployment Although the WebRTC API does not provide a signalling protocol, as described in the section called “Signalling protocols”, this does not mean that deployers need to think about developing something themself. In practice, there are several JavaScript libraries which combine a complete signalling implementation and WebRTC API interaction, giving the web developer a very simple API to start and stop calls. WebRTC clients and firewalls Any type of RTC project faces two major problems engaging users: ensuring that users have suitable software and ensuring that there is a suitable network connection. WebRTC comprehensively addresses the first problem, ensuring that users have suitable software, by deploying the software as part of the web browser. This solution is so effective because of the high percentage of users who have web browsers and the vast majority of them are receiving automatic upgrades to the latest version of the browser. The latter problem, ensuring a suitable network connection, is more complicated. The second problem, network connectivity, is explained in the section called “Getting through firewalls”. The comments in that section are especially relevant to WebRTC. WebRTC clients are particularly well suited to work through these problems because of their native support for ICE, TURN, TLS and HTTP proxy servers. JsSIP and JSCommunicator For those interested in using SIP for WebRTC signalling, the most compelling solution now involves a combination of JsSIP and JSCommunicator [http://jscommunicator.org]. JsSIP provides the low-level support for SIP message parsing. JSCommunicator provides a high-level API and even a fragment of HTML that can be embedded into an existing page to get up and running quickly. 52 WebRTC JSCommunicator works with a repro SIP proxy server configured using the settings in Example 11.3, “Sample values for repro.config”. To deploy JSCommunicator, take a copy of the HTML, CSS and JavaScript from an existing web site or from the Github repository. If using the code from Github, it is necessary to download each dependency and then run the script to combine and minify the JavaScript code (see the README file). Make any necessary changes to the config.js file and embed the jscommunicator.inc HTML fragment into an existing page template. Content Management Systems and other frameworks Search the plugin or module catalog for any major Content Management System (CMS) and you will find many plugins claiming to offer WebRTC. A large number of these are either promoting browser plugins or promoting proprietary services that do not use open standards and lock you into using a specific back-end. Look for those that offer full source code and support for one of the documented and widely supported signalling protocols, SIP or XMPP, so you will have a free choice to run any of the servers described in this guide or use of any arbitrary provider. For Drupal web sites, adding WebRTC is as simple as adding the DruCall [http://drucall.org] module and pointing it to a SIP proxy such as repro. The DruCall module is based on JSCommunicator so it also provides a very good example of how to adapt JSCommunicator to other CMS platforms. Figure 13.1. DruCall/JSCommunicator/JsSIP software stack Figure 13.1, “DruCall/JSCommunicator/JsSIP software stack” demonstrates the relationship between the JavaScript libraries used in DruCall and the underlying web browser APIs. Troubleshooting See the section called “WebRTC and WebSockets”. 53 Chapter 14. Client devices and softphones Softphones There are a variety of softphones available for Linux, Windows and Mac OS. Many users will get high quality audio by connecting a headset to the 3.5mm audio socket on their computer. However, using headsets with a USB connector yields better results in some cases. The Jitsi [http://www.jitsi.org] softphone is developed in Java and runs on Linux, Windows and Mac OS. It supports both SIP and XMPP. There is a detailed guide to setup up Jitsi with client certificates [http://www.resiprocate.org/ ReproMutualTLSAuthenticationJitsi] in the reSIProcate wiki. The GNOME desktop on many common Linux distributions includes the Empathy softphone, supporting IM, voice and video over SIP or XMPP. Various other Linux softphones are available, including LinPhone and Ring (formerly SFLphone). There are a vast array of Linux messaging applications for XMPP, not necessarily having support for voice or video. Popular choices include Pidgin and Psi. One of the most popular proprietary softphones is Bria from Counterpath. IP desk phones A key point to note about desktop phones is that they often have a limited range of codecs and they often support proprietary codecs such as G.729 rather than Internet-optimized codecs such as Opus and iLBC. Given that a significant number of calls will start in a web browser using WebRTC and the Opus codec, codec compatibility is an important consideration. One of the most recognisable IP phones is the Cisco 7940 and its successors. The Cisco phones are well manufactured with good audio quality (including speakerphone support). However, there are multiple firmware options available and this can be expensive to purchase and complicated to administer. If purchasing used Cisco phones on eBay, it is vital to ensure that you are obtaining proper firmware with the phones or that you have some other legal means of obtaining all firmware. The phones load the firmware and configuration using DHCP and TFTP. The Polycom Soundpoint IP [http://www.polycom.com] phones are very similar in quality to the Cisco phones but without the licensing complications. They typically support SIP out of the box. The Polycom phones support configuration over HTTPS. From the era of Soundpoint IP 320 and later models, there is a client certificate in each phone. This certificate can be used to authenticate when downloading the configuration, ensuring that SIP passwords can't be compromised. The certificate can also be used to authenticate SIP over TLS connections, this is supported by the repro SIP proxy using the settings EnableCertificateAuthenticator and CommonNameMappings. Another popular choice is the SNOM [http://www.snom.com] device. There are various factors to think about when choosing a phone, such as VLAN support, built-in Ethernet hub, power-over-ethernet support, codecs, configuration support, support for NAT traversal (using ICE and TURN) and TLS support. 54 Client devices and softphones Smartphone apps On the Android platform, there are several popular free, open source SIP applications including Lumicall [http://www.lumicall.org] and CSipSimple. Users of the Apple iPhone may want to consider a proprietary app such as Bria for iPhone [http:// www.counterpath.com/bria-iphone-edition.html]. Click-to-dial Convenience is a significant factor in the success of any technology. Click-to-dial brings significant convenience to users. Many users will dial a contact from their mobile phone, despite the higher cost of the call, simply because of the convenience of accessing the address book through a touch screen. Click-to-dial from a computer provides similar convenience. This section considers various ways to enable click-to-dial. The Firefox Telify plugin People will frequently encounter phone numbers in their web browser. They may be browsing an arbitrary web site or they may be accessing a business application that doesn't have any native click to dial support. Web application developers can markup phone numbers as hyperlinks using the tel: URI prefix. This makes the phone number clickable just like a link to another web site or an email address. Unfortunately, few web developers have taken advantage of this feature. The Firefox plugin Telify [https://addons.mozilla.org/en-us/firefox/addon/telify/] solves this problem. It scans the page you are looking at and dynamically converts phone numbers into links that can be clicked. Mozilla Thunderbird and GNOME Evolution address books Many people use a productivity suite like Mozilla Thunderbird or GNOME Evolution for email and address book purposes. For Thunderbird users, the TBDialOut [https://addons.mozilla.org/en-us/thunderbird/addon/tbdialout/ ] plugin makes phone numbers in the address book clickable as tel or sip URIs. Dialing is then delegated to the URI handler on the user's system. For Evolution users, using v3.13.2, there is support for clicking phone numbers and SIP addresses that have been added to the address book. Evolution will only make them clickable if it detects that a URI handler is installed. Using sipdialer A simple way to handle the tel and sip URIs is to install the sipdialer from reSIProcate. The sipdialer utility can send a SIP REFER to various SIP phones that support this mechanism, including Cisco and Polycom. It is available as a package on Debian, Ubuntu and Fedora. Using Asterisk or FreeSWITCH There are various scripts available that can send an instruction over HTTP to an Asterisk or FreeSWITCH server to initiate a phone call. One of these scripts can be installed as a URI handler for tel and possibly sip URIs on each user's computer. 55 Chapter 15. Adding ENUM to DNS ENUM is a scheme described in RFC 6116 for mapping E.164 telephone numbers to SIP addresses, XMPP addresses and various other types of resource. ENUM can enable more rapid discovery of services, network resilience and convenience for people who only have a telephone number or a numeric dialpad. Telephone numbers are everywhere. People have large collections of phone numbers in their mobile telephone address books. Many organizations have large databases of customer phone numbers that have either been submitted by customers or collected from caller-ID. In public ENUM, the owner of a number is able to give callers specific options for contacting them. In private ENUM, organizations can distribute a rich set of routing data in a highly efficient and convenient format, DNS. ENUM must be considered from two perspectives: publishing your own data for ENUM users and making use of the ENUM data published by other people and organizations. For many people, the first impression of ENUM is the public ENUM tree. Given that many countries have not yet formally adopted ENUM, the public ENUM tree still has some big gaps and is not universally useful for every telephone number that exists in the PSTN. Fortunately, the story does not end there. There are several unofficial ENUM trees and there are many ways that ENUM can be used within an organization. ENUM is worth looking at for various reasons, including the widespread support in many open source products, the relative simplicity of using distributed and fault-tolerant DNS servers to serve such data and the ease of troubleshooing using basic DNS tools. How ENUM works ENUM works with numbers written in the ITU E.164 notation. For example, a London phone number may be dialed 020 7123 4567 from within the UK but its E.164 representation is +442071234567. E.164 numbers are always designated with a leading plus (+) symbol. The digits following the plus symbol are the country prefix (44 in the example) and then any area code and finally the local number itself. Any other digits, such as the 0 used when dialing within the UK are not present. You may have noticed this notation is used for incoming phone calls and text messages on your mobile phone. To perform an ENUM query, the first step is to take the number and normalize it into the ITU E.164 format. Google's libPhoneNumber, a free software project, is an ideal tool for normalizing phone numbers individually or en-masse. Once you have the E.164 number, remove the leading plus symbol, reverse the order of the digits and insert periods between them. For the example number, it becomes 7.6.5.4.3.2.1.7.0.2.4.4. The next step is to append the ENUM suffix. The public ENUM suffix is e164.arpa. To look up the example number in public ENUM, it would be written 7.6.5.4.3.2.1.7.0.2.4.4.e164.arpa. Private and in-house ENUM services simply use an alternative suffix. You may choose to perform multiple ENUM queries concurrently using different suffixes and then choose the best result. A DNS query is sent using the query string that has been constructed. The query requests NAPTR records. Finally, the ENUM algorithm must inspect the NAPTR records that have been returned and try to identify which, if any, are useful. For example, if the query only returns a HTTP URL, a SIP proxy may not be able to use it and will ignore the result and use some other mechanism to route the call. Example 15.1, “Using dig to perform ENUM queries” demonstrates how to execute an ENUM query from the command line for the UK phone number 01865 332244 in the public ENUM suffix e164.arpa. 56 Adding ENUM to DNS Example 15.1. Using dig to perform ENUM queries $ dig -t naptr 4.4.2.2.3.3.5.6.8.1.4.4.e164.arpa ; > DiG 9.8.4-rpz2+rl005.12-P1 > -t naptr 4.4.2.2.3.3.5.6.8.1.4.4.e164.arpa ;; global options: +cmd ;; Got answer: ;; ->>HEADER ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: ;; QUESTION SECTION: ;4.4.2.2.3.3.5.6.8.1.4.4.e164.arpa. IN NAPTR ;; ANSWER SECTION: 4.4.2.2.3.3.5.6.8.1.4.4.e164.arpa. 86400 IN NAPTR 100 20 "u" "E2U+pstn:tel" "!^( 4.4.2.2.3.3.5.6.8.1.4.4.e164.arpa. 86400 IN NAPTR 100 10 "u" "E2U+sip" "!^\\+441 Consuming ENUM data ENUM data can be consumed at various points. The device or softphone where the user starts a call may have the ability to study the number the user has dialed and search for relevant data in ENUM. The data obtained from ENUM can be presented to the user through the user interface. The Android apps Lumicall and ENUMdroid both operate in this manner. SIP proxy servers and Session Border Controllers (SBCs) may also perform ENUM queries when deciding how to route a call. In these cases, the device does not have a user interface to allow the user to choose from multiple results. Typically, the routing system will only look for a SIP address in the ENUM results and will automatically send the call there rather than sending it to a PSTN gateway. Publishing ENUM data Setting up ENUM as part of your RTC deployment, in the public ENUM tree, an internal ENUM tree or both, are optional steps that provides more flexibility and resilience for routing calls. Public ENUM In various countries, it is possible to have your phone numbers registered in the public ENUM tree for e164.arpa. Wikipedia maintains a detailed list of national ENUM registries [http:// en.wikipedia.org/wiki/Telephone_number_mapping#External_links]. Private and third-party ENUM suffixes Even if your country does not have a national ENUM scheme yet, many large organizations are operating an internal ENUM service. If you have a domain name server, you can create NAPTR records in the zone files just as easily as creating an A or CNAME record. It is relatively easy to construct a script using Python or Java to read from a company telephone directory and write a zone file for the name server. The file can be regenerated periodically by a cron job. If your phone numbers are available in a local LDAP server, the dlz-ldap-enum [http:// www.opentelecoms.org/dlz-ldap-enum] module can be used in a Bind9 DNS name server to support real-time queries. 57 Adding ENUM to DNS Dynamic ENUM from LDAP with dlz-ldap-enum Installation Install the package using the appropriate tool, as demonstrated in Example 15.2, “Installing dlzldap-enum on Debian/Ubuntu” and Example 15.3, “Install dlz-ldap-enum on Fedora/RHEL/ CentOS”. Example 15.2. Installing dlz-ldap-enum on Debian/Ubuntu $ sudo apt-get install dlz-ldap-enum Example 15.3. Install dlz-ldap-enum on Fedora/RHEL/CentOS $ sudo yum install dlz-ldap-enum Configuration The configuration file is dlz_ldap_enum.conf. On a Debian/Ubuntu system, it can be found in /etc/bind while Fedora/RHEL/CentOS users will find it in /etc/named. The first step is to customize the file to specify the exact location of the plugin, the ENUM DNS suffix and your LDAP server connection parameters, as demonstrated in Example 15.4, “Sample dlz_ldap_enum.conf”. Example 15.4. Sample dlz_ldap_enum.conf dlz "example" { database "dlopen /usr/lib/dlz-ldap-enum/dlz_ldap_enum.so 2 v3 simple {cn=admin,dc=example,dc=org} {secret} {127.0.0.1} e164-addr.example.org {localhost. root.example.org. 2 604800 86400 2419200 604800} localhost 60 ldap:///ou=$zone$,dc=example,dc=org???objectclass=top ldap:///dc=example,dc=org?mail?sub?telephoneNumber=$record$"; }; Now add a reference to this file into the main named.conf, which may be under /etc/bind or just /etc depending upon your system. This is demonstrated in Example 15.5, “Additions to named.conf for Debian/Ubuntu” and Example 15.6, “Additions to named.conf for Fedora/ RHEL/CentOS”. Example 15.5. Additions to named.conf for Debian/Ubuntu include "/etc/bind/dlz_ldap_enum.conf"; Example 15.6. Additions to named.conf for Fedora/RHEL/CentOS include "/etc/named/dlz_ldap_enum.conf"; 58 Chapter 16. Troubleshooting Common problems and solutions Google Talk/Hangouts users not receiving XMPP chat messages If you have been using XMPP for a long time, you may well have some friends in your buddy list who are using gmail.com addresses. In the beginning, Google largely supported XMPP (with some limitations to TLS support) and it was possible to add gmail.com users to the buddy list and communicate with them using IM, voice and video. As of 2014, Google's XMPP support has become somewhat broken. The messages you send to gmail.com contacts using XMPP are never delivered and Google never gives any feedback to indicate there was a problem. You continue to see the contact's status changes in your buddy list, giving no clue that the Google service is broken. Until the Google issues are resolved, suggest to your contacts that they revert their Google account to use Google Talk instead of Hangouts. Google provides a link for this: https://plus.google.com/downgrade/. The XMPP Foundation maintains a list of hosting companies who provide fully functional XMPP support [http://wiki.xmpp.org/web/ Jabber_Hosting_Possibilities]. Audio and video quality issues If possible, try and start with audio alone and see if the issue persists. If the problem exists just using audio, then continue troubleshooting with audio only. The RTCP protocol, closely related to RTP, provides real-time feedback between the endpoints in an RTP session. Many phones and softphones can provide visual feedback based on RTCP statistics. Look for these statistics and try to identify the rate of packet loss and the latency. Identify which codecs are in use. If possible, change to a lower bitrate codec and observe if this makes any difference. Some codecs, such as Opus, have a variable bitrate and should adapt to network conditions. If using a softphone, check the computer's metrics, in particular, check that the CPU is not overloaded by other running applications. Identify the IP address where the RTP packets are being sent, you may be able to discover this from the RTP statistics in the phone or you may need to use a packet sniffer as described in the section called “Packet sniffers”. Perform a traceroute to the remote IP address (see the section called “Operating system utilities”). This will frequently reveal the point where latency is occuring. If using wifi and traceroute reveals latency or packet loss on the first hop, then it is a good idea to try using a cable connection to try and determine if the wifi is troublesome. Wifi can experience congestion if other wifi routers in your building use the same frequency. This can be dealt with by using a utility or smartphone app that analyzes the wifi frequencies in your building to help you find a quiet channel and then manually changing the router settings to use that channel. If there is latency or packet loss on any hop that includes a cable connection, then you may want to consider replacing the ethernet cable. Sometimes a faulty cable will appear to work sufficiently for applications like email but it will have a horrible impact on real-time audio/video streams. If you have 59 Troubleshooting access, log in to the devices on each end of the cable and check the interface statistics, looking for any TX or RX errors. If any interface settings are in automatic mode, set them manually (e.g. set full duplex and set the speed to gigabit). Another possible reason for latency or packet loss at an intermediate hop may be network congestion or high CPU load on one of the devices in the path. Check the charts for each device, they should be monitored as described in the section called “Monitoring tools”. Techniques Monitoring tools Monitoring can detect problems before end users notice them, help plan for growth and make troubleshooting easier when an unexpected problem does occur. Use systems like Ganglia [http://ganglia.info] and Cacti to gather statistics from all servers and network devices. Building up graphs of these statistics allows you to see normal usage patterns and spot any spikes more quickly. These graphs also allow you to visualize what conditions were like during an incident that occurred temporarily. Ensure log messages are being aggregated by Syslog. Using a tool like LogAnalyzer [http:// loganalyzer.adiscon.com/] to visualize the log messages in colour makes it much easier to spot unusual activity. Use an alerting tool such as Nagios or Icinga to monitor the graphs (see Ganglia-Nagios-Bridge [https://github.com/ganglia/ganglia-nagios-bridge]) and logs (see Syslog-Nagios-Bridge [https:// github.com/dpocock/syslog-nagios-bridge])and also monitor the availability of services such as the SIP and TURN processes and the expiry dates of TLS certificates. Appendix C, Configuring Nagios to monitor SIP, XMPP and TURN contains specific instructions to configure Nagios/Icinga to monitor SIP, XMPP and TURN servers. Check the logs Check /var/log/syslog and /var/log/daemon.log. Many of the RTC processes can also create their own logfiles in other locations. Refer to the configuration files to see which type of logging each process uses. The repro daemon web interface has a control on the Settings page where the log level can be changed at runtime without restarting the daemon. Check the web interface For those processes that have a web interface, this can be a useful way to see runtime activity at a glance. The repro daemon web interface has a Registrations page where all known SIP registrations can be seen. Operating system utilities Example 5.2, “Inspecting DNS entries with dig” demonstrates how to use the dig utility to verify that the DNS entries exist. Use the netstat or lsof commands to verify that each process is listening on the correct IP addresses and ports. 60 Troubleshooting If a process is failing to start and the reason is not clear in the log file or console output, use the strace utility to determine whether any syscall is failing. the section called “Testing with s_client” demonstrates how to use the OpenSSL s_client utility to make a test connection to the SIP proxy on the TLS and WebSocket over TLS ports. Packet sniffers Use tcpdump to capture the packets to a file on the server. Copy the capture file to a workstation and inspect it with Wireshark. For SIP over UDP or TCP, without encryption, the ngrep utility can be useful for identifying packets containing a particular string. Debugging mode Run the process in debug mode, in the foreground on a terminal, to see what it is doing. Running the repro daemon this way will allow you to see the SIP messages in the console. WebRTC and WebSockets Both major browsers have a built-in troubleshooting system for WebRTC. In the Mozilla Firefox browser, enter the URL about:webrtc. In the Google Chrome browser, the URL is chrome:// webrtc-internals. 61 Chapter 17. PBX Setup A soft PBX (such as Asterisk or FreeSWITCH) provides features such as voicemail, menu systems and call queues. Many of the typical features in a soft PBX have a particular focus on voice communications, rather than other types of RTC such as IM or video. It is perfectly feasible to build an RTC environment without these features. It is recommended that a SIP proxy is used to handle all connectivity with users and any external parties, the reasons for this are explained in the section called “All SIP connectivity through a SIP proxy”. This also means that it is better to install and test the SIP proxy before making decisions about the selection and design of the soft PBX. The soft PBX can be configured to make a SIP registration in the SIP proxy or routing entries can be created in both the SIP proxy and soft PBX to send calls back and forth between them as required. The configuration and operation of soft PBXes tends to replicate many concepts from the world of traditional telephony. The fact that many of the features of these products are voice-orientated is an example of this trend. Many guides on soft PBX configuration tend to focus on the use of dial plans and phone numbers as the dominant currency in the world of legacy communications, while modern unified communications strategies involve user@domain addressing similar to other Internet-based services. The all-in-one myth It is tempting to look at a soft PBX as a one-stop-shop for VoIP, with no other product required. In fact, this is a very limited strategy in terms of features and resilience. Many people have a requirement to use existing ISDN lines with their RTC architecture. With Asterisk and FreeSWITCH both boasting ISDN support, it is tempting to do everything with that single instance of a soft PBX installed on a server with ISDN hardware. Modularity is a hallmark of good design in any IT project. Modularity gives you the flexibility to upgrade or modify one component of a system without changing any other component. Modularity also means that some components are more likely to continue providing service even if something fails. In the planning of a soft PBX deployment, modularity involves running one instance of the soft PBX just to control the ISDN hardware and running another instance for services such as voicemail and using a SIP proxy to route calls between these different components. Choosing between Asterisk and FreeSWITCH Asterisk is by far one of the most well known open source VoIP server products. It has a plethora of features and supports a diverse range of connectivity options, from IP based solutions like SIP to legacy technologies like ISDN and POTS. FreeSWITCH is a popular alternative to Asterisk, boasting many of the same features, but with a collective ownership model rather than the corporate model that is intertwined with Asterisk's licensing and contributor agreements. We consider some of the points where they differ. Not every point is relevant in every deployment. If you are not sure which way to go and if maintaining the soft PBX will not be the primary focus of your job, we suggest using Asterisk because it has official packages but we do not wish to discourage people from considering FreeSWITCH when they understand the issues involved and feel it is the better choice. 62 PBX Setup Official packages Asterisk has officially supported packages in many of the popular GNU/Linux distributions. FreeSWITCH does not. FreeSWITCH users have to use unofficial packages from the FreeSWITCH web site or compile from source code. When packages are made available through an official distribution, like Debian or EPEL, it means they go through a managed release cycle and are subject to a battery of independent tests to ensure the packages don't interfere with any other packages on the same system. When something is available in an official package, it also means upgrading the operating system (for example, from Debian 7 to Debian 8) should also upgrade the package in a safe manner. Contributing patches Many more experienced users of open source software become intimitely familiar with the software they rely on and sometimes they even develop bug fixes or improvements. It can be tedious to test and re-apply such fixes to each new version of a product and so many people in this situation usually want to contribute their fix to the primary source repository for the project so it will automatically be part of all future releases. Some projects welcome these contributions unconditionally and without any specific legal agreement, ownership of the contribution remains the intellectual property of the contributor and other members of the community are simply licensed to use it. Some projects ask the contributor to go a step further, giving the founders of the projects some additional rights to include the contribution in commercial products without releasing the source code of the final product. Finally, some projects go all the way and don't just ask the contributor for a preferential license, they ask the contributor to grant ownership of all intellectual rights in the contribution to the project's founders or some other entity. Asterisk is in second category, asking contributors to give Digium, the company behind Asterisk, a license to redistribute the contributions under alternative terms. Some projects use this strategy to collect intellectual property rights in a non-profit community foundation but in this case the rights are being granted to Digium, a company with shareholders. Another point of contention is that the agreement is one-sided: it does not contain any commitment by Digium to release future versions of the product under any open source license. Some contributors are uncomfortable with these contribution terms and some people are unable to make contributions under these terms without violating regulations set by their own employer or funding they receive from public sources. Licensing Asterisk is distributed under the GPL while FreeSWITCH is using the Mozilla Public License. The main distinction between these licenses applied to those users who intend to build their own product around the soft PBX and sell it. The GPL typically requires people in this situation to either publish the source code of any fixes or enhancements or other components they create as part of their overall solution. Digium has a parallel-licensing strategy, allowing people in this situation to pay a license fee and eliminate the obligations of the GPL. The Mozilla Public License used by FreeSWITCH doesn't involve these issues. Community The contributor agreement and the licensing strategy have an impact on the type of community that is forming around each product, especially the community of developers contributing to the products. 63 PBX Setup Even for users who don't intend to either contribute source code or resell products built from Asterisk or FreeSWITCH, it is important to consider which community is more sustainable in the long term. Many people have their own thoughts and feelings about this. It may well be that the existence of both competing products with distinct communities is the most sustainable solution for both. Scalabiltiy and code quality One of the reasons that FreeSWITCH was founded is because the creators were not satisfied with the design of Asterisk and did not feel that Asterisk would change. FreeSWITCH was written from the ground up to address some of those perceived problems. One area where such problems exist is in the case of scalability. FreeSWITCH's design is more favorable to large scale operation. It should be noted that while the designers of FreeSWITCH have chosen to emphasize different priorities and achieved a more scalable solution, Asterisk has involved in other ways and some people feel the range of features Asterisk offers for developing their customized applications is superior and more relevant to them than scalability. Using Asterisk with the repro SIP proxy Setup the SIP proxy as described in the section called “repro SIP proxy”. Add a UDP transport in repro.config, it will be used to communicate with Asterisk. It is a good idea to ensure that the firewall prevents external hosts from sending any UDP traffic to either the SIP proxy or the SIP port on Asterisk. Go to the repro web administration page and click to add a route. Configure the route using the details in Table 17.1, “repro route configuration”. Replace A.B.C.D with the IP address of the Asterisk server. Table 17.1. repro route configuration Parameter Value URI ^sip:([0-9]*)@sip-proxy\.example \.org;.*transport=tls Destination sip: $1@A.B.C.D:5060;transport=udp Notice that this route looks for the transport=tls parameter. This means it will only be applied to calls coming from the users. When a call comes into the SIP proxy from the Asterisk server, it will be coming over the UDP transport and it won't be matched by this route (otherwise it would go into a loop). Next, in the repro web administration page, click to add an entry to the ACL. Add an entry permitting packets from the IP address and SIP port used by the Asterisk server. Remember to restart the repro SIP proxy if changes were made to the list of domains or the repro.config file. In the Asterisk server, setup the sip.conf file as demonstrated in Example 17.1, “Asterisk sip.conf”. In particular, replace A.B.C.D with the IP address that the Asterisk server should bind to, this must be a routable IP address on the Asterisk host. Example 17.1. Asterisk sip.conf ; should match the realm used by the proxy realm=sip-proxy.example.org 64 PBX Setup domain=sip-proxy.example.org fromdomain=sip-proxy.example.org port=5060 bindaddr=A.B.C.D ; follow this pattern to define a user [8001] username=8001 secret=whatever host=dynamic canreinvite=no mailbox=8001 nat=yes The Asterisk server will need to be able to send calls to SIP users who are registered with the SIP proxy. The calls can be routed using the Dial command as demonstrated in Example 17.2, “Asterisk extensions.conf”. Example 17.2. Asterisk extensions.conf exten => _8XXX,n,Dial(SIP/${EXTEN}@sip-proxy.example.org,45) 65 Chapter 18. PSTN connectivity The Public Switched Telephone Network (PSTN) remains pervasive and convenient for much of the world's population, even though it is also expensive, unsophisticated and insecure. In the early days of IP telephony, the PSTN was perceived as something of a security blanket. Companies would design their IP telephony system to mirror the traditional PBX. Some would even keep a few analog phone lines connected in case of an "emergency". This fear-based approach has gradually been replaced by a more pragmatic approach, relegating the PSTN services to being just one part of the big picture. A modern RTC-based solution works seamlessly with or without the PSTN. The emotional attachment to the PSTN has largely been contained due to two factors: the widespread presence of smartphones as an alternative means of communication that can be used in an emergency and the increased investment in corporate IT networks which need to be always available. This chapter looks at PSTN connectivity issues. Methods of PSTN connectivity Anybody, anywhere in the world, can now rent inbound phone numbers and make outgoing calls using SIP trunking providers. This is often the fastest, cheapest and most flexible means of getting connected to the PSTN. It is often possible to port existing phone numbers from legacy phone companies to SIP operators. There are a range of hardware options for joining analog and ISDN telephone lines to an IP network. One option is to purchase a dedicated media gateway, such as the those promoted by Cisco Systems and other well known vendors. Another option is to install an ISDN or analog telephony card into a server and run Asterisk or FreeSWITCH, as described in Chapter 17, PBX Setup, configured solely to act as a media gateway. If dedicated ISDN links to the telephone company are important, it is worthwhile considering one further permutation: instead of installing the media gateway at the office location, have the ISDN lines installed to a rack in a data center and use VPN or WAN links from the data center to the office. This can achieve higher resilience and flexibility: if the main office site suffers from any kind of technical or environmental disturbance, calls can be routed from the data center to users at home, on mobile devices or at another branch office or disaster recovery location. ingress call handling The concept of an ingress module accepting calls from other places such as SIP trunks or ISDN trunks is introduced in the section called “Routing calls within a site”. The ingress stage should, in most cases, normalize both the destination number and the caller ID into the E.164 format. This will assist with both routing and log analysis later on. The ingress stage may also convert the destination numbers to the addresses of internal users such as user@example.org. This can also be done at the routing stage. egress call handling The concept of egress modules preparing calls from the local users to go out to SIP trunks or ISDN trunks is also introduced in the section called “Routing calls within a site”. The egress stage should convert the destination number into the format expected by the telephone company or trunking provider. For example, they may require a 00 prefix on all numbers qualified with a country code. 66 PSTN connectivity The egress stage is also a good place to set the caller ID. Some trunking providers automatically set the caller ID for you. Some allow you to specify the caller ID in the From header, as long as the value you use is an inbound number that you have purchased from the same company. If you try to use any other number, it is likely the will replace it with one of your numbers selected at random. ISDN trunks attached to a soft PBX or media gateway also permit the caller ID number to be set on a per-call basis. Setting the caller ID to a constant value is relatively easy within an Asterisk extension as demonstrated in Example 18.1, “Asterisk extensions.conf for specifying caller ID”. Example 18.1. Asterisk extensions.conf for specifying caller ID exten => _X.,1,Set(CALLERID(name)=00442071358378) exten => _X.,2,Set(CALLERID(number)=00442071358378) Instead of hard-coding a constant value, if the users have their own direct phone numbers, a CSV file or Asterisk Realtime SQL lookups could be used to map individual SIP usernames to personal caller-ID values. Emergency calls Providing access to dial the emergency services has been a controversial issue for all IP-based telephony. Users may see a phone and want to use it to make such a call. Anybody installing phones should contemplate what happens in this situation. The first thing to note is that not all organizations route emergency calls to the publicly operated emergency call center. Some large organizations and universities route these calls to their internal security office. The suitability of this approach depends on local laws and the training of the security staff. Many SIP providers now offer an option to handle emergency calls. For this to be effective, the SIP provider usually needs to have accurate records of the addresses where the SIP trunks are used. For example, care needs to be taken to ensure that emergency calls are not routed from mobile VoIP users when they are off-site, as the emergency services may arrive at the wrong location. Another option is to have a single physical phone line or GSM SIP gateway attached to the IP phone system solely for routing emergency calls. All other calls would be routed to the normal SIP providers. If it is not technically feasible to route calls to the emergency service number, it may be useful to provide a brief recorded message telling the user to call emergency services from another phone. After playing the message once or twice, the PBX should hang up, so the user knows that the call is not being routed. In the early days of telephony, not every home or office had a telephone. In Britain, which is known for its distinctive red phone boxes, the police force took responsibility for installing many blue phone boxes for use by police and people without a telephone. Some people feel that it is important for the emergency services to be proactive again and ensure that emergency call centers have a presence on the Internet, accepting calls directly from users of SIP and XMPP. 67 Chapter 19. Frequently Asked Questions Can I use a virtual server for SIP or XMPP? For small installations (less than 30 concurrent phone calls) a virtual server running on modern hardware is more than sufficient. For demanding use-cases, it is recommended that any real-time processes (such as the TURN server or a soft PBX like Asterisk or FreeSWITCH) be on dedicated servers while it may still be possible for the SIP proxy or XMPP server to be on a virtual server. Do I really need to use TLS encryption and certificates? Yes. Even if you don't care too much about security or privacy, TLS helps to reduce the risk of nuisance calls from spammers and the risk of impersonation and it also eliminates a range of problems caused by SIP-aware routers that try to modify SIP messages to help them through NAT. 68 Chapter 20. Community support Many technologies and companies have a presence on the Internet for support and interaction between between users and developers. This model of community support is particularly relevant for RTC technology. RTC, by definition, requires interoperability between all those using the technology and efficient online collaboration helps to identify and resolve interoperability problems. Many users also have common problems to solve, such as the collaboration between Internet companies to eliminate spam. In the RTC domain, there are a range of online communities with various objectives. The objectives include supporting specific pieces of software, development of standards, discussion of operational issues between providers and advocacy of open standards and private communication. Mailing lists Major announcements The Free-RTC-Announce mailing list [http://lists.freertc.org/mailman/listinfo/announce] is a lowvolume mailing list where you can receive important announcements about Free RTC products, community activities and events. The list is fully moderated and aims not to send more than one announcement per week. Please go ahead and subscribe now [http://lists.freertc.org/mailman/listinfo/ announce]. Strategy and advocacy The FSFE Free RTC mailing list [https://lists.fsfe.org/mailman/listinfo/free-rtc] discusses strategies for promoting and adopting free RTC and free software. Collaboration between operators and service providers The XSF XMPP operators mailing list [http://mail.jabber.org/mailman/listinfo/operators] enables discussion of issues between organizations managing XMPP servers of any size. Server support The reSIProcate repro users mailing list [http://list.resiprocate.org/mailman/listinfo/repro-users] provides community support for people setting up and operating the repro SIP proxy server. The Prosody users mailing list [http://prosody.im/discuss#mailing_lists] provides community support for people setting up and operating the Prosody XMPP server. Softphones The Lumicall users mailing list [http://lists.lumicall.org] supports users of the Lumicall Android app. The Jitsi users mailing list [https://jitsi.org/Development/MailingLists] provides a resource for those setting up and using the Jitsi products, including the popular Jitsi softphone. Popular blogs and news sites planet.sip5060.net [http://planet.sip5060.net] syndicates blogs from leading software developers with a focus on RTC and especially SIP. 69 Appendix A. Building reSIProcate packages on Debian/Ubuntu reSIProcate packages are usually available in stable-backports. Sometimes, such as during a Debian release freeze, stable-backports won't contain the latest upstream version or there is some other reason to build the package from source. This is a relatively straightforward task using the debuild utility. Example A.1. Installing the debuild command $ sudo apt-get install devscripts Example A.2. Installing the compiler and dependencies $ sudo apt-get build-dep resiprocate Example A.3. Running the debuild command $ $ $ $ wget http://.../resiprocate-1.9.8.tar.gz tar xzf resiprocate-1.9.8.tar.gz cd resiprocate-1.9.8 debuild -rfakeroot -i -us -uc -b --no-lintian Example A.4. Running the debuild command using code from Git $ $ $ $ git clone https://github.com/resiprocate/resiprocate cd resiprocate git checkout 1.9.8 debuild -rfakeroot -i -us -uc -b --no-lintian 70 Appendix B. Building reSIProcate RPMs on RHEL and CentOS reSIProcate packages are available on many recent Linux distributions. On some platforms, including Red Hat Enterprise Linux and CentOS, it may be necessary to build the RPMs from source. This is a relatively straightforward task. Example B.1. Installing the rpmbuild command $ sudo yum install rpm-build Example B.2. Installing the compiler and dependencies $ sudo yum install gcc-c++ libtool automake autoconf \ asio-devel boost-devel cajun-jsonapi-devel c-ares-devel \ cppunit-devel gperf db4-cxx-devel db4-devel openssl-devel \ mysql-devel pcre-devel perl popt-devel python-devel \ python-pycxx-devel freeradius-client-devel xerces-c-devel Example B.3. Creating the rpmbuild directories $ mkdir ~/rpms $ cd ~/rpms $ mkdir BUILD BUILDROOT \ RPMS/i386 RPMS/noarch RPMS/x86_64 \ SOURCES SPECS SRPMS $ cat > ~/.rpmmacros << EOF %_topdir $HOME/rpms %__make /usr/bin/make -j7 EOF $ Example B.4. Running the rpmbuild command $ wget http://.../resiprocate-1.9.8.tar.gz $ rpmbuild -tb resiprocate-1.9.8.tar.gz 71 Appendix C. Configuring Nagios to monitor SIP, XMPP and TURN Users become very frustrated with a service if it is not working when they need it. Monitoring systems like Nagios help to discover any outage at the first opportunity and inform the right person to fix it. Nagios plugins It is necessary to download and install the individual Nagios plugin scripts. Once that is done, the plugins must be declared in the Nagios configuration. They can be used over and over again to create configurations for monitoring different services on different hosts. As the TURN server uses the STUN protocol, a STUN test script is sufficient to test the TURN server is operational. Example C.1. Sample /etc/nagios-plugins/config/stun.cfg # can be used to check STUN and TURN servers # uses script from http://karlsbakk.net/asterisk/scripts/check_stun define command { command_name check_stun command_line /usr/local/lib/nagios/plugins/check_stun $HOSTADDRESS$ } Example C.2. Sample /etc/nagios-plugins/config/sip.cfg # uses script from https://github.com/ibc/nagios-sip-plugin define command { command_name check_sip_tls command_line /usr/local/lib/nagios/plugins/check_sip2 -t tls -p $ARG2$ } Example C.3. Sample /etc/nagios-plugins/config/xmpp.cfg # uses script from https://exchange.icinga.org/jandd/check_xmppng # Debian/Ubuntu: apt-get install nagios-check-xmppng define command { command_name check_xmpp command_line /usr/lib/nagios/plugins/check_xmppng -H $HOSTADDRESS$ --ser } Nagios service checks Once the plugins are declared in the Nagios configuration, they can be used to write service check definitions as demonstrated here. Example C.4. Sample service check for STUN/TURN define service{ use host_name service_description check_command } generic-service turn-server.example.org STUN/TURN check_stun 72 Configuring Nagios to monitor SIP, XMPP and TURN The following test SIP on port 5061 and 443: Example C.5. Sample service check for SIP over TLS define service{ use host_name service_description check_command } generic-service server1 SIPS check_sip_tls_port!sip-server.example.or Example C.6. Sample service check for SIP over TLS (port 443) define service{ use host_name service_description check_command } generic-service server1 SIPS 443 check_sip_tls_port!sip-server.example.or The following monitors the XMPP service. Notice that the argument used for this check must be the XMPP domain, not the server domain or hostname. In the example, it is example.org. Example C.7. Sample service check for XMPP define service{ use host_name service_description check_command } generic-service server1 XMPP check_xmpp!example.org 73 Appendix D. Mitigating VoIP fraud risk VoIP fraud is not a new problem, it is just an old problem with a new target. Fraud is not a reason to avoid VoIP and RTC technology. Fraud has been a regular problem for companies with traditional ISDN phone systems. Managing the risk requires a balanced approach. Legal insurance In the event that your phone account is misused, you may end up in a legal dispute with your phone company. Check that you have a satisfactory legal costs insurance policy. Verify that the terms and conditions include cover for disputes with utility companies. Trade body membership If you are operating a business, are you a member of any trade organizations, such as the local chamber of commerce? These organizations sometimes provide useful advice and sometimes arrange legal insurance on behalf of members. Set a credit limit If you leave the cookies out on the table, it won't be long until children start eating them and they will keep eating until they are all gone. Likewise, if your VoIP PBX is hacked, the bad guys are going to use it to relay calls to high cost destinations: and they are not going to stop until you switch the system off or the phone company cuts the line. The number one thing you can do to protect your phone system does not involve any technical changes. It simply involves writing a letter. Write to your phone company and tell them the amount of daily and monthly expenditure you authorise. Make it clear that this is both a security precaution and that any severe violation may jeopordise your business to the extent that you may not be able to pay bills in future. Dear Sir, My phone number is ___________ and my account number is ____________ I am writing to inform you that the total authorized expenditure for this account is $_______ per day and $________ per month. Any services supplied in excess of this authorization will be treated as if they were supplied in error and we accept no liability for them. Furthermore, I am informing you that we explicitly do not require the use of any of the services listed below, that the supply of these services is not authorized and that if any of these services are supplied to us or billed to us without management authorization, it is an error of the phone company and therefore it will not be paid. • Calls to premium rate numbers • Reverse charge calls charged at a rate in excess of $___ per minute • Calls to numbers where a share of the call charge is paid out to the recipient of the call (such as the UK 0871 numbers) 74 Mitigating VoIP fraud risk • Premium-rate text messaging services • Data roaming charges • Data charges for data usage in excess of bundled data allowances This letter has been sent to you by recorded delivery and takes effect on receipt. Sincerely, ____________________ Director/Manager/President Use a different phone company for inbound numbers If you do ever end up with an inflated bill that has come about because of illegal use of your VoIP system, and if your phone company has somehow lost the letter you sent specifying your maximum authorized expenditure, they might try and bully you into paying the bill anyway. Phone companies have large accounts departments that are very experienced at manipulating and bullying customers to pay a bill whether it is correct or not. A recent report by analysts Juniper Research suggested that phone companies lose over $58 billion per year due to their own technical faults in billing technology. The magnitude of this figure emphasises one particular point: phone companies may sometimes underbill you, they may sometimes overbill you, but if customers were watching their bills more closely, phone companies wouldn't be making so many mistakes. With such unreliable systems, the phone company has very little evidence they can rely on to force you to pay a bill. So they simply cut off customer's numbers. This is why this point is so vital: use two different phone companies. All your outgoing calls go through one company (company A). All your phone numbers and incoming calls come through a different company (company B). If your VoIP system is hacked or misused in some way, company A might cut off your line - but you will still be receiving incoming calls normally thanks to company B. 75 Appendix E. Directory of RTC and VoIP Service Providers This is a directory of companies offering RTC and PSTN services over the Internet. Not all these services are fully based on open source software or open standards. Some of them use a combination of open and proprietary elements to provide a solution. apidaze Web site: http://www.apidaze.io [http://www.apidaze.io/] Integrate telephony and WebRTC services into existing web sites and mobile apps. Circuit Web site: http://www.circuit.com Fully managed hosted collaboration service with WebRTC and app-based access and a developer API. Circuit aims to be everything a team needs to communicate. It supports voice, video, screen sharing, chat and file sharing. Developers Developers can register for a Circuit account at developers.circuit.com [https:// developers.circuit.com]. Code samples are available on github [https://github.com/yourcircuit] and codepen [https://codepen.io/circuit/]. Gradwell Web site: http://www.gradwell.com SIP trunking and hosted PBX service based in the UK. RestComm Web site: http://www.restcomm.com A cloud-based service for deploying and operating telephony-based applications for the web and mobile. Applications can interact with RestComm using REST techniques. Tropo Web site: http://www.tropo.com Hosted PBX service that can be extensively customized with scripting or manipulated from other systems making calls to a REST API. Scripts can be developed in a variety of languages and then deployed into the Tropo server. Truphone Web site: http://www.truphone.com 76 Directory of RTC and VoIP Service Providers Next generation global mobile network with IP connectivity. Voxbone Web site: http://www.voxbone.com Inbound SIP trunking service with global coverage. REST-based provisioning API. Voxhub Web site: http://www.voxhub.com UK-based turnkey telephone service for business. VoxImplant Unified Communication Servce, SIP trunking service, an SDK for embedding the service into arbitrary mobile apps and an SDK for integrating the service into web sites using WebRTC. 77
Source Exif Data:
File Type : PDF File Type Extension : pdf MIME Type : application/pdf Linearized : No Page Count : 88 Profile CMM Type : lcms Profile Version : 2.3.0 Profile Class : Display Device Profile Color Space Data : RGB Profile Connection Space : XYZ Profile Date Time : 2004:08:13 12:18:06 Profile File Signature : acsp Primary Platform : Apple Computer Inc. CMM Flags : Not Embedded, Independent Device Manufacturer : lcms Device Model : Device Attributes : Reflective, Glossy, Positive, Color Rendering Intent : Perceptual Connection Space Illuminant : 0.9642 1 0.82491 Profile Creator : lcms Profile ID : 0 Device Mfg Desc : lcms generated Profile Description : sRGB Device Model Desc : sRGB Media White Point : 0.95015 1 1.08826 Red Matrix Column : 0.43585 0.22238 0.01392 Blue Matrix Column : 0.14302 0.06059 0.71384 Green Matrix Column : 0.38533 0.71704 0.09714 Red Tone Reproduction Curve : (Binary data 2060 bytes, use -b option to extract) Green Tone Reproduction Curve : (Binary data 2060 bytes, use -b option to extract) Blue Tone Reproduction Curve : (Binary data 2060 bytes, use -b option to extract) Chromaticity Channels : 3 Chromaticity Colorant : Unknown (0) Chromaticity Channel 1 : 0.64 0.33 Chromaticity Channel 2 : 0.3 0.60001 Chromaticity Channel 3 : 0.14999 0.06 Profile Copyright : no copyright, use freely Language : en Format : application/pdf Date : 2017:02:03 14:32:57+01:00 PDF Version : 1.4 Producer : Apache FOP Version 1.1 Create Date : 2017:02:03 14:32:57+01:00 Creator Tool : Apache FOP Version 1.1 Metadata Date : 2017:02:03 14:32:57+01:00 Creator : Apache FOP Version 1.1EXIF Metadata provided by EXIF.tools