151 lines
		
	
	
	
		
			6.6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
	
		
			6.6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
This is the protocol documentation for tinc, a Virtual Private Network daemon.
 | 
						|
 | 
						|
   Copyright 2000-2006 Guus Sliepen <guus@tinc-vpn.org>,
 | 
						|
             2000-2005 Ivo Timmmermans
 | 
						|
 | 
						|
   Permission is granted to make and distribute verbatim copies of
 | 
						|
   this documentation provided the copyright notice and this
 | 
						|
   permission notice are preserved on all copies.
 | 
						|
 | 
						|
   Permission is granted to copy and distribute modified versions of
 | 
						|
   this documentation under the conditions for verbatim copying,
 | 
						|
   provided that the entire resulting derived work is distributed
 | 
						|
   under the terms of a permission notice identical to this one.
 | 
						|
 | 
						|
   $Id$
 | 
						|
 | 
						|
 | 
						|
1.  Protocols used in tinc
 | 
						|
-------------------------
 | 
						|
 | 
						|
tinc uses several protocols to function correctly.  To enter the
 | 
						|
network of tinc daemons that make up the virtual private network, tinc
 | 
						|
makes TCP connections to other tinc daemons.  It uses the "meta
 | 
						|
protocol" for these connections.  To exchange packets on the virtual
 | 
						|
network, UDP connections are made and the "packet protocol" is used.
 | 
						|
Tinc also needs to exchange network packets with the kernel.  This is
 | 
						|
done using the ethertap device or the universal TUN/TAP device that
 | 
						|
can be found in various UNIX flavours.
 | 
						|
 | 
						|
2.  Packet protocol
 | 
						|
------------------
 | 
						|
 | 
						|
Normal packets are sent without any state information, so the layout
 | 
						|
is pretty basic.
 | 
						|
 | 
						|
A data packet can only be sent if the encryption key, cipher and digest are
 | 
						|
known to both parties, and the connection is activated. If the encryption key
 | 
						|
is not known, a request is sent to the destination using the meta connection to
 | 
						|
retreive it.
 | 
						|
 | 
						|
0   1   2   3   4   5   6   7   ...   97  98  99  100
 | 
						|
|     seqno     |         data        |     MAC       |
 | 
						|
\____________________________________/\_______________/
 | 
						|
                 |                           |
 | 
						|
  encrypted using symmetric cipher         digest
 | 
						|
 | 
						|
The sequence number prevents replay attacks, the message authentication code
 | 
						|
prevents altered packets from being accepted.
 | 
						|
 | 
						|
3.  Meta protocol
 | 
						|
----------------
 | 
						|
 | 
						|
The meta protocol is used to tie all tinc daemons together, and
 | 
						|
exchange information about which tinc daemon serves which virtual
 | 
						|
subnet.
 | 
						|
 | 
						|
The meta protocol consists of requests that can be sent to the other
 | 
						|
side.  Each request has a unique number and several parameters.  All
 | 
						|
requests are represented in the standard ASCII character set.  It is
 | 
						|
possible to use tools such as telnet or netcat to connect to a tinc
 | 
						|
daemon and to read and write requests by hand, provided that one
 | 
						|
understands the numeric codes sent.
 | 
						|
 | 
						|
The authentication scheme is described in the SECURITY2 file. After a
 | 
						|
succesful authentication, the server and the client will exchange all the
 | 
						|
information about other tinc daemons and subnets they know of, so that both
 | 
						|
sides (and all the other tinc daemons behind them) have their information
 | 
						|
synchronised.
 | 
						|
 | 
						|
daemon	message
 | 
						|
--------------------------------------------------------------------------
 | 
						|
origin	ADD_EDGE node1 node2 21.32.43.54 655 222 0
 | 
						|
                   |     |        |       |   |  +-> options
 | 
						|
                   |     |        |       |   +----> weight
 | 
						|
		           |     |        |       +--------> UDP port of node2
 | 
						|
		           |     |        +----------------> real address of node2
 | 
						|
		           |     +-------------------------> name of destination node
 | 
						|
                   +-------------------------------> name of source node
 | 
						|
 | 
						|
origin	ADD_SUBNET node 192.168.1.0/24
 | 
						|
                     |         |     +--> prefixlength
 | 
						|
                     |         +--------> network address
 | 
						|
                     +------------------> owner of this subnet
 | 
						|
--------------------------------------------------------------------------
 | 
						|
 | 
						|
The ADD_EDGE messages are to inform other tinc daemons that a connection between
 | 
						|
two nodes exist. The address of the destination node is available so that
 | 
						|
VPN packets can be sent directly to that node.
 | 
						|
 | 
						|
The ADD_SUBNET messages inform other tinc daemons that certain subnets belong
 | 
						|
to certain nodes. tinc will use it to determine to which node a VPN packet has
 | 
						|
to be sent.
 | 
						|
 | 
						|
message
 | 
						|
------------------------------------------------------------------
 | 
						|
DEL_EDGE node1 node2
 | 
						|
		   |     +----> name of destination node
 | 
						|
           +----------> name of source node
 | 
						|
 | 
						|
DEL_SUBNET node 192.168.1.0/24
 | 
						|
             |         |     +--> prefixlength
 | 
						|
             |         +--------> network address
 | 
						|
             +------------------> owner of this subnet
 | 
						|
------------------------------------------------------------------
 | 
						|
 | 
						|
In case a connection between two daemons is closed or broken, DEL_EDGE messages
 | 
						|
are sent to inform the other daemons of that fact. Each daemon will calculate a
 | 
						|
new route to the the daemons, or mark them unreachable if there isn't any.
 | 
						|
 | 
						|
message
 | 
						|
------------------------------------------------------------------
 | 
						|
REQ_KEY origin destination
 | 
						|
           |       +--> name of the tinc daemon it wants the key from
 | 
						|
           +----------> name of the daemon that wants the key      
 | 
						|
 | 
						|
ANS_KEY origin destination 4ae0b0a82d6e0078 91 64 4
 | 
						|
           |       |       \______________/ |  |  +--> MAC length
 | 
						|
           |       |               |        |  +-----> digest algorithm
 | 
						|
           |       |               |        +--------> cipher algorithm
 | 
						|
           |       |               +--> 128 bits key
 | 
						|
           |       +--> name of the daemon that wants the key
 | 
						|
           +----------> name of the daemon that uses this key
 | 
						|
 | 
						|
KEY_CHANGED origin
 | 
						|
              +--> daemon that has changed it's packet key
 | 
						|
--------------------------------------------------------------------------
 | 
						|
 | 
						|
The keys used to encrypt VPN packets are not sent out directly. This is
 | 
						|
because it would generate a lot of traffic on VPNs with many daemons, and
 | 
						|
chances are that not every tinc daemon will ever send a packet to every
 | 
						|
other daemon. Instead, if a daemon needs a key it sends a request for it
 | 
						|
via the meta connection of the nearest hop in the direction of the
 | 
						|
destination. If any hop on the way has already learned the key, it will
 | 
						|
act as a proxy and forward its copy back to the requestor.
 | 
						|
 | 
						|
daemon	message
 | 
						|
--------------------------------------------------------------------------
 | 
						|
origin	PING
 | 
						|
dest.	PONG
 | 
						|
--------------------------------------------------------------------------
 | 
						|
 | 
						|
There is also a mechanism to check if hosts are still alive. Since network
 | 
						|
failures or a crash can cause a daemon to be killed without properly
 | 
						|
shutting down the TCP connection, this is necessary to keep an up to date
 | 
						|
connection list. Pings are sent at regular intervals, except when there
 | 
						|
is also some other traffic. A little bit of salt (random data) is added
 | 
						|
with each PING and PONG message, to make sure that long sequences of PING/PONG
 | 
						|
messages without any other traffic won't result in known plaintext.
 | 
						|
 | 
						|
This basically covers everything that is sent over the meta connection by
 | 
						|
tinc.
 |