mirror of
				https://github.com/coturn/coturn.git
				synced 2025-11-04 08:51:00 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			1251 lines
		
	
	
		
			45 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			1251 lines
		
	
	
		
			45 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
.\" Text automatically generated by txt2man
 | 
						|
.TH TURN 1 "12 February 2020" "" ""
 | 
						|
.SH GENERAL INFORMATION
 | 
						|
 | 
						|
The \fBTURN Server\fP project contains the source code of a TURN server and TURN client 
 | 
						|
messaging library. Also, some extra programs provided, for testing\-only 
 | 
						|
purposes. 
 | 
						|
.PP
 | 
						|
See the INSTALL file for the building instructions.
 | 
						|
.PP
 | 
						|
After the build, you will have the following binary images:
 | 
						|
.TP
 | 
						|
.B
 | 
						|
1.
 | 
						|
\fIturnserver\fP: \fBTURN Server\fP relay. 
 | 
						|
The compiled binary image of the \fBTURN Server\fP program is located in bin/ sub\-directory.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
2.
 | 
						|
\fIturnadmin\fP: TURN administration tool. See README.turnadmin and \fIturnadmin\fP man page.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
3.
 | 
						|
turnutils_uclient. See README.turnutils and \fIturnutils\fP man page.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
4.
 | 
						|
turnutils_peer. See README.turnutils and \fIturnutils\fP man page.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
5.
 | 
						|
turnutils_stunclient. See README.turnutils and \fIturnutils\fP man page.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
6.
 | 
						|
turnutils_rfc5769check. See README.turnutils and \fIturnutils\fP man page.
 | 
						|
.PP
 | 
						|
In the "examples/scripts" sub\-directory, you will find the examples of command lines to be used 
 | 
						|
to run the programs. The scripts are meant to be run from examples/ sub\-directory, for example:
 | 
						|
.PP
 | 
						|
$ cd examples
 | 
						|
$ ./scripts/secure_relay.sh
 | 
						|
.SH RUNNING THE TURN SERVER
 | 
						|
 | 
						|
Options note: \fIturnserver\fP has long and short option names, for most options.
 | 
						|
Some options have only long form, some options have only short form. Their syntax 
 | 
						|
somewhat different, if an argument is required:
 | 
						|
.PP
 | 
						|
The short form must be used as this (for example):
 | 
						|
.PP
 | 
						|
.nf
 | 
						|
.fam C
 | 
						|
  $ turnserver \-L 12.34.56.78
 | 
						|
 | 
						|
.fam T
 | 
						|
.fi
 | 
						|
The long form equivalent must use the "=" character:
 | 
						|
.PP
 | 
						|
.nf
 | 
						|
.fam C
 | 
						|
  $ turnserver \-\-listening\-ip=12.34.56.78
 | 
						|
 | 
						|
.fam T
 | 
						|
.fi
 | 
						|
If this is a flag option (no argument required) then their usage are the same, for example:
 | 
						|
.PP
 | 
						|
.nf
 | 
						|
.fam C
 | 
						|
 $ turnserver \-a
 | 
						|
 | 
						|
.fam T
 | 
						|
.fi
 | 
						|
is equivalent to:
 | 
						|
.PP
 | 
						|
.nf
 | 
						|
.fam C
 | 
						|
 $ turnserver \-\-lt\-cred\-mech
 | 
						|
 | 
						|
.fam T
 | 
						|
.fi
 | 
						|
=====================================
 | 
						|
.SS  NAME
 | 
						|
\fB
 | 
						|
\fBturnserver \fP\- a TURN relay server implementation.
 | 
						|
\fB
 | 
						|
.SS  SYNOPSIS
 | 
						|
.nf
 | 
						|
.fam C
 | 
						|
 | 
						|
$ \fIturnserver\fP [\fB\-n\fP | \fB\-c\fP <config\-file> ] [\fIflags\fP] [ \fB\-\-userdb\fP=<userdb\-file> | \fB\-\-psql\-userdb\fP=<db\-conn\-string> | \fB\-\-mysql\-userdb\fP=<db\-conn\-string>  | \fB\-\-mongo\-userdb\fP=<db\-conn\-string>  | \fB\-\-redis\-userdb\fP=<db\-conn\-string> ] [\fB\-z\fP | \fB\-\-no\-auth\fP | \fB\-a\fP | \fB\-\-lt\-cred\-mech\fP ] [\fIoptions\fP]
 | 
						|
$ \fIturnserver\fP \fB\-h\fP
 | 
						|
 | 
						|
.fam T
 | 
						|
.fi
 | 
						|
.fam T
 | 
						|
.fi
 | 
						|
.SS  DESCRIPTION                                           
 | 
						|
 | 
						|
.TP
 | 
						|
.B
 | 
						|
Config file settings:
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-n\fP
 | 
						|
Do not use configuration file, use only command line parameters.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-c\fP
 | 
						|
Configuration file name (default \- turnserver.conf).
 | 
						|
The format of config file can be seen in
 | 
						|
the supplied examples/etc/turnserver.conf example file. Long 
 | 
						|
names of the \fIoptions\fP are used as the configuration 
 | 
						|
items names in the file. If not an absolute path is supplied, 
 | 
						|
then the file is searched in the following directories: 
 | 
						|
.RS
 | 
						|
.IP \(bu 3
 | 
						|
current directory
 | 
						|
.IP \(bu 3
 | 
						|
current directory etc/ sub\-directory
 | 
						|
.IP \(bu 3
 | 
						|
upper directory level etc/
 | 
						|
.IP \(bu 3
 | 
						|
/etc/
 | 
						|
.IP \(bu 3
 | 
						|
/usr/local/etc/
 | 
						|
.IP \(bu 3
 | 
						|
installation directory /etc
 | 
						|
.RE
 | 
						|
.TP
 | 
						|
.B
 | 
						|
User database settings:
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-b\fP, \fB\-\-db\fP, \fB\-\-userdb\fP
 | 
						|
SQLite user database file name (default \- /var/db/turndb or
 | 
						|
/usr/local/var/db/turndb or /var/lib/turn/turndb).
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-e\fP, \fB\-\-psql\-userdb\fP
 | 
						|
User database connection string for PostgreSQL.
 | 
						|
This database can be used for long\-term credentials mechanism,
 | 
						|
and it can store the secret value 
 | 
						|
for secret\-based timed authentication in TURN REST API.
 | 
						|
The connection string format is like that:
 | 
						|
.RS
 | 
						|
.PP
 | 
						|
"host=<host> dbname=<dbname> user=<db\-user> password=<db\-user\-password> connect_timeout=<seconds>" 
 | 
						|
(for 8.x or newer Postgres).
 | 
						|
.PP
 | 
						|
Or:
 | 
						|
.PP
 | 
						|
"postgresql://username:password@hostname:port/databasename" 
 | 
						|
(for 9.x or newer Postgres). 
 | 
						|
.PP
 | 
						|
See the INSTALL file for more explanations and examples.
 | 
						|
.PP
 | 
						|
Also, see http://www.PostgreSQL.org for full PostgreSQL documentation.
 | 
						|
.RE
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-M\fP, \fB\-\-mysql\-userdb\fP
 | 
						|
User database connection string for MySQL or MariaDB. 
 | 
						|
This database can be used for long\-term credentials mechanism,
 | 
						|
and it can store the secret value for 
 | 
						|
secret\-based timed authentication in TURN REST API.
 | 
						|
The connection string format is like that:
 | 
						|
.RS
 | 
						|
.PP
 | 
						|
"host=<host> dbname=<dbname> user=<db\-user> password=<db\-user\-password> connect_timeout=<seconds> read_timeout=<seconds>"
 | 
						|
.PP
 | 
						|
See the INSTALL file for more explanations and examples.
 | 
						|
.PP
 | 
						|
Also, see http://www.mysql.org or http://mariadb.org 
 | 
						|
for full MySQL documentation.
 | 
						|
.PP
 | 
						|
Optional connection string parameters for the secure communications (SSL): 
 | 
						|
ca, capath, cert, key, cipher 
 | 
						|
(see http://dev.mysql.com/doc/refman/5.1/en/ssl\-options.html for the 
 | 
						|
command \fIoptions\fP description).
 | 
						|
.RE
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-secret\-key\-file\fP
 | 
						|
This is the file path which contain secret key of aes encryption while using MySQL password encryption.
 | 
						|
If you want to use in the MySQL connection string the password in encrypted format,
 | 
						|
then set in this option the file path of the secret key. The key which is used to encrypt MySQL password.
 | 
						|
Warning: If this option is set, then MySQL password must be set in "mysql\-userdb" option in encrypted format! 
 | 
						|
If you want to use cleartext password then do not set this option!
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-J\fP, \fB\-\-mongo\-userdb\fP
 | 
						|
User database connection string for MongoDB. 
 | 
						|
This database can be used for long\-term credentials mechanism,
 | 
						|
and it can store the secret value 
 | 
						|
for secret\-based timed authentication in TURN REST API.
 | 
						|
The connection string format is like that:
 | 
						|
.RS
 | 
						|
.PP
 | 
						|
"mongodb://username:password@host:port/database?\fIoptions\fP"
 | 
						|
.PP
 | 
						|
See the INSTALL file for more explanations and examples.
 | 
						|
.PP
 | 
						|
Also, see http://docs.mongodb.org/manual/
 | 
						|
for full MongoDB documentation.
 | 
						|
.RE
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-N\fP, \fB\-\-redis\-userdb\fP
 | 
						|
User database connection string for Redis. 
 | 
						|
This database can be used for long\-term credentials mechanism,
 | 
						|
and it can store the secret 
 | 
						|
value for secret\-based timed authentication in TURN REST API.
 | 
						|
The connection string format is like that:
 | 
						|
.RS
 | 
						|
.PP
 | 
						|
"ip=<ip\-addr> dbname=<db\-number> password=<db\-password> connect_timeout=<seconds>"
 | 
						|
.PP
 | 
						|
See the INSTALL file for more explanations and examples.
 | 
						|
.PP
 | 
						|
Also, see http://redis.io for full Redis documentation.
 | 
						|
.RE
 | 
						|
.TP
 | 
						|
.B
 | 
						|
Flags:
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-v\fP, \fB\-\-verbose\fP
 | 
						|
Moderate verbose mode.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-V\fP, \fB\-\-Verbose\fP
 | 
						|
Extra verbose mode, very annoying and not recommended.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-o\fP, \fB\-\-daemon\fP
 | 
						|
Run server as daemon.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-prod\fP
 | 
						|
Production mode: hide the software version.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-f\fP, \fB\-\-fingerprint\fP
 | 
						|
Use fingerprints in the TURN messages. If an incoming request
 | 
						|
contains a fingerprint, then TURN server will always add 
 | 
						|
fingerprints to the messages in this session, regardless of the
 | 
						|
per\-server setting.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-a\fP, \fB\-\-lt\-cred\-mech\fP
 | 
						|
Use long\-term credentials mechanism (this one you need for WebRTC usage).
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-z\fP, \fB\-\-no\-auth\fP
 | 
						|
Do not use any credentials mechanism, allow anonymous access. 
 | 
						|
Opposite to \fB\-a\fP and \fB\-A\fP \fIoptions\fP. This is default option when no 
 | 
						|
authentication\-related \fIoptions\fP are set.
 | 
						|
By default, no credential mechanism is used \-
 | 
						|
any user is allowed.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-use\-auth\-secret\fP
 | 
						|
TURN REST API flag.
 | 
						|
Flag that sets a special WebRTC authorization option 
 | 
						|
that is based upon authentication secret. The feature purpose 
 | 
						|
is to support "\fBTURN Server\fP REST API" as described in
 | 
						|
the TURN REST API section below.
 | 
						|
This option uses timestamp as part of combined username:
 | 
						|
usercombo \-> "timestamp:username",
 | 
						|
turn user \-> usercombo,
 | 
						|
turn password \-> \fBbase64\fP(hmac(input_buffer = usercombo, key = shared\-secret)).
 | 
						|
This allows TURN credentials to be accounted for a specific user id.
 | 
						|
If you don't have a suitable id, the timestamp alone can be used.
 | 
						|
This option is just turns on secret\-based authentication.
 | 
						|
The actual value of the secret is defined either by option static\-auth\-secret,
 | 
						|
or can be found in the turn_secret table in the database.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-oauth\fP
 | 
						|
Support oAuth authentication, as in the third\-party STUN/TURN RFC 7635.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-dh566\fP
 | 
						|
Use 566 bits predefined DH TLS key. Default size of the key is 1066.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-dh2066\fP
 | 
						|
Use 2066 bits predefined DH TLS key. Default size of the key is 1066.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-no\-tlsv1\fP
 | 
						|
Do not allow TLSv1/DTLSv1 protocol.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-no\-tlsv1_1\fP
 | 
						|
Do not allow TLSv1.1 protocol.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-no\-tlsv1_2\fP
 | 
						|
Do not allow TLSv1.2/DTLSv1.2 protocol.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-no\-udp\fP
 | 
						|
Do not start UDP client listeners.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-no\-tcp\fP
 | 
						|
Do not start TCP client listeners.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-no\-tls\fP
 | 
						|
Do not start TLS client listeners.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-no\-dtls\fP
 | 
						|
Do not start DTLS client listeners.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-no\-udp\-relay\fP
 | 
						|
Do not allow UDP relay endpoints defined in RFC 5766, 
 | 
						|
use only TCP relay endpoints as defined in RFC 6062.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-no\-tcp\-relay\fP
 | 
						|
Do not allow TCP relay endpoints defined in RFC 6062, 
 | 
						|
use only UDP relay endpoints as defined in RFC 5766. 
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-no\-stdout\-log\fP
 | 
						|
Flag to prevent stdout log messages.
 | 
						|
By default, all log messages are going to both stdout and to
 | 
						|
the configured log file. With this option everything will be going to 
 | 
						|
the log file only (unless the log file itself is stdout).
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-syslog\fP
 | 
						|
With this flag, all log will be redirected to the system log (syslog).
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-simple\-log\fP
 | 
						|
This flag means that no log file rollover will be used, and the log file
 | 
						|
name will be constructed as\-is, without PID and date appendage.
 | 
						|
This option can be used, for example, together with the logrotate tool.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-secure\-stun\fP
 | 
						|
Require authentication of the STUN Binding request.
 | 
						|
By default, the clients are allowed anonymous access to the STUN Binding functionality.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-S\fP, \fB\-\-stun\-only\fP
 | 
						|
Run as STUN server only, all TURN requests will be ignored. 
 | 
						|
Option to suppress TURN functionality, only STUN requests will be processed.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-no\-stun\fP
 | 
						|
Run as TURN server only, all STUN requests will be ignored. 
 | 
						|
Option to suppress STUN functionality, only TURN requests will be processed.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-allow\-loopback\-peers\fP
 | 
						|
Allow peers on the loopback addresses (127.x.x.x and ::1).
 | 
						|
Allow it only for testing in a development environment! 
 | 
						|
In production it adds a possible security vulnerability, 
 | 
						|
and so due to security reasons, it is not allowed 
 | 
						|
using it together with empty cli\-password.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-no\-multicast\-peers\fP
 | 
						|
Disallow peers on well\-known broadcast addresses 
 | 
						|
(224.0.0.0 and above, and FFXX:*).
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-mobility\fP
 | 
						|
Mobility with ICE (MICE) specs support.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-no\-cli\fP
 | 
						|
Turn OFF the CLI support. By default it is always ON.
 | 
						|
See also \fIoptions\fP \fB\-\-cli\-ip\fP and \fB\-\-cli\-port\fP.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-server\-relay\fP
 | 
						|
Server relay. NON\-STANDARD AND DANGEROUS OPTION. 
 | 
						|
Only for those applications when we want to run 
 | 
						|
server applications on the relay endpoints.
 | 
						|
This option eliminates the IP permissions check 
 | 
						|
on the packets incoming to the relay endpoints.
 | 
						|
See http://tools.ietf.org/search/rfc5766#section\-17.2.3 .
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-udp\-self\-balance\fP
 | 
						|
(recommended for older Linuxes only)
 | 
						|
Automatically balance UDP traffic over auxiliary servers
 | 
						|
(if configured). The load balancing is using the 
 | 
						|
ALTERNATE\-SERVER mechanism. The TURN client must support 
 | 
						|
300 ALTERNATE\-SERVER response for this functionality.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-check\-origin\-consistency\fP
 | 
						|
The flag that sets the origin consistency 
 | 
						|
check: across the session, all requests must have the same
 | 
						|
main ORIGIN attribute value (if the ORIGIN was
 | 
						|
initially used by the session).
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-h\fP
 | 
						|
Help.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
Options with values:
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-stale\-nonce\fP[=<value>]
 | 
						|
Use extra security with nonce value having
 | 
						|
limited lifetime, in seconds (default 600 secs).
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-max\-allocate\-lifetime\fP
 | 
						|
Set the maximum value for the allocation lifetime.
 | 
						|
Default to 3600 secs.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-channel\-lifetime\fP
 | 
						|
Set the lifetime for channel binding, default to 600 secs.
 | 
						|
This value MUST not be changed for production purposes.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-permission\-lifetime\fP
 | 
						|
Set the value for the lifetime of the permission.
 | 
						|
Default to 300 secs.
 | 
						|
This MUST not be changed for production purposes.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-d\fP, \fB\-\-listening\-device\fP
 | 
						|
Listener interface device.
 | 
						|
(NOT RECOMMENDED. Optional functionality, Linux only). 
 | 
						|
The \fIturnserver\fP process must have root privileges to bind the 
 | 
						|
listening endpoint to a device. If \fIturnserver\fP must run as a 
 | 
						|
process without root privileges, then just do not use this setting.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-L\fP, \fB\-\-listening\-ip\fP
 | 
						|
Listener IP address of relay server. 
 | 
						|
Multiple listeners can be specified, for example:
 | 
						|
\fB\-L\fP ip1 \fB\-L\fP ip2 \fB\-L\fP ip3
 | 
						|
If no \fBIP\fP(s) specified, then all IPv4 and 
 | 
						|
IPv6 system IPs will be used for listening.
 | 
						|
The same \fBip\fP(s) can be used as both listening and relay \fBip\fP(s).
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-p\fP, \fB\-\-listening\-port\fP
 | 
						|
TURN listener port for UDP and TCP listeners (Default: 3478).
 | 
						|
Note: actually, TLS & DTLS sessions can connect to the "plain" TCP & UDP
 | 
						|
\fBport\fP(s), too \- if allowed by configuration.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-tls\-listening\-port\fP
 | 
						|
TURN listener port for TLS and DTLS listeners (Default: 5349).
 | 
						|
Note: actually, "plain" TCP & UDP sessions can connect to the TLS & DTLS
 | 
						|
\fBport\fP(s), too \- if allowed by configuration. The TURN server 
 | 
						|
"automatically" recognizes the type of traffic. Actually, two listening
 | 
						|
endpoints (the "plain" one and the "tls" one) are equivalent in terms of
 | 
						|
functionality; but we keep both endpoints to satisfy the RFC 5766 specs.
 | 
						|
For secure TCP connections, we currently support SSL version 3 and 
 | 
						|
TLS versions 1.0, 1.1, 1.2.
 | 
						|
For secure UDP connections, we support DTLS version 1.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-alt\-listening\-port\fP
 | 
						|
Alternative listening port for UDP and TCP listeners;
 | 
						|
default (or zero) value means "listening port plus one".
 | 
						|
This is needed for STUN CHANGE_REQUEST \- in RFC 5780 sense
 | 
						|
or in old RFC 3489 sense \- for NAT behavior discovery). The \fBTURN Server\fP
 | 
						|
supports CHANGE_REQUEST only if it is started with more than one
 | 
						|
listening IP address of the same family (IPv4 or IPv6). The CHANGE_REQUEST
 | 
						|
is only supported by UDP protocol, other protocols are listening
 | 
						|
on that endpoint only for "symmetry".
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-alt\-tls\-listening\-port\fP
 | 
						|
Alternative listening port for TLS and DTLS protocols.
 | 
						|
Default (or zero) value means "TLS listening port plus one".
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-aux\-server\fP
 | 
						|
Auxiliary STUN/TURN server listening endpoint.
 | 
						|
Aux servers have almost full TURN and STUN functionality.
 | 
						|
The (minor) limitations are:
 | 
						|
.RS
 | 
						|
.IP 1) 4
 | 
						|
Auxiliary servers do not have alternative ports and
 | 
						|
they do not support STUN RFC 5780 functionality (CHANGE REQUEST).
 | 
						|
.IP 2) 4
 | 
						|
Auxiliary servers also are never returning ALTERNATIVE\-SERVER reply.
 | 
						|
.RE
 | 
						|
.PP
 | 
						|
Valid formats are 1.2.3.4:5555 for IPv4 and [1:2::3:4]:5555 for IPv6.
 | 
						|
There may be multiple aux\-server \fIoptions\fP, each will be used for listening
 | 
						|
to client requests.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-i\fP, \fB\-\-relay\-device\fP
 | 
						|
Relay interface device for relay sockets 
 | 
						|
(NOT RECOMMENDED. Optional, Linux only).
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-E\fP, \fB\-\-relay\-ip\fP
 | 
						|
Relay address (the local IP address that 
 | 
						|
will be used to relay the packets to the 
 | 
						|
peer). Multiple relay addresses may be used:
 | 
						|
\fB\-E\fP ip1 \fB\-E\fP ip2 \fB\-E\fP ip3
 | 
						|
The same \fBIP\fP(s) can be used as both listening \fBIP\fP(s) and relay \fBIP\fP(s).
 | 
						|
If no relay \fBIP\fP(s) specified, then the \fIturnserver\fP will apply the 
 | 
						|
default policy: it will decide itself which relay addresses to be 
 | 
						|
used, and it will always be using the client socket IP address as 
 | 
						|
the relay IP address of the TURN session (if the requested relay 
 | 
						|
address family is the same as the family of the client socket).
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-X\fP, \fB\-\-external\-ip\fP
 | 
						|
\fBTURN Server\fP public/private address mapping, if the server is behind NAT.
 | 
						|
In that situation, if a \fB\-X\fP is used in form "\fB\-X\fP <ip>" then that ip will be reported
 | 
						|
as relay IP address of all allocations. This scenario works only in a simple case
 | 
						|
when one single relay address is be used, and no CHANGE_REQUEST functionality is 
 | 
						|
required. That single relay address must be mapped by NAT to the 'external' IP.
 | 
						|
The "external\-ip" value, if not empty, is returned in XOR\-RELAYED\-ADDRESS field.
 | 
						|
For that 'external' IP, NAT must forward ports directly (relayed port 12345
 | 
						|
must be always mapped to the same 'external' port 12345).
 | 
						|
In more complex case when more than one IP address is involved,
 | 
						|
that option must be used several times, each entry must
 | 
						|
have form "\fB\-X\fP <public\-ip/private\-ip>", to map all involved addresses.
 | 
						|
CHANGE_REQUEST (RFC5780 or RFC3489) NAT discovery STUN functionality will work 
 | 
						|
correctly, if the addresses are mapped properly, even when the TURN server itself 
 | 
						|
is behind A NAT.
 | 
						|
By default, this value is empty, and no address mapping is used.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-m\fP, \fB\-\-relay\-threads\fP
 | 
						|
Number of the relay threads to handle the established connections
 | 
						|
(in addition to authentication thread and the listener thread).
 | 
						|
If explicitly set to 0 then application runs relay process in a single thread,
 | 
						|
in the same thread with the listener process (the authentication thread will 
 | 
						|
still be a separate thread). If not set, then a default optimal algorithm 
 | 
						|
will be employed (OS\-dependent). In the older Linux systems
 | 
						|
(before Linux kernel 3.9), the number of UDP threads is always one threads 
 | 
						|
per network listening endpoint \- unless "\fB\-m\fP 0" or "\fB\-m\fP 1" is set.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-min\-port\fP
 | 
						|
Lower bound of the UDP port range for relay 
 | 
						|
endpoints allocation.
 | 
						|
Default value is 49152, according to RFC 5766.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-max\-port\fP
 | 
						|
Upper bound of the UDP port range for relay 
 | 
						|
endpoints allocation.
 | 
						|
Default value is 65535, according to RFC 5766.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-u\fP, \fB\-\-user\fP
 | 
						|
Long\-term security mechanism credentials user account, 
 | 
						|
in the column\-separated form username:key. 
 | 
						|
Multiple user accounts may be used in the command line.
 | 
						|
The key is either the user password, or
 | 
						|
the key is generated
 | 
						|
by \fIturnadmin\fP command. In the second case,
 | 
						|
the key must be prepended with 0x symbols.
 | 
						|
The key is calculated over the user name, 
 | 
						|
the user realm, and the user password.
 | 
						|
This setting may not be used with TURN REST API.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-r\fP, \fB\-\-realm\fP
 | 
						|
The default realm to be used for the users when no explicit 
 | 
						|
origin/realm relationship was found in the database, or if the TURN
 | 
						|
server is not using any database (just the commands\-line settings
 | 
						|
and the userdb file). Must be used with long\-term credentials 
 | 
						|
mechanism or with TURN REST API.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-C\fP, \fB\-\-rest\-api\-separator\fP
 | 
						|
This is the timestamp/username separator symbol 
 | 
						|
(character) in TURN REST API. The default value is :.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-q\fP, \fB\-\-user\-quota\fP
 | 
						|
Per\-user allocations quota: how many concurrent 
 | 
						|
allocations a user can create. This option can also be set 
 | 
						|
through the database, for a particular realm.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-Q\fP, \fB\-\-total\-quota\fP
 | 
						|
Total allocations quota: global limit on concurrent allocations.
 | 
						|
This option can also be set through the database, for a particular realm.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-s\fP, \fB\-\-max\-bps\fP
 | 
						|
Max bytes\-per\-second bandwidth a TURN session is allowed to handle
 | 
						|
(input and output network streams are treated separately). Anything above 
 | 
						|
that limit will be dropped or temporary suppressed (within the
 | 
						|
available buffer limits). This option can also be set through the 
 | 
						|
database, for a particular realm.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-B\fP, \fB\-\-bps\-capacity\fP
 | 
						|
Maximum server capacity.
 | 
						|
Total bytes\-per\-second bandwidth the TURN server is allowed to allocate
 | 
						|
for the sessions, combined (input and output network streams are treated
 | 
						|
separately).
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-static\-auth\-secret\fP
 | 
						|
Static authentication secret value (a string) for TURN REST API only.
 | 
						|
If not set, then the turn server will try to use the dynamic value 
 | 
						|
in turn_secret table in user database (if present). The database\-stored
 | 
						|
value can be changed on\-the\-fly by a separate program, so this is why
 | 
						|
that other mode is dynamic. Multiple shared secrets can be used
 | 
						|
(both in the database and in the "static" fashion).
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-server\-name\fP
 | 
						|
Server name used for
 | 
						|
the oAuth authentication purposes.
 | 
						|
The default value is the realm name.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-cert\fP
 | 
						|
Certificate file, PEM format. Same file 
 | 
						|
search rules applied as for the configuration 
 | 
						|
file. If both \fB\-\-no\-tls\fP and \fB\-\-no\-dtls\fP \fIoptions\fP 
 | 
						|
are specified, then this parameter is not needed.
 | 
						|
Default value is turn_server_cert.pem.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-pkey\fP
 | 
						|
Private key file, PEM format. Same file 
 | 
						|
search rules applied as for the configuration 
 | 
						|
file. If both \fB\-\-no\-tls\fP and \fB\-\-no\-dtls\fP \fIoptions\fP 
 | 
						|
are specified, then this parameter is not needed.
 | 
						|
Default value is turn_server_pkey.pem.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-pkey\-pwd\fP
 | 
						|
If the private key file is encrypted, then this password to be used.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-cipher\-list\fP
 | 
						|
Allowed OpenSSL cipher list for TLS/DTLS connections.
 | 
						|
Default value is "DEFAULT".
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-CA\-file\fP
 | 
						|
CA file in OpenSSL format. 
 | 
						|
Forces TURN server to verify the client SSL certificates.
 | 
						|
By default, no CA is set and no client certificate check is performed.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-ec\-curve\-name\fP
 | 
						|
Curve name for EC ciphers, if supported by OpenSSL 
 | 
						|
library (TLS and DTLS). The default value is prime256v1, 
 | 
						|
if pre\-OpenSSL 1.0.2 is used. With OpenSSL 1.0.2+,
 | 
						|
an optimal curve will be automatically calculated, if not defined
 | 
						|
by this option.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-dh\-file\fP
 | 
						|
Use custom DH TLS key, stored in PEM format in the file.
 | 
						|
Flags \fB\-\-dh566\fP and \fB\-\-dh2066\fP are ignored when the DH key is taken from a file.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-l\fP, \fB\-\-log\-file\fP
 | 
						|
Option to set the full path name of the log file.
 | 
						|
By default, the \fIturnserver\fP tries to open a log file in 
 | 
						|
/var/log/\fIturnserver\fP, /var/log, /var/tmp, /tmp and . (current) 
 | 
						|
directories (which file open operation succeeds 
 | 
						|
first that file will be used). With this option you can set the 
 | 
						|
definite log file name.
 | 
						|
The special names are "stdout" and "\-" \- they will force everything 
 | 
						|
to the stdout. Also, "syslog" name will redirect everything into
 | 
						|
the system log (syslog), as if the option "\fB\-\-syslog\fP" was set. 
 | 
						|
In the runtime, the logfile can be reset with the SIGHUP signal 
 | 
						|
to the \fIturnserver\fP process.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-alternate\-server\fP
 | 
						|
Option to set the "redirection" mode. The value of this option
 | 
						|
will be the address of the alternate server for UDP & TCP service in form of 
 | 
						|
<ip>[:<port>]. The server will send this value in the attribute
 | 
						|
ALTERNATE\-SERVER, with error 300, on ALLOCATE request, to the client.
 | 
						|
Client will receive only values with the same address family
 | 
						|
as the client network endpoint address family. 
 | 
						|
See RFC 5389 and RFC 5766 for ALTERNATE\-SERVER functionality description. 
 | 
						|
The client must use the obtained value for subsequent TURN communications.
 | 
						|
If more than one \fB\-\-alternate\-server\fP \fIoptions\fP are provided, then the functionality
 | 
						|
can be more accurately described as "load\-balancing" than a mere "redirection". 
 | 
						|
If the port number is omitted, then the default port 
 | 
						|
number 3478 for the UDP/TCP protocols will be used.
 | 
						|
Colon (:) characters in IPv6 addresses may conflict with the syntax of 
 | 
						|
the option. To alleviate this conflict, literal IPv6 addresses are enclosed 
 | 
						|
in square brackets in such resource identifiers, for example: 
 | 
						|
[2001:db8:85a3:8d3:1319:8a2e:370:7348]:3478 . 
 | 
						|
Multiple alternate servers can be set. They will be used in the
 | 
						|
round\-robin manner. All servers in the pool are considered of equal weight and 
 | 
						|
the load will be distributed equally. For example, if we have 4 alternate servers, 
 | 
						|
then each server will receive 25% of ALLOCATE requests. An alternate TURN server 
 | 
						|
address can be used more than one time with the alternate\-server option, so this 
 | 
						|
can emulate "weighting" of the servers. 
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-tls\-alternate\-server\fP
 | 
						|
Option to set alternative server for TLS & DTLS services in form of 
 | 
						|
<ip>:<port>. If the port number is omitted, then the default port 
 | 
						|
number 5349 for the TLS/DTLS protocols will be used. See the 
 | 
						|
previous option for the functionality description.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-O\fP, \fB\-\-redis\-statsdb\fP
 | 
						|
Redis status and statistics database connection string, if used (default \- empty, 
 | 
						|
no Redis stats DB used). This database keeps allocations status information, and it can 
 | 
						|
be also used for publishing and delivering traffic and allocation event notifications.
 | 
						|
This database option can be used independently of \fB\-\-redis\-userdb\fP option,
 | 
						|
and actually Redis can be used for status/statistics and SQLite or MySQL or MongoDB or 
 | 
						|
PostgreSQL can be used for the user database.
 | 
						|
The connection string has the same parameters as redis\-userdb connection string.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-max\-allocate\-timeout\fP
 | 
						|
Max time, in seconds, allowed for full allocation establishment. 
 | 
						|
Default is 60 seconds.
 | 
						|
.PP
 | 
						|
\fB\-\-denied\-peer\-ip\fP=<IPaddr[\fB\-IPaddr\fP]>
 | 
						|
.PP
 | 
						|
\fB\-\-allowed\-peer\-ip\fP=<IPaddr[\fB\-IPaddr\fP]> Options to ban or allow specific ip addresses or ranges 
 | 
						|
of ip addresses. If an ip address is specified as both allowed and denied, then 
 | 
						|
the ip address is considered to be allowed. This is useful when you wish to ban
 | 
						|
a range of ip addresses, except for a few specific ips within that range.
 | 
						|
This can be used when you do not want users of the turn server to be able to access
 | 
						|
machines reachable by the turn server, but would otherwise be unreachable from the 
 | 
						|
internet (e.g. when the turn server is sitting behind a NAT). The 'white" and "black" peer 
 | 
						|
IP ranges can also be dynamically changed in the database. 
 | 
						|
The allowed/denied addresses (white/black lists) rules are very simple:
 | 
						|
.RS
 | 
						|
.IP 1) 4
 | 
						|
If there is no rule for an address, then it is allowed;
 | 
						|
.IP 2) 4
 | 
						|
If there is an "allowed" rule that fits the address then it is allowed \- no matter what;
 | 
						|
.IP 3) 4
 | 
						|
If there is no "allowed" rule that fits the address, and if there is a "denied" rule that
 | 
						|
fits the address, then it is denied.
 | 
						|
.RE
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-pidfile\fP
 | 
						|
File name to store the pid of the process.
 | 
						|
Default is /var/run/turnserver.pid (if superuser account is used) or
 | 
						|
/var/tmp/turnserver.pid .
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-proc\-user\fP
 | 
						|
User name to run the process. After the initialization, the \fIturnserver\fP process
 | 
						|
will make an attempt to change the current user ID to that user.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-proc\-group\fP
 | 
						|
Group name to run the process. After the initialization, the \fIturnserver\fP process
 | 
						|
will make an attempt to change the current group ID to that group.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-K\fP, \fB\-\-keep\-address\-family\fP
 | 
						|
TURN server allocates address family according TURN
 | 
						|
Client <=> Server communication address family.
 | 
						|
!! It breaks RFC6156 section\-4.2 (violates default IPv4) !!
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-cli\-ip\fP
 | 
						|
Local system IP address to be used for CLI management interface.
 | 
						|
The \fIturnserver\fP process can be accessed for management with telnet,
 | 
						|
at this IP address and on the CLI port (see the next parameter). 
 | 
						|
Default value is 127.0.0.1. You can use telnet or putty (in telnet mode)
 | 
						|
to access the CLI management interface. 
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-cli\-port\fP
 | 
						|
CLI management interface listening port. Default is 5766.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-cli\-password\fP
 | 
						|
CLI access password. Default is empty (no password).
 | 
						|
For the security reasons, it is recommended to use the encrypted
 | 
						|
form of the password (see the \fB\-P\fP command in the \fIturnadmin\fP
 | 
						|
utility). The dollar signs in the encrypted form must be escaped.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-cli\-max\-output\-sessions\fP
 | 
						|
Maximum number of output sessions in ps CLI command.
 | 
						|
This value can be changed on\-the\-fly in CLI. The default value is 256.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-web\-admin\fP
 | 
						|
Enable Turn Web\-admin support. By default it is disabled.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-web\-admin\-ip\fP=<IP>
 | 
						|
Local system IP address to be used for Web\-admin server endpoint. Default value is 127.0.0.1.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-web\-admin\-port\fP=<port>
 | 
						|
Web\-admin server port. Default is 8080.
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-web\-admin\-listen\-on\-workers\fP
 | 
						|
Enable for web\-admin server to listens on STUN/TURN workers STUN/TURN ports.
 | 
						|
By default it is disabled for security resons!
 | 
						|
(This behavior used to be the default behavior, and was enabled by default.)
 | 
						|
.TP
 | 
						|
.B
 | 
						|
\fB\-\-ne\fP=[1|2|3]
 | 
						|
Set network engine type for the process (for internal purposes).
 | 
						|
.PP
 | 
						|
==================================
 | 
						|
.SH LOAD BALANCE AND PERFORMANCE TUNING
 | 
						|
 | 
						|
This topic is covered in the wiki page:
 | 
						|
.PP
 | 
						|
https://github.com/coturn/coturn/wiki/turn_performance_and_load_balance
 | 
						|
.PP
 | 
						|
===================================
 | 
						|
.SH WEBRTC USAGE
 | 
						|
 | 
						|
This is a set of notes for the WebRTC users:
 | 
						|
.IP 1) 4
 | 
						|
WebRTC uses long\-term authentication mechanism, so you have to use \fB\-a\fP
 | 
						|
option (or \fB\-\-lt\-cred\-mech\fP). WebRTC relaying will not work with anonymous
 | 
						|
access. With \fB\-a\fP option, do not forget to set the 
 | 
						|
default realm (\fB\-r\fP option). You will also have to set up the user accounts, 
 | 
						|
for that you have a number of \fIoptions\fP:
 | 
						|
.PP
 | 
						|
.nf
 | 
						|
.fam C
 | 
						|
        a) command\-line options (\-u).
 | 
						|
 | 
						|
        b) a database table (SQLite or PostgreSQL or MySQL or MongoDB). You will have to 
 | 
						|
        set keys with turnadmin utility (see docs and wiki for turnadmin). 
 | 
						|
        You cannot use open passwords in the database.
 | 
						|
 | 
						|
        c) Redis key/value pair(s), if Redis is used. You key use either keys or 
 | 
						|
        open passwords with Redis; see turndb/testredisdbsetup.sh file.  
 | 
						|
 | 
						|
        d) You also can use the TURN REST API. You will need shared secret(s) set
 | 
						|
        either  through the command line option, or through the config file, or through
 | 
						|
        the database table or Redis key/value pairs.  
 | 
						|
 | 
						|
.fam T
 | 
						|
.fi
 | 
						|
.IP 2) 4
 | 
						|
Usually WebRTC uses fingerprinting (\fB\-f\fP).
 | 
						|
.IP 3) 4
 | 
						|
\fB\-v\fP option may be nice to see the connected clients.
 | 
						|
.IP 4) 4
 | 
						|
\fB\-X\fP is needed if you are running your TURN server behind a NAT.
 | 
						|
.IP 5) 4
 | 
						|
\fB\-\-min\-port\fP and \fB\-\-max\-port\fP may be needed if you want to limit the relay endpoints ports
 | 
						|
number range.
 | 
						|
.PP
 | 
						|
===================================
 | 
						|
.SH TURN REST API
 | 
						|
 | 
						|
In WebRTC, the browser obtains the TURN connection information from the web
 | 
						|
server. This information is a secure information \- because it contains the 
 | 
						|
necessary TURN credentials. As these credentials are transmitted over the 
 | 
						|
public networks, we have a potential security breach.
 | 
						|
.PP
 | 
						|
If we have to transmit a valuable information over the public network, 
 | 
						|
then this information has to have a limited lifetime. Then the guy who 
 | 
						|
obtains this information without permission will be able to perform 
 | 
						|
only limited damage.
 | 
						|
.PP
 | 
						|
This is how the idea of TURN REST API \- time\-limited TURN credentials \- 
 | 
						|
appeared. This security mechanism is based upon the long\-term credentials 
 | 
						|
mechanism. The main idea of the REST API is that the web server provides 
 | 
						|
the credentials to the client, but those credentials can be used only 
 | 
						|
limited time by an application that has to create a TURN server connection.
 | 
						|
.PP
 | 
						|
The "classic" long\-term credentials mechanism (LTCM) is described here:
 | 
						|
.PP
 | 
						|
http://tools.ietf.org/html/rfc5389#section\-10.2
 | 
						|
.PP
 | 
						|
http://tools.ietf.org/html/rfc5389#section\-15.4
 | 
						|
.PP
 | 
						|
For authentication, each user must know two things: the username and the
 | 
						|
password. Optionally, the user must supply the ORIGIN value, so that the
 | 
						|
server can figure out the realm to be used for the user. The nonce and 
 | 
						|
the realm values are supplied by the TURN server. But LTCM is not saying 
 | 
						|
anything about the nature and about the persistence of the username and 
 | 
						|
of the password; and this is used by the REST API.
 | 
						|
.PP
 | 
						|
In the TURN REST API, there is no persistent passwords for users. A user has 
 | 
						|
just the username. The password is always temporary, and it is generated by 
 | 
						|
the web server on\-demand, when the user accesses the WebRTC page. And, 
 | 
						|
actually, a temporary one\-time session only, username is provided to the user, 
 | 
						|
too. 
 | 
						|
.PP
 | 
						|
The temporary user is generated as:
 | 
						|
.PP
 | 
						|
temporary\-username="timestamp" + ":" + "username"
 | 
						|
.PP
 | 
						|
where username is the persistent user name, and the timestamp format is just 
 | 
						|
seconds since 1970 \- the same value as \fBtime\fP(NULL) function returns.
 | 
						|
.PP
 | 
						|
The temporary password is obtained as HMAC\-SHA1 function over the temporary
 | 
						|
username, with shared secret as the HMAC key, and then the result is encoded:
 | 
						|
.PP
 | 
						|
temporary\-password = \fBbase64_encode\fP(hmac\-sha1(shared\-secret, temporary\-username))
 | 
						|
.PP
 | 
						|
Both the TURN server and the web server know the same shared secret. How the
 | 
						|
shared secret is distributed among the involved entities is left to the WebRTC
 | 
						|
deployment details \- this is beyond the scope of the TURN REST API.
 | 
						|
.PP
 | 
						|
So, a timestamp is used for the temporary password calculation, and this 
 | 
						|
timestamp can be retrieved from the temporary username. This information
 | 
						|
is valuable, but only temporary, while the timestamp is not expired. Without
 | 
						|
knowledge of the shared secret, a new temporary password cannot be generated.
 | 
						|
.PP
 | 
						|
This is all formally described in Justin's Uberti TURN REST API document
 | 
						|
that can be obtained following the link "TURN REST API" in the \fBTURN Server\fP
 | 
						|
project's page https://github.com/coturn/coturn/.
 | 
						|
.PP
 | 
						|
Once the temporary username and password are obtained by the client (browser)
 | 
						|
application, then the rest is just 'classic" long\-term credentials mechanism.
 | 
						|
For developers, we are going to describe it step\-by\-step below:
 | 
						|
.RS
 | 
						|
.IP \(bu 3
 | 
						|
a new TURN client sends a request command to the TURN server. Optionally,
 | 
						|
it adds the ORIGIN field to it. 
 | 
						|
.IP \(bu 3
 | 
						|
TURN server sees that this is a new client and the message is not
 | 
						|
authenticated.
 | 
						|
.IP \(bu 3
 | 
						|
the TURN server generates a random nonce string, and return the
 | 
						|
error 401 to the client, with nonce and realm included. If the ORIGIN
 | 
						|
field was present in the client request, it may affect the realm value
 | 
						|
that the server chooses for the client.
 | 
						|
.IP \(bu 3
 | 
						|
the client sees the 401 error and it extracts two values from
 | 
						|
the error response: the nonce and the realm.
 | 
						|
.IP \(bu 3
 | 
						|
the client uses username, realm and password to produce a key:
 | 
						|
.PP
 | 
						|
.nf
 | 
						|
.fam C
 | 
						|
         key = MD5(username ":" realm ":" SASLprep(password))
 | 
						|
.fam T
 | 
						|
.fi
 | 
						|
(SASLprep is described here: http://tools.ietf.org/html/rfc4013)
 | 
						|
.IP \(bu 3
 | 
						|
the client forms a new request, adds username, realm and nonce to the
 | 
						|
request. Then, the client calculates and adds the integrity field to 
 | 
						|
the request. This is the trickiest part of the process, and it is
 | 
						|
described in the end of section 15.4: 
 | 
						|
http://tools.ietf.org/html/rfc5389#section\-15.4
 | 
						|
.IP \(bu 3
 | 
						|
the client, optionally, adds the fingerprint field. This may be also
 | 
						|
a tricky procedure, described in section 15.5 of the same document. 
 | 
						|
WebRTC usually uses fingerprinted TURN messages.
 | 
						|
.IP \(bu 3
 | 
						|
the TURN server receives the request, reads the username.
 | 
						|
.IP \(bu 3
 | 
						|
then the TURN server checks that the nonce and the realm in the request
 | 
						|
are the valid ones.
 | 
						|
.IP \(bu 3
 | 
						|
then the TURN server calculates the key.
 | 
						|
.IP \(bu 3
 | 
						|
then the TURN server calculates the integrity field.
 | 
						|
.IP \(bu 3
 | 
						|
then the TURN server compares the calculated integrity field with the
 | 
						|
received one \- they must be the same. If the integrity fields differ, 
 | 
						|
then the request is rejected.
 | 
						|
.RE
 | 
						|
.PP
 | 
						|
In subsequent communications, the client may go with exactly the same 
 | 
						|
sequence, but for optimization usually the client, having already 
 | 
						|
information about realm and nonce, pre\-calculates the integrity string 
 | 
						|
for each request, so that the 401 error response becomes unnecessary. 
 | 
						|
The TURN server may use "\fB\-\-stale\-nonce\fP" option for extra security: in 
 | 
						|
some time, the nonce expires and the client will obtain 438 error response
 | 
						|
with the new nonce, and the client will have to start using the new nonce.
 | 
						|
.PP
 | 
						|
In subsequent communications, the server and the client will always assume 
 | 
						|
the same password \- the original password becomes the session parameter and 
 | 
						|
is never expiring. So the password is not changing while the session is valid
 | 
						|
and unexpired. So, if the session is properly maintained, it may go forever, 
 | 
						|
even if the user password has been already changed (in the database). The 
 | 
						|
session simply is using the old password. Once the session got disconnected, 
 | 
						|
the client will have to use the new password to re\-connect (if the password 
 | 
						|
has been changed).
 | 
						|
.PP
 | 
						|
An example when a new shared secret is generated every hour by the TURN server
 | 
						|
box and then supplied to the web server, remotely, is provided in the script
 | 
						|
examples/scripts/restapi/shared_secret_maintainer.pl .
 | 
						|
.PP
 | 
						|
A very important thing is that the nonce must be totally random and it must be 
 | 
						|
different for different clients and different sessions. 
 | 
						|
.PP
 | 
						|
===================================
 | 
						|
.SH DATABASES
 | 
						|
 | 
						|
For the user database, the \fIturnserver\fP has the following \fIoptions\fP:
 | 
						|
.IP 1) 4
 | 
						|
Users can be set in the command line, with multiple \fB\-u\fP or \fB\-\-user\fP \fIoptions\fP.
 | 
						|
Obviously, only a few users can be set that way, and their credentials are fixed 
 | 
						|
for the \fIturnserver\fP process lifetime.
 | 
						|
.IP 2) 4
 | 
						|
Users can be stored in SQLite DB. The default SQLite database file is /var/db/turndb
 | 
						|
or /usr/local/var/db/turndb or /var/lib/turn/turndb.
 | 
						|
.IP 3) 4
 | 
						|
Users can be stored in PostgreSQL database, if the \fIturnserver\fP was compiled with PostgreSQL
 | 
						|
support. Each time \fIturnserver\fP checks user credentials, it reads the database (asynchronously,
 | 
						|
of course, so that the current flow of packets is not delayed in any way), so any change in the 
 | 
						|
database content is immediately visible by the \fIturnserver\fP. This is the way if you need the 
 | 
						|
best scalability. The schema for the database can be found in schema.sql file.
 | 
						|
For long\-term credentials, you have to set the "keys" for the users; the "keys" are generated 
 | 
						|
by the \fIturnadmin\fP utility. For the key generation, you need username, password and the realm. 
 | 
						|
All users in the database must use the same realm value; if down the road you will decide 
 | 
						|
to change the realm name, then you will have to re\-generate all user keys (that can be done 
 | 
						|
in a batch script). See the file turndb/testsqldbsetup.sql as an example.
 | 
						|
.IP 4) 4
 | 
						|
The same is true for MySQL database. The same schema file is applicable.
 | 
						|
The same considerations are applicable. 
 | 
						|
.IP 5) 4
 | 
						|
The same is true for the Redis database, but the Redis database has aa different schema \-
 | 
						|
it can be found (in the form of explanation) in schema.userdb.redis. 
 | 
						|
Also, in Redis you can store both "keys" and open passwords (for long term credentials) \- 
 | 
						|
the "open password" option is less secure but more convenient for low\-security environments. 
 | 
						|
See the file turndb/testredisdbsetup.sh as an example. 
 | 
						|
.IP 6) 4
 | 
						|
If a database is used, then users can be divided into multiple independent realms. Each realm
 | 
						|
can be administered separately, and each realm can have its own set of users and its own
 | 
						|
performance \fIoptions\fP (max\-bps, user\-quota, total\-quota).
 | 
						|
.IP 7) 4
 | 
						|
If you use MongoDB, the database will be setup for you automatically.
 | 
						|
.IP 8) 4
 | 
						|
Of course, the \fIturnserver\fP can be used in non\-secure mode, when users are allowed to establish
 | 
						|
sessions anonymously. But in most cases (like WebRTC) that will not work.
 | 
						|
.PP
 | 
						|
For the status and statistics database, there are two choices:
 | 
						|
.IP 1) 4
 | 
						|
The simplest choice is not to use it. Do not set \fB\-\-redis\-statsdb\fP option, and this functionality
 | 
						|
will be simply ignored.
 | 
						|
.IP 2) 4
 | 
						|
If you choose to use it, then set the \fB\-\-redis\-statsdb\fP option. This may be the same database
 | 
						|
as in \fB\-\-redis\-userdb\fP option, or it may be a different database. You may want to use different 
 | 
						|
database for security or convenience reasons. Also, you can use different database management
 | 
						|
systems for the user database and for the ststus and statistics database. For example, you can use 
 | 
						|
MySQL as the user database, and you can use redis for the statistics. Or you can use Redis for both.
 | 
						|
.PP
 | 
						|
So, we have 6 choices for the user management, and 2 choices for the statistics management. These
 | 
						|
two are totally independent. So, you have overall 6*2=12 ways to handle persistent information, 
 | 
						|
choose any for your convenience.
 | 
						|
.PP
 | 
						|
You do not have to handle the database information "manually" \- the \fIturnadmin\fP program can handle 
 | 
						|
everything for you. For PostgreSQL and MySQL you will just have to create an empty database
 | 
						|
with schema.sql SQL script. With Redis, you do not have to do even that \- just run \fIturnadmin\fP and 
 | 
						|
it will set the users for you (see the \fIturnadmin\fP manuals). If you are using SQLite, then the 
 | 
						|
\fIturnserver\fP or \fIturnadmin\fP will initialize the empty database, for you, when started. The 
 | 
						|
TURN server installation process creates an empty initialized SQLite database in the default 
 | 
						|
location (/var/db/turndb or /usr/local/var/db/turndb or /var/lib/turn/turndb, depending on the system).
 | 
						|
.PP
 | 
						|
=================================
 | 
						|
.SH ALPN
 | 
						|
 | 
						|
The server supports ALPNs "stun.turn" and "stun.nat\-discovery", when
 | 
						|
compiled with OpenSSL 1.0.2 or newer. If the server receives a TLS/DTLS
 | 
						|
ClientHello message that contains one or both of those ALPNs, then the
 | 
						|
server chooses the first stun.* label and sends it back (in the ServerHello)
 | 
						|
in the ALPN extension field. If no stun.* label is found, then the server
 | 
						|
does not include the ALPN information into the ServerHello.
 | 
						|
.PP
 | 
						|
=================================
 | 
						|
.SH LIBRARIES
 | 
						|
 | 
						|
In the lib/ sub\-directory the build process will create TURN client messaging library.
 | 
						|
In the include/ sub\-directory, the necessary include files will be placed.
 | 
						|
The C++ wrapper for the messaging functionality is located in TurnMsgLib.h header.
 | 
						|
An example of C++ code can be found in stunclient.c file. 
 | 
						|
.PP
 | 
						|
=================================
 | 
						|
.SH DOCS
 | 
						|
 | 
						|
After installation, run the command:
 | 
						|
.PP
 | 
						|
$ man \fIturnserver\fP
 | 
						|
.PP
 | 
						|
or in the project root directory:
 | 
						|
.PP
 | 
						|
$ man \fB\-M\fP man \fIturnserver\fP
 | 
						|
.PP
 | 
						|
to see the man page.
 | 
						|
.PP
 | 
						|
In the docs/html subdirectory of the original archive tree, you will find the client library 
 | 
						|
reference. After the installation, it will be placed in PREFIX/share/doc/\fIturnserver\fP/html.
 | 
						|
.PP
 | 
						|
=================================
 | 
						|
.SH LOGS
 | 
						|
 | 
						|
When the \fBTURN Server\fP starts, it makes efforts to create a log file turn_<pid>.log 
 | 
						|
in the following directories:
 | 
						|
.RS
 | 
						|
.IP \(bu 3
 | 
						|
/var/log
 | 
						|
.IP \(bu 3
 | 
						|
/log/
 | 
						|
.IP \(bu 3
 | 
						|
/var/tmp
 | 
						|
.IP \(bu 3
 | 
						|
/tmp
 | 
						|
.IP \(bu 3
 | 
						|
current directory
 | 
						|
.RE
 | 
						|
.PP
 | 
						|
If all efforts failed (due to the system permission settings) then all 
 | 
						|
log messages are sent only to the standard output of the process.
 | 
						|
.PP
 | 
						|
This behavior can be controlled by \fB\-\-log\-file\fP, \fB\-\-syslog\fP and \fB\-\-no\-stdout\-log\fP
 | 
						|
\fIoptions\fP.
 | 
						|
.PP
 | 
						|
=================================
 | 
						|
.SH HTTPS MANAGEMENT INTERFACE
 | 
						|
 | 
						|
The \fIturnserver\fP process provides an HTTPS Web access as statistics and basic
 | 
						|
management interface. The \fIturnserver\fP listens to incoming HTTPS admin 
 | 
						|
connections on the same ports as the main TURN/STUN listener. The Web admin
 | 
						|
pages are basic and self\-explanatory.
 | 
						|
.PP
 | 
						|
To make the HTTPS interface active, the database table admin_user must be
 | 
						|
populated with the admin user \fBaccount\fP(s). An admin user can be a superuser
 | 
						|
(if not assigned to a particular realm) or a restricted user (if assigned to
 | 
						|
a realm). The restricted admin users can perform only limited actions, within
 | 
						|
their corresponding realms.
 | 
						|
.PP
 | 
						|
=================================
 | 
						|
.SH TELNET CLI
 | 
						|
 | 
						|
The \fIturnserver\fP process provides a telnet CLI access as statistics and basic management
 | 
						|
interface. By default, the \fIturnserver\fP starts a telnet CLI listener on IP 127.0.0.1 and
 | 
						|
port 5766. That can be changed by the command\-cline \fIoptions\fP of the \fIturnserver\fP process
 | 
						|
(see \fB\-\-cli\-ip\fP and \fB\-\-cli\-port\fP \fIoptions\fP). The full list of telnet CLI commands is provided
 | 
						|
in "help" command output in the telnet CLI.
 | 
						|
.PP
 | 
						|
=================================
 | 
						|
.SH CLUSTERS
 | 
						|
 | 
						|
\fBTURN Server\fP can be a part of the cluster installation. But, to support the "even port" functionality 
 | 
						|
(RTP/RTCP streams pairs) the client requests from a particular IP must be delivered to the same 
 | 
						|
\fBTURN Server\fP instance, so it requires some networking setup massaging for the cluster. The reason is that 
 | 
						|
the RTP and RTCP relaying endpoints must be allocated on the same relay IP. It would be possible 
 | 
						|
to design a scheme with the application\-level requests forwarding (and we may do that later) but 
 | 
						|
it would affect the performance.
 | 
						|
.PP
 | 
						|
=================================
 | 
						|
.SH FILES
 | 
						|
 | 
						|
/etc/turnserver.conf
 | 
						|
.PP
 | 
						|
/var/db/turndb
 | 
						|
.PP
 | 
						|
/usr/local/var/db/turndb
 | 
						|
.PP
 | 
						|
/var/lib/turn/turndb
 | 
						|
.PP
 | 
						|
/usr/local/etc/turnserver.conf
 | 
						|
.PP
 | 
						|
=================================
 | 
						|
.SH DIRECTORIES
 | 
						|
 | 
						|
/usr/local/share/\fIturnserver\fP
 | 
						|
.PP
 | 
						|
/usr/local/share/doc/\fIturnserver\fP
 | 
						|
.PP
 | 
						|
/usr/local/share/examples/\fIturnserver\fP
 | 
						|
.PP
 | 
						|
=================================
 | 
						|
.SH STANDARDS
 | 
						|
 | 
						|
obsolete STUN RFC 3489
 | 
						|
.PP
 | 
						|
new STUN RFC 5389
 | 
						|
.PP
 | 
						|
TURN RFC 5766
 | 
						|
.PP
 | 
						|
TURN\-TCP extension RFC 6062
 | 
						|
.PP
 | 
						|
TURN IPv6 extension RFC 6156
 | 
						|
.PP
 | 
						|
STUN/TURN test vectors RFC 5769
 | 
						|
.PP
 | 
						|
STUN NAT behavior discovery RFC 5780
 | 
						|
.PP
 | 
						|
=================================
 | 
						|
.SH SEE ALSO
 | 
						|
 | 
						|
\fIturnadmin\fP, \fIturnutils\fP
 | 
						|
.RE
 | 
						|
.PP
 | 
						|
======================================
 | 
						|
.SS  WEB RESOURCES
 | 
						|
 | 
						|
project page:
 | 
						|
.PP
 | 
						|
https://github.com/coturn/coturn/
 | 
						|
.PP
 | 
						|
Wiki page:
 | 
						|
.PP
 | 
						|
https://github.com/coturn/coturn/wiki
 | 
						|
.PP
 | 
						|
forum:
 | 
						|
.PP
 | 
						|
https://groups.google.com/forum/?fromgroups=#!forum/turn\-server\-project\-rfc5766\-turn\-server
 | 
						|
.PP
 | 
						|
======================================
 | 
						|
.SS  AUTHORS
 | 
						|
 | 
						|
Oleg Moskalenko <mom040267@gmail.com>
 | 
						|
.PP
 | 
						|
Gabor Kovesdan http://kovesdan.org/
 | 
						|
.PP
 | 
						|
Daniel Pocock http://danielpocock.com/
 | 
						|
.PP
 | 
						|
John Selbie (jselbie@gmail.com)
 | 
						|
.PP
 | 
						|
Lee Sylvester <lee@designrealm.co.uk>
 | 
						|
.PP
 | 
						|
Erik Johnston <erikj@openmarket.com>
 | 
						|
.PP
 | 
						|
Roman Lisagor <roman@demonware.net>
 | 
						|
.PP
 | 
						|
Vladimir Tsanev <tsachev@gmail.com>
 | 
						|
.PP
 | 
						|
Po\-sheng Lin <personlin118@gmail.com>
 | 
						|
.PP
 | 
						|
Peter Dunkley <peter.dunkley@acision.com>
 | 
						|
.PP
 | 
						|
Mutsutoshi Yoshimoto <mutsutoshi.yoshimoto@mixi.co.jp>
 | 
						|
.PP
 | 
						|
Federico Pinna <fpinna@vivocha.com>
 | 
						|
.PP
 | 
						|
Bradley T. Hughes <bradleythughes@fastmail.fm>
 | 
						|
.PP
 | 
						|
Mihaly Meszaros <misi@majd.eu>
 |