Get Rewarded! We will reward you with up to €50 credit on your account for every tutorial that you write and we publish!

Install TURN/STUN Server on Debian/Ubuntu with coturn

profile picture
Author
Noah Seefried
Published
2019-03-08
Time to read
5 minutes reading time

Introduction

We will install a basic TURN/STUN server with coturn. The TURN Server is a VoIP media traffic NAT traversal server and gateway. It can be used as a general-purpose network traffic TURN server and gateway, too.

The basic concept of TURN

Sequence diagram

Example projects which use TURN/STUN:

If you self-host one of these applications you can, for example, use your own TURN/STUN server there.

Prerequisites

  • At least a small virtual server, e.g. Cloud Server CX11, with a root shell
  • Basic knowledge about linux

Assumptions

  • Domain: example.com
  • Server IPv4: 10.0.0.1
  • Server IPv6: 2001:db8:1234::1
  • Client public IPv4: 78.47.166.55
  • Client private IPv4: 192.168.0.10

Step 1 - Setup DNS records

General DNS records:

turn.example.com. 14400 IN A    10.0.0.1
turn.example.com. 14400 IN AAAA 2001:db8:1234::1
stun.example.com. 14400 IN A    10.0.0.1
stun.example.com. 14400 IN AAAA 2001:db8:1234::1

@ IN NAPTR 10 0 "s" "RELAY:turn.udp" "" _turn._udp.example.com.

Following DNS records should be used if you only install one TURN/STUN server:

_stun._udp.example.com.  14400 IN SRV  5 0 3478 turn.example.com.
_stun._tcp.example.com.  14400 IN SRV  5 0 3478 turn.example.com.
_stuns._tcp.example.com. 14400 IN SRV  5 0 5349 turn.example.com.

_turn._udp.example.com.   14400 IN SRV  5 0 3478 turn.example.com.
_turn._tcp.example.com.   14400 IN SRV  5 0 3478 turn.example.com.
_turns._tcp.example.com.  14400 IN SRV  5 0 5349 turn.example.com.

For best performance and fail-safe you should have at least two TURN/STUN servers. We slightly need to change the DNS records for two:

_stun._udp.example.com.   14400 IN SRV  5  50 3478 turn1.example.com.
_stun._udp.example.com.   14400 IN SRV  10 50 3478 turn2.example.com.
_stun._tcp.example.com.   14400 IN SRV  5  50 3478 turn1.example.com.
_stun._tcp.example.com.   14400 IN SRV  10 50 3478 turn2.example.com.
_stuns._tcp.example.com.  14400 IN SRV  5  50 5349 turn1.example.com.
_stuns._tcp.example.com.  14400 IN SRV  10 50 5349 turn2.example.com.
_turn._udp.example.com.   14400 IN SRV  5  50 3478 turn1.example.com.
_turn._udp.example.com.   14400 IN SRV  10 50 3478 turn2.example.com.
_turn._tcp.example.com.   14400 IN SRV  5  50 3478 turn1.example.com.
_turn._tcp.example.com.   14400 IN SRV  10 50 3478 turn2.example.com.
_turns._tcp.example.com.  14400 IN SRV  5  50 5349 turn1.example.com.
_turns._tcp.example.com.  14400 IN SRV  10 50 5349 turn2.example.com.

Do not forget to setup DNS records (A and AAAA) for turn1.example.com and turn2.example.com as mentioned above.

Theoretically you could also deploy a second A and AAAA record for turn.example.com and stun.example.com but this is not the recommended way.

Step 2 - Installation

First, we will need to install coturn on our server:

apt-get update
apt-get install coturn

For the moment, we will stop coturn:

systemctl stop coturn

Step 3 - Configuration

In order to enable the TURN server, open the file /etc/default/coturn and remove the # in front of TURNSERVER_ENABLED=1.

The configuration file is located at /etc/turnserver.conf. First, we move the original version of this file using:

mv /etc/turnserver.conf /etc/turnserver.conf.orig

Then we open/create /etc/turnserver.conf in an editor of our choice and paste the following configuration:

listening-port=3478
tls-listening-port=5349

fingerprint
lt-cred-mech

use-auth-secret
static-auth-secret=replace-this-secret

realm=turn.example.com

total-quota=100
stale-nonce=600

cert=/etc/letsencrypt/live/turn.example.com/cert.pem
pkey=/etc/letsencrypt/live/turn.example.com/privkey.pem
cipher-list="ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384"

no-sslv3
no-tlsv1
no-tlsv1_1
#no-tlsv1_2

dh2066

no-stdout-log
log-file=/var/tmp/turn.log
#log-file=/dev/null

no-loopback-peers
no-multicast-peers

proc-user=turnserver
proc-group=turnserver

Generate the secret by using

sed -i "s/replace-this-secret/$(openssl rand -hex 32)/" /etc/turnserver.conf

Step 4 - Register Let's Encrypt certificates

We will use certbot from EFF for the Let's Encrypt certificates.

apt-get install snapd
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot

With certbot installed, you can now create your certificate.

certbot certonly --standalone --rsa-key-size 4096 -m holu@example.com -d turn.example.com

You will get an email 30 (and 7) days before the certificates expire to holu@example.com.

Step 5 - Start and test the TURN/STUN server

We will start coturn by executing systemctl start coturn. Using systemctl status coturn we can test if coturn is running.

We do not know yet if our configuration was successful but luckily there is a tester available: WebRTC samples Trickle ICE

Remove the default server from the list. The field for “STUN or TURN URI” should look like this:

stun:stun.example.com

but you can also use the IP:

stun:10.0.0.1:3478

To test SSL/TLS encryption, use port 5349. You cannot test TURN here as the tester does not support.

Next click on Add Server and then on Gather candidates.

The output should look similar to this:

Time    Component       Type    Foundation     Protocol Address         Port        Priority
0.019   1               host             0          UDP 192.168.0.10    41904   126 | 32512 | 255
0.024   1               host             2          TCP 192.168.0.10    9       125 | 32704 | 255
0.027   2               host             0          UDP 192.168.0.10    53438   126 | 32512 | 254
0.030   2               host             2          TCP 192.168.0.10    9       125 | 32704 | 254
0.134   1               srflx            1          UDP 78.47.166.55    41904   100 | 32543 | 255
0.152   2               srflx            1          UDP 78.47.166.55    53438   100 | 32543 | 254
0.153   Done

If you get a timeout with Not reachable? the connection is probably blocked by a firewall. Check again if the ports 3478 and 5349 for the TURN server are open. Also test if you can reach it from your computer or another server via telnet or nmap.

If everything works as expected, replace log-file=/var/log/turn.log with log-file=/dev/null in your configuration file. This disables IP address logging and is for best privacy.

Conclusion

We now have a working TURN/STUN server. You can replace default TURN/STUN servers in other projects, some of them are mentioned above.

Want to contribute?

Get Rewarded: Get up to €50 in credit! Be a part of the community and contribute. Do it for the money. Do it for the bragging rights. And do it to teach others!

Report Issue

Discover our

Dedicated Servers

Configure your dream server. Top performance with an excellent connection at an unbeatable price!

Want to contribute?

Get Rewarded: Get up to €50 credit on your account for every tutorial you write and we publish!

Find out more