1428 lines
50 KiB
Text
1428 lines
50 KiB
Text
\input texinfo @c -*-texinfo-*-
|
|
@c $Id: tinc.texi,v 1.8.4.11 2001/01/06 20:02:21 guus Exp $
|
|
@c %**start of header
|
|
@setfilename tinc.info
|
|
@settitle tinc Manual
|
|
@setchapternewpage odd
|
|
@c %**end of header
|
|
|
|
@ifinfo
|
|
@direntry
|
|
* tinc: (tinc). The tinc Manual.
|
|
@end direntry
|
|
|
|
This is the info manual for tinc, a Virtual Private Network daemon.
|
|
|
|
Copyright @copyright{} 1998,199,2000 Ivo Timmermans
|
|
<itimmermans@@bigfoot.com>, Guus Sliepen <guus@@sliepen.warande.net> and
|
|
Wessel Dankers <wsl@@nl.linux.org>.
|
|
|
|
$Id: tinc.texi,v 1.8.4.11 2001/01/06 20:02:21 guus Exp $
|
|
|
|
Permission is granted to make and distribute verbatim copies of this
|
|
manual provided the copyright notice and this permission notice are
|
|
preserved on all copies.
|
|
|
|
Permission is granted to copy and distribute modified versions of this
|
|
manual 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.
|
|
|
|
@end ifinfo
|
|
|
|
@titlepage
|
|
@title tinc Manual
|
|
@subtitle Setting up a Virtual Private Network with tinc
|
|
@author Ivo Timmermans and Guus Sliepen
|
|
|
|
@page
|
|
@vskip 0pt plus 1filll
|
|
@cindex copyright
|
|
Copyright @copyright{} 1998,1999,2000 Ivo Timmermans
|
|
<itimmermans@@bigfoot.com>, Guus Sliepen <guus@@sliepen.warande.net> and
|
|
Wessel Dankers <wsl@@nl.linux.org>.
|
|
|
|
$Id: tinc.texi,v 1.8.4.11 2001/01/06 20:02:21 guus Exp $
|
|
|
|
Permission is granted to make and distribute verbatim copies of this
|
|
manual provided the copyright notice and this permission notice are
|
|
preserved on all copies.
|
|
|
|
Permission is granted to copy and distribute modified versions of this
|
|
manual 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.
|
|
|
|
@end titlepage
|
|
|
|
@c ==================================================================
|
|
@node Top, Introduction, (dir), (dir)
|
|
|
|
@menu
|
|
* Introduction:: Introduction
|
|
* Installing tinc - preparations::
|
|
* Installing tinc - installation::
|
|
* Configuring tinc::
|
|
* Running tinc::
|
|
* Technical information::
|
|
* About us::
|
|
* Concept Index:: All used terms explained
|
|
@end menu
|
|
|
|
|
|
@contents
|
|
|
|
@c ==================================================================
|
|
@node Introduction, Installing tinc - preparations, Top, Top
|
|
@chapter Introduction
|
|
|
|
@cindex tinc
|
|
tinc is a Virtual Private Network (VPN) daemon that uses tunneling and
|
|
encryption to create a secure private network between hosts on the
|
|
Internet.
|
|
|
|
Because the tunnel appears to the IP level network code as a normal
|
|
network device, there is no need to adapt any existing software.
|
|
|
|
This tunneling allows VPN sites to share information with each other
|
|
over the Internet without exposing any information to others.
|
|
|
|
This document is the manual for tinc. Included are chapters on how to
|
|
configure your computer to use tinc, as well as the configuration
|
|
process of tinc itself.
|
|
|
|
@menu
|
|
* VPNs:: Virtual Private Networks in general
|
|
* tinc:: about tinc
|
|
* Supported platforms::
|
|
@end menu
|
|
|
|
@c ==================================================================
|
|
@node VPNs, tinc, Introduction, Introduction
|
|
@section Virtual Private Networks
|
|
|
|
@cindex VPN
|
|
A Virtual Private Network or VPN is a network that can only be accessed
|
|
by a few elected computers that participate. This goal is achievable in
|
|
more than just one way.
|
|
|
|
@cindex private
|
|
Private networks can consist of a single stand-alone ethernet LAN. Or
|
|
even two computers hooked up using a null-modem cable. In these cases,
|
|
it is
|
|
obvious that the network is @emph{private}, no one can access it from the
|
|
outside. But if your computers are linked to the internet, the network
|
|
is not private anymore, unless one uses firewalls to block all private
|
|
traffic. But then, there is no way to send private data to trusted
|
|
computers on the other end of the internet.
|
|
|
|
@cindex virtual
|
|
This problem can be solved by using @emph{virtual} networks. Virtual
|
|
networks can live on top of other networks, but they use encapsulation to
|
|
keep using their private address space so they do not interfere with
|
|
each other. Mostly, virtual networks appear like a singe LAN, even though
|
|
they can span the entire world. But virtual networks can't be secured
|
|
by using firewalls, because the traffic that flows through it has to go
|
|
through the internet, where other people can look at it.
|
|
|
|
When one introduces encryption, we can form a true VPN. Other people may
|
|
see encrypted traffic, but if they don't know how to decipher it (they
|
|
need to know the key for that), they cannot read the information that flows
|
|
through the VPN. This is what tinc was made for.
|
|
|
|
@cindex virtual
|
|
tinc uses normal IP datagrams to encapsulate data that goes over the VPN
|
|
network link. In this case it's also clear that the network is
|
|
@emph{virtual}, because no direct network link has to exist between to
|
|
participants.
|
|
|
|
As is the case with either type of VPN, anybody could eavesdrop. Or
|
|
worse, alter data. Hence it's probably advisable to encrypt the data
|
|
that flows over the network.
|
|
|
|
|
|
@c ==================================================================
|
|
@node tinc, Supported platforms, VPNs, Introduction
|
|
@section tinc
|
|
|
|
@cindex vpnd
|
|
@cindex ethertap
|
|
I really don't quite remember what got us started, but it must have been
|
|
Guus' idea. He wrote a simple implementation (about 50 lines of C) that
|
|
used the @emph{ethertap} device that Linux knows of since somewhere
|
|
about kernel 2.1.60. It didn't work immediately and he improved it a
|
|
bit. At this stage, the project was still simply called @samp{vpnd}.
|
|
|
|
Since then, a lot has changed---to say the least.
|
|
|
|
@cindex tincd
|
|
tinc now supports encryption, it consists of a single daemon (tincd) for
|
|
both the receiving and sending end, it has become largely
|
|
runtime-configurable---in short, it has become a full-fledged
|
|
professional package.
|
|
|
|
A lot can---and will be---changed. We have a number of things that we would like to
|
|
see in the future releases of tinc. Not everything will be available in
|
|
the near future. Our first objective is to make tinc work perfectly as
|
|
it stands, and then add more advanced features.
|
|
|
|
Meanwhile, we're always open-minded towards new ideas. And we're
|
|
available too.
|
|
|
|
|
|
@c ==================================================================
|
|
@node Supported platforms, , tinc, Introduction
|
|
@section Supported platforms
|
|
|
|
tinc has been verified to work under Linux, FreeBSD and Solaris, with
|
|
various hardware architectures. These are the three platforms
|
|
that are supported by the universial TUN/TAP device driver, so if
|
|
support for other operating systems is added to this driver, perhaps
|
|
tinc will run on them as well. Without this driver, tinc will most
|
|
likely compile and run, but it will not be able to send or receive data
|
|
packets.
|
|
|
|
For an up to date list of supported platforms, please check the list on
|
|
our website:
|
|
@uref{http://tinc.nl.linux.org/platforms.html}.
|
|
|
|
|
|
@c ==================================================================
|
|
@subsection Linux
|
|
|
|
tinc was first written for Linux running on an intel x86 processor, so
|
|
this is the best supported platform. The protocol however, and actually
|
|
anything about tinc, has been rewritten to support random byte ordering
|
|
and arbitrary word length. So in theory it should run on other
|
|
processors that Linux runs on. It has already been verified to run on
|
|
alpha and sparc processors as well.
|
|
|
|
tinc uses the ethertap device that is provided in the standard kernel
|
|
since version 2.1.60, so anything above that (2.2.x, 2.3.x, and 2.4.0)
|
|
kernel version is able to support tinc.
|
|
|
|
|
|
@c ==================================================================
|
|
@subsection FreeBSD
|
|
|
|
tinc on FreeBSD relies on the universial TUN/TAP driver for its data
|
|
acquisition from the kernel. Therefore, tinc suports the same platforms
|
|
as this driver. These are: FreeBSD 3.x, 4.x, 5.x.
|
|
|
|
|
|
@c ==================================================================
|
|
@subsection Solaris
|
|
|
|
tinc on Solaris relies on the universial TUN/TAP driver for its data
|
|
acquisition from the kernel. Therefore, tinc suports the same platforms
|
|
as this driver. These are: Solaris, 2.1.x.
|
|
|
|
|
|
@c
|
|
@c
|
|
@c
|
|
@c
|
|
@c
|
|
@c
|
|
@c Preparing your system
|
|
@c
|
|
@c
|
|
@c
|
|
@c
|
|
@c
|
|
|
|
@c ==================================================================
|
|
@node Installing tinc - preparations, Installing tinc - installation, Introduction, Top
|
|
@chapter Installing tinc: preparations
|
|
|
|
This chapter contains information on how to prepare your system to
|
|
support tinc.
|
|
|
|
@menu
|
|
* Configuring the kernel::
|
|
* Libraries::
|
|
@end menu
|
|
|
|
|
|
@c ==================================================================
|
|
@node Configuring the kernel, Libraries, Installing tinc - preparations, Installing tinc - preparations
|
|
@section Configuring the kernel
|
|
|
|
If you are running Linux, chances are good that your kernel already
|
|
supports all the devices that tinc needs for proper operation. For
|
|
example, the standard kernel from Redhat Linux already has support for
|
|
ethertap and netlink compiled in. Debian users can use the modconf
|
|
utility to select the modules. If your Linux distribution supports this
|
|
method of selecting devices, look out for something called `ethertap',
|
|
and `netlink_dev'. You need both these devices.
|
|
|
|
If you can install these devices in a similar manner, you may skip this
|
|
section.
|
|
|
|
@menu
|
|
* Configuration of the Linux kernel::
|
|
* Configuration of the FreeBSD kernel::
|
|
* Configuration of the Solaris kernel::
|
|
@end menu
|
|
|
|
|
|
@c ==================================================================
|
|
@node Configuration of the Linux kernel, Configuration of the FreeBSD kernel, Configuring the kernel, Configuring the kernel
|
|
@subsection Configuring the Linux kernel
|
|
|
|
Since this particular implementation only runs on 2.1 or higher Linux
|
|
kernels, you should grab one (2.2 is current at this time). A 2.0 port
|
|
is not really possible, unless someone tells me someone ported the
|
|
ethertap and netlink devices back to 2.0.
|
|
|
|
If you are unfamiliar with the process of configuring and compiling a
|
|
new kernel, you should read the
|
|
@uref{http://howto.linuxberg.com/LDP/HOWTO/Kernel-HOWTO.html, Kernel
|
|
HOWTO} first. Do that now!
|
|
|
|
Here are the options you have to turn on when configuring a new
|
|
kernel.
|
|
|
|
For kernel 2.2.x:
|
|
|
|
@example
|
|
Code maturity level options
|
|
[*] Prompt for development and/or incomplete code/drivers
|
|
Networking options
|
|
[*] Kernel/User netlink socket
|
|
<*> Netlink device emulation
|
|
Network device support
|
|
<*> Ethertap network tap
|
|
@end example
|
|
|
|
Note that if you want to run more than one instance of tinc or other
|
|
programs that use the ethertap, you have to compile the ethertap driver
|
|
as a module.
|
|
|
|
For kernel 2.3.x and 2.4.x:
|
|
|
|
@example
|
|
Code maturity level options
|
|
[*] Prompt for development and/or incomplete code/drivers
|
|
Networking options
|
|
[*] Kernel/User netlink socket
|
|
<*> Netlink device emulation
|
|
Network device support
|
|
<*> Universal TUN/TAP device driver support
|
|
@end example
|
|
|
|
|
|
Any other options not mentioned here are not relevant to tinc. If you
|
|
decide to build any of these as dynamic kernel modules, it's a good idea
|
|
to add these lines to @file{/etc/modules.conf}.
|
|
|
|
@example
|
|
alias tap0 ethertap
|
|
alias char-major-36 netlink_dev
|
|
@end example
|
|
|
|
If you have a 2.4-pre kernel, you can choose both the TUN/TAP driver and
|
|
the `Ethertap network tap' device. This latter is marked obsolete,
|
|
because the universal TUN/TAP driver is a newer implementation that is
|
|
supposed to be used in favour of ethertap. For tinc, it doesn't really
|
|
matter which one you choose; based on the device file name, tinc will make
|
|
the right choice about what protocol to use. However, chances are that
|
|
although you can choose the obsolote ethertap driver, it will not function
|
|
at all. The TUN/TAP driver is the safe choice.
|
|
|
|
Finally, after having set up other options, build the kernel and boot
|
|
it. Unfortunately it's not possible to insert these modules in a
|
|
running kernel.
|
|
|
|
|
|
@c ==================================================================
|
|
@node Configuration of the FreeBSD kernel, Configuration of the Solaris kernel, Configuration of the Linux kernel, Configuring the kernel
|
|
@subsection Configuring the FreeBSD kernel
|
|
|
|
This section will contain information on how to configure your FreeBSD
|
|
kernel to support the universal TUN/TAP device. For 5.0 and 4.1
|
|
systems, this is included in the kernel configuration, for earlier
|
|
systems (4.0 and 3.x), you need to install the universal TUN/TAP driver
|
|
yourself.
|
|
|
|
Unfortunately somebody still has to write the text.
|
|
|
|
|
|
@c ==================================================================
|
|
@node Configuration of the Solaris kernel, , Configuration of the FreeBSD kernel, Configuring the kernel
|
|
@subsection Configuring the Solaris kernel
|
|
|
|
This section will contain information on how to configure your Solaris
|
|
kernel to support the universal TUN/TAP device. You need to install
|
|
this driver yourself.
|
|
|
|
Unfortunately somebody still has to write the text.
|
|
|
|
|
|
@c ==================================================================
|
|
@node Libraries, , Configuring the kernel, Installing tinc - preparations
|
|
@section Libraries
|
|
|
|
@cindex requirements
|
|
Before you can configure or build tinc, you need to have the OpenSSL
|
|
library installed on your system. If you try to configure tinc without
|
|
having installed it, configure will give you an error message, and stop.
|
|
|
|
@menu
|
|
* OpenSSL::
|
|
@end menu
|
|
|
|
|
|
@c ==================================================================
|
|
@node OpenSSL, , Libraries, Libraries
|
|
@subsection OpenSSL
|
|
|
|
@cindex OpenSSL
|
|
For all cryptography-related functions, tinc uses the functions provided
|
|
by the OpenSSL library. We recommend using version 0.9.5 or 0.9.6 of
|
|
this library. Other versions may also work, but we can guarantee
|
|
nothing.
|
|
|
|
If this library is not installed, you wil get an error when configuring
|
|
tinc for build. Support for running tinc without having OpenSSL
|
|
installed @emph{may} be added in the future.
|
|
|
|
You can use your operating system's package manager to install this if
|
|
available. Make sure you install the development AND runtime versions
|
|
of this package.
|
|
|
|
If you have to install OpenSSL manually, you can get the source code
|
|
from @url{http://www.openssl.org/}. Instructions on how to configure,
|
|
build and install this package are included within the package. Please
|
|
make sure you build development and runtime libraries (which is the
|
|
default).
|
|
|
|
If you installed the OpenSSL libraries from source, it may be necessary
|
|
to let configure know where they are, by passing configure one of the
|
|
--with-openssl-* parameters.
|
|
|
|
@example
|
|
--with-openssl=DIR OpenSSL library and headers prefix
|
|
--with-openssl-include=DIR OpenSSL headers directory
|
|
(Default is OPENSSL_DIR/include)
|
|
--with-openssl-lib=DIR OpenSSL library directory
|
|
(Default is OPENSSL_DIR/lib)
|
|
@end example
|
|
|
|
|
|
@subsubheading License
|
|
|
|
Since the license under which OpenSSL is distributed is not directly
|
|
compatible with the terms of the GNU GPL
|
|
@uref{http://www.openssl.org/support/faq.html#LEGAL2}, therefore we
|
|
include an addition to the GPL (see also the file COPYING.README):
|
|
|
|
@quotation
|
|
This program is released under the GPL with the additional exemption
|
|
that compiling, linking, and/or using OpenSSL is allowed. You may
|
|
provide binary packages linked to the OpenSSL libraries, provided that
|
|
all other requirements of the GPL are met.
|
|
@end quotation
|
|
|
|
|
|
@c
|
|
@c
|
|
@c
|
|
@c Installing tinc
|
|
@c
|
|
@c
|
|
@c
|
|
@c
|
|
|
|
@c ==================================================================
|
|
@node Installing tinc - installation, Configuring tinc, Installing tinc - preparations, Top
|
|
@chapter Installing tinc: installation
|
|
|
|
If you use Redhat or Debian, you may want to install one of the
|
|
precompiled packages for your system. These packages are equipped with
|
|
system startup scripts and sample configurations.
|
|
|
|
If you don't run either of these systems, or you want to compile tinc
|
|
for yourself, you can use the source. The source is distributed under
|
|
the GNU General Public License (GPL). Download the source from the
|
|
@uref{http://tinc.nl.linux.org/download.html, download page}, which has
|
|
the checksums of these files listed; you may wish to check these with
|
|
md5sum before continuing.
|
|
|
|
tinc comes in a convenient autoconf/automake package, which you can just
|
|
treat the same as any other package. Which is just untar it, type
|
|
`configure' and then `make'.
|
|
|
|
More detailed instructions are in the file @file{INSTALL}, which is
|
|
included in the source distribution.
|
|
|
|
@menu
|
|
* Building tinc::
|
|
* System files::
|
|
* Interfaces::
|
|
@end menu
|
|
|
|
|
|
@c ==================================================================
|
|
@node Building tinc, System files, Installing tinc - installation, Installing tinc - installation
|
|
@section Building tinc
|
|
|
|
Detailed instructions on configuring the source and building tinc can be
|
|
found in the file called @file{INSTALL}.
|
|
|
|
|
|
@c ==================================================================
|
|
@node System files, Interfaces, Building tinc, Installing tinc - installation
|
|
@section System files
|
|
|
|
Before you can run tinc, you must make sure you have all the needed
|
|
files on your system.
|
|
|
|
@menu
|
|
* Device files::
|
|
* Other files::
|
|
@end menu
|
|
|
|
|
|
@c ==================================================================
|
|
@node Device files, Other files, System files, System files
|
|
@subsection Device files
|
|
|
|
First, you'll need the special device file(s) that form the interface
|
|
between the kernel and the daemon.
|
|
|
|
The permissions for these files have to be such that only the super user
|
|
may read/write to this file. You'd want this, because otherwise
|
|
eavesdropping would become a bit too easy. This does, however, imply
|
|
that you'd have to run tincd as root.
|
|
|
|
If you use the universal TUN/TAP driver, you have to create the
|
|
following device files (unless they already exist):
|
|
|
|
@example
|
|
mknod -m 600 /dev/... c .. ..
|
|
chown 0.0 /dev/...
|
|
@end example
|
|
|
|
If you want to have more devices, the device numbers will be .. .. ...
|
|
|
|
If you use Linux, and you run the new 2.4 kernel using the devfs
|
|
filesystem, then the tap device will be automatically generated as
|
|
@file{/dev/netlink/tap0}.
|
|
|
|
If you use Linux and have kernel 2.2.x, you have to make the ethertap
|
|
devices:
|
|
|
|
@example
|
|
mknod -m 600 /dev/tap0 c 36 16
|
|
chown 0.0 /dev/tap0
|
|
@end example
|
|
|
|
Any further ethertap devices have minor device number 16 through 31.
|
|
|
|
|
|
@c ==================================================================
|
|
@node Other files, , Device files, System files
|
|
@subsection Other files
|
|
|
|
@subsubheading @file{/etc/networks}
|
|
|
|
You may add a line to @file{/etc/networks} so that your VPN will get a
|
|
symbolic name. For example:
|
|
|
|
@example
|
|
myvpn 10.0.0.0
|
|
@end example
|
|
|
|
This has nothing to do with the MyVPNIP configuration variable that will be
|
|
discussed later, it is only to make the output of the route command more
|
|
legible.
|
|
|
|
@subsubheading @file{/etc/services}
|
|
|
|
You may add this line to @file{/etc/services}. The effect is that you
|
|
may supply a @samp{tinc} as a valid port number to some programs. The
|
|
number 655 is registered with the IANA.
|
|
|
|
@example
|
|
tinc 655/tcp TINC
|
|
tinc 655/udp TINC
|
|
# Ivo Timmermans <itimmermans@@bigfoot.com>
|
|
@end example
|
|
|
|
|
|
@c ==================================================================
|
|
@node Interfaces, , System files, Installing tinc - installation
|
|
@section Interfaces
|
|
|
|
Before you can start transmitting data over the tinc tunnel, you must
|
|
set up the ethertap network devices.
|
|
|
|
First, decide which IP addresses you want to have associated with these
|
|
devices, and what network mask they must have. You also need these
|
|
numbers when you are going to configure tinc itself. @xref{Configuring
|
|
tinc}.
|
|
|
|
It doesn't matter much which part you do first, setting up the network
|
|
devices or configure tinc. But they both have to be done before you try
|
|
to start a tincd.
|
|
|
|
The actual setup of the ethertap device is quite simple, just repeat
|
|
after me:
|
|
|
|
@example
|
|
ifconfig tap@emph{n} hw ether fe:fd:00:00:00:00
|
|
@end example
|
|
|
|
@cindex MAC address
|
|
@cindex hardware address
|
|
@strong{Note:} Since version 1.0pre3, all interface addresses are set to
|
|
this address, whereas previous versions required the MAC to match the
|
|
actual IP address.
|
|
|
|
@cindex ifconfig
|
|
To activate the device, you have to assign an IP address to it. To set
|
|
an IP address @emph{IP} with network mask @emph{mask}, do the following:
|
|
|
|
@example
|
|
ifconfig tap@emph{n} @emph{xx}.@emph{xx}.@emph{xx}.@emph{xx} netmask @emph{mask}
|
|
@end example
|
|
|
|
@cindex netmask
|
|
The netmask is the mask of the @emph{entire} VPN network, not just your
|
|
own subnet. It is the same netmask you will have to specify with the
|
|
VpnMask configuration variable.
|
|
|
|
|
|
@c
|
|
@c
|
|
@c
|
|
@c
|
|
@c Configuring tinc
|
|
@c
|
|
@c
|
|
@c
|
|
@c
|
|
|
|
|
|
@c ==================================================================
|
|
@node Configuring tinc, Running tinc, Installing tinc - installation, Top
|
|
@chapter Configuring tinc
|
|
|
|
@menu
|
|
* Multiple networks::
|
|
* How connections work::
|
|
* Configuration file::
|
|
* Example::
|
|
@end menu
|
|
|
|
@c ==================================================================
|
|
@node Multiple networks, How connections work, Configuring tinc, Configuring tinc
|
|
@section Multiple networks
|
|
|
|
@c from the manpage
|
|
|
|
It is perfectly OK for you to run more than one tinc daemon.
|
|
However, in its default form, you will soon notice that you can't use
|
|
two different configuration files without the -c option.
|
|
|
|
We have thought of another way of dealing with this: network names. This
|
|
means that you call tincd with the -n argument, which will assign a name
|
|
to this daemon.
|
|
|
|
The effect of this is that the daemon will set its configuration
|
|
``root'' to /etc/tinc/nn/, where nn is your argument to the -n
|
|
option. You'll notice that it appears in syslog as ``tinc.nn''.
|
|
|
|
However, it is not strictly necessary that you call tinc with the -n
|
|
option. In this case, the network name would just be empty, and it will
|
|
be used as such. tinc now looks for files in /etc/tinc/, instead of
|
|
/etc/tinc/nn/; the configuration file should be /etc/tinc/tinc.conf,
|
|
and the passphrases are now expected to be in /etc/tinc/passphrases/.
|
|
|
|
But it is highly recommended that you use this feature of tinc, because
|
|
it will be so much clearer whom your daemon talks to. Hence, we will
|
|
assume that you use it.
|
|
|
|
|
|
@c ==================================================================
|
|
@node How connections work, Configuration file, Multiple networks, Configuring tinc
|
|
@section How connections work
|
|
|
|
Before going on, first a bit on how tinc sees connections.
|
|
|
|
When tinc starts up, it reads in the configuration file and parses the
|
|
command-line options. If it sees a `ConnectTo' value in the file, it
|
|
will try to connect to it, on the given port. If this fails, tinc exits.
|
|
|
|
|
|
@c ==================================================================
|
|
@node Configuration file, Example, How connections work, Configuring tinc
|
|
@section Configuration file
|
|
|
|
The actual configuration of the daemon is done in the file
|
|
@file{/etc/tinc/nn/tinc.conf}.
|
|
|
|
This file consists of comments (lines started with a #) or assignments
|
|
in the form of
|
|
|
|
@example
|
|
Variable = Value.
|
|
@end example
|
|
|
|
The variable names are case insensitive, and any spaces, tabs, newlines
|
|
and carriage returns are ignored. Note: it is not required that you put
|
|
in the `=' sign, but doing so improves readability. If you leave it
|
|
out, remember to replace it with at least one space character.
|
|
|
|
In this section all valid variables are listed in alphabetical order.
|
|
The default value is given between parentheses; required directives are
|
|
given in @strong{bold}.
|
|
|
|
@menu
|
|
* Main configuration variables::
|
|
* Host configuration variables::
|
|
* How to configure::
|
|
@end menu
|
|
|
|
|
|
@c ==================================================================
|
|
@node Main configuration variables, Host configuration variables, Configuration file, Configuration file
|
|
@subsection Main configuration variables
|
|
|
|
@table @asis
|
|
@item @strong{ConnectTo = <name>}
|
|
Specifies which host to connect to on startup. Multiple ConnectTo
|
|
variables may be specified, if connecting to the first one fails then
|
|
tinc will try the next one, and so on. It is possible to specify
|
|
hostnames for dynamic IP addresses (like those given on dyndns.org),
|
|
tinc will not cache the resolved IP address.
|
|
|
|
If you don't specify a host with ConnectTo, regardless of whether a
|
|
value for ConnectPort is given, tinc won't connect at all, and will
|
|
instead just listen for incoming connections.
|
|
|
|
@item Hostnames = <yes|no> (no)
|
|
This option selects whether IP addresses (both real and on the VPN)
|
|
should be resolved. Since DNS lookups are blocking, it might affect
|
|
tinc's efficiency, even stopping the daemon for a few seconds everytime
|
|
it does a lookup if your DNS server is not responding.
|
|
|
|
This does not affect resolving hostnames to IP addresses from the
|
|
configuration file.
|
|
|
|
@item Interface = <device>
|
|
If you have more than one network interface in your computer, tinc will
|
|
by default listen on all of them for incoming connections. It is
|
|
possible to bind tinc to a single interface like eth0 or ppp0 with this
|
|
variable.
|
|
|
|
@item InterfaceIP = <local address>
|
|
If your computer has more than one IP address on a single interface (for
|
|
example if you are running virtual hosts), tinc will by default listen
|
|
on all of them for incoming connections. It is possible to bind tinc to
|
|
a single IP address with this variable. It is still possible to listen
|
|
on several interfaces at the same time though, if they share the same IP
|
|
address.
|
|
|
|
@item KeyExpire = <seconds> (3600)
|
|
This option controls the time the encryption keys used to encrypt the
|
|
data are valid. It is common practice to change keys at regular
|
|
intervals to make it even harder for crackers, even though it is thought
|
|
to be nearly impossible to crack a single key.
|
|
|
|
@item @strong{Name = <name>}
|
|
This is a symbolic name for this connection. It can be anything
|
|
|
|
@item PingTimeout = <seconds> (5)
|
|
The number of seconds of inactivity that tinc will wait before sending a
|
|
probe to the other end. If that other end doesn't answer within that
|
|
same amount of seconds, the connection is terminated, and the others
|
|
will be notified of this.
|
|
|
|
@item PrivateKey = <key>
|
|
This is the RSA private key for tinc. However, for safety reasons it is
|
|
advised to store private keys of any kind in separate files. This prevents
|
|
accidental eavesdropping if you are editting the configuration file.
|
|
|
|
@item PrivateKeyFile = <path>
|
|
This is the full path name of the RSA private key file that was
|
|
generated by ``tincd --generate-keys''. It must be a full path, not a
|
|
relative directory.
|
|
|
|
Note that exactly @strong{one of the above two options} must be specified.
|
|
|
|
@item TapDevice = <device> (/dev/tap0)
|
|
The ethertap device to use. Note that you can only use one device per
|
|
daemon. The info pages of the tinc package contain more information
|
|
about configuring an ethertap device for Linux.
|
|
|
|
@item VpnMask = <mask>
|
|
The mask that defines the scope of the entire VPN. This option is not
|
|
used by the tinc daemon itself, but can be used by startup scripts to
|
|
configure the ethertap devices correctly.
|
|
@end table
|
|
|
|
|
|
@c ==================================================================
|
|
@node Host configuration variables, How to configure, Main configuration variables, Configuration file
|
|
@subsection Host configuration variables
|
|
|
|
@table @asis
|
|
@item @strong{Address = <IP address|hostname>}
|
|
This variable is only required if you want to connect to this host. It
|
|
must resolve to the external IP address where the host can be reached,
|
|
not the one that is internal to the VPN.
|
|
|
|
@item IndirectData = <yes|no> (no)
|
|
This option specifies whether other tinc daemons besides the one you
|
|
specified with ConnectTo can make a direct connection to you. This is
|
|
especially useful if you are behind a firewall and it is impossible to
|
|
make a connection from the outside to your tinc daemon. Otherwise, it
|
|
is best to leave this option out or set it to no.
|
|
|
|
@item Port = <port> (655)
|
|
Connect to the upstream host (given with the ConnectTo directive) on
|
|
port port. port may be given in decimal (default), octal (when preceded
|
|
by a single zero) o hexadecimal (prefixed with 0x). port is the port
|
|
number for both the UDP and the TCP (meta) connections.
|
|
|
|
@item PublicKey = <key>
|
|
This is the RSA public key for this host.
|
|
|
|
@item PublicKeyFile = <path>
|
|
This is the full path name of the RSA public key file that was generated
|
|
by ``tincd --generate-keys''. It must be a full path, not a relative
|
|
directory.
|
|
|
|
Note that exactly @strong{one of the above two options} must be specified
|
|
in each host configuration file, if you want to be able to establish a
|
|
connection with that host.
|
|
|
|
@item Subnet = <IP address/maskbits>
|
|
This is the subnet range of all IP addresses that will be accepted by
|
|
the host that defines it.
|
|
|
|
The range must be contained in the IP address range of the tap device,
|
|
not the real IP address of the host running tincd.
|
|
|
|
maskbits is the number of bits set to 1 in the netmask part; for
|
|
example: netmask 255.255.255.0 would become /24, 255.255.252.0 becomes
|
|
/22. This conforms to standard CIDR notation as described in
|
|
@uref{ftp://ftp.isi.edu/in-notes/rfc1519.txt, RFC1519}
|
|
|
|
@item TCPonly = <yes|no> (no)
|
|
If this variable is set to yes, then the packets are tunnelled over a
|
|
TCP connection instead of a UDP connection. This is especially useful
|
|
for those who want to run a tinc daemon from behind a masquerading
|
|
firewall, or if UDP packet routing is disabled somehow. @emph{This is
|
|
experimental code, try this at your own risk. It may not work at all.}
|
|
@end table
|
|
|
|
|
|
@c ==================================================================
|
|
@node How to configure, , Host configuration variables, Configuration file
|
|
@subsection How to configure
|
|
|
|
@subsubheading Step 1. Creating the key files
|
|
|
|
For each host, you have to create a pair of RSA keys. One key is your
|
|
private key, which is only known to you. The other one is the public
|
|
key, which you should copy to all hosts wanting to authenticate to you.
|
|
|
|
|
|
@subsubheading Step 2. Configuring each host
|
|
|
|
For every host in the VPN, you have to create two files. First there is
|
|
the main configuration file, @file{/etc/tinc/vpn-name/tinc.conf}. In
|
|
this file there should at least be three directives:
|
|
|
|
@table @samp
|
|
@item Name
|
|
You should fill in the name of this host (or rather, the name of this
|
|
leaf of the VPN). It can be called after the hostname, the physical
|
|
location, the department, or the name of one of your boss' pets. It can
|
|
be anything, as long as all these names are unique across the entire
|
|
VPN.
|
|
|
|
@item PrivateKey
|
|
Fill in the full pathname to the file that contains the private RSA key.
|
|
|
|
@item ConnectTo
|
|
This is the name of the host that you want to connect to (not a DNS
|
|
name, rather the name that is given with the Name parameter in that
|
|
hosts tinc.conf). This is the upstream connection. If your computer is
|
|
a central node, you might want to leave this out to make it stay idle
|
|
until someone connects to it.
|
|
@end table
|
|
|
|
@cindex host configuration file
|
|
Then you should create a file with the name you gave yourself in
|
|
tinc.conf (the `Name' parameter), located in
|
|
@file{/etc/tinc/vpn-name/hosts/}. In this file, which we call the
|
|
`@emph{host configuration file}', only one variable is required:
|
|
|
|
@table @samp
|
|
@item Subnet
|
|
The IP range that this host accepts as being `local'. All packets with
|
|
a destination address that is within this subnet will be sent to us.
|
|
@end table
|
|
|
|
|
|
@subsubheading Step 3. Bringing it all together
|
|
|
|
Now for all hosts that you want to create a direct connection to, -- you
|
|
connect to them or they connect to you -- you get a copy of their host
|
|
configuration file and their public RSA key.
|
|
|
|
For each host configuration file, you add two variables:
|
|
|
|
@table @samp
|
|
@item Address
|
|
Enter the IP address or DNS hostname for this host. This is only needed
|
|
if you connect to this host.
|
|
|
|
@item PublicKey
|
|
Put the full pathname to this hosts public RSA key here.
|
|
@end table
|
|
|
|
When you did this, you should be ready to create your first connection.
|
|
Pay attention to the system log, most errors will only be visible
|
|
there. If you get an error, you can check @ref{Error messages}.
|
|
|
|
|
|
@c ==================================================================
|
|
@node Example, , Configuration file, Configuring tinc
|
|
@section Example
|
|
|
|
|
|
@cindex example
|
|
Imagine the following situation. An A-based company wants to connect
|
|
three branch offices in B, C and D using the internet. All four offices
|
|
have a 24/7 connection to the internet.
|
|
|
|
A is going to serve as the center of the network. B and C will connect
|
|
to A, and D will connect to C. Each office will be assigned their own IP
|
|
network, 10.x.0.0.
|
|
|
|
@example
|
|
A: net 10.1.0.0 mask 255.255.0.0 gateway 10.1.54.1 internet IP 1.2.3.4
|
|
B: net 10.2.0.0 mask 255.255.0.0 gateway 10.2.1.12 internet IP 2.3.4.5
|
|
C: net 10.3.0.0 mask 255.255.0.0 gateway 10.3.69.254 internet IP 3.4.5.6
|
|
D: net 10.4.0.0 mask 255.255.0.0 gateway 10.4.3.32 internet IP 4.5.6.7
|
|
@end example
|
|
|
|
``gateway'' is the VPN IP address of the machine that is running the
|
|
tincd. ``internet IP'' is the IP address of the firewall, which does not
|
|
need to run tincd, but it must do a port forwarding of TCP&UDP on port
|
|
655 (unless otherwise configured).
|
|
|
|
In this example, it is assumed that eth0 is the interface that points to
|
|
the inner (physical) LAN of the office, although this could also be the
|
|
same as the interface that leads to the internet. The configuration of
|
|
the real interface is also shown as a comment, to give you an idea of
|
|
how these example host is set up.
|
|
|
|
@subsubheading For A
|
|
|
|
@emph{A} would be configured like this:
|
|
|
|
@example
|
|
#ifconfig eth0 10.1.54.1 netmask 255.255.0.0 broadcast 10.1.255.255
|
|
ifconfig tap0 hw ether fe:fd:00:00:00:00
|
|
ifconfig tap0 10.1.54.1 netmask 255.0.0.0
|
|
@end example
|
|
|
|
and in /etc/tinc/tinc.conf:
|
|
|
|
@example
|
|
Name = A
|
|
PrivateKey = /etc/tinc/A.priv
|
|
VpnMask = 255.0.0.0
|
|
@end example
|
|
|
|
On all hosts, /etc/tinc/hosts/A contains:
|
|
|
|
@example
|
|
Subnet = 10.1.0.0/16
|
|
Address = 1.2.3.4
|
|
PublicKey = /etc/tinc/hosts/A.pub
|
|
@end example
|
|
|
|
|
|
@subsubheading For B
|
|
|
|
@example
|
|
#ifconfig eth0 10.2.43.8 netmask 255.255.0.0 broadcast 10.2.255.255
|
|
ifconfig tap0 hw ether fe:fd:00:00:00:00
|
|
ifconfig tap0 10.2.1.12 netmask 255.0.0.0
|
|
@end example
|
|
|
|
and in /etc/tinc/tinc.conf:
|
|
|
|
@example
|
|
Name = B
|
|
ConnectTo = A
|
|
PrivateKey = /etc/tinc/B.priv
|
|
VpnMask = 255.0.0.0
|
|
@end example
|
|
|
|
Note here that the internal address (on eth0) doesn't have to be the
|
|
same as on the tap0 device. Also, ConnectTo is given so that no-one can
|
|
connect to this node.
|
|
|
|
On all hosts, /etc/tinc/hosts/B:
|
|
|
|
@example
|
|
Subnet = 10.2.0.0/16
|
|
Address = 2.3.4.5
|
|
PublicKey = /etc/tinc/hosts/B.pub
|
|
@end example
|
|
|
|
|
|
@subsubheading For C
|
|
|
|
@example
|
|
#ifconfig eth0 10.3.69.254 netmask 255.255.0.0 broadcast 10.3.255.255
|
|
ifconfig tap0 hw ether fe:fd:00:00:00:00
|
|
ifconfig tap0 10.3.69.254 netmask 255.0.0.0
|
|
@end example
|
|
|
|
and in /etc/tinc/A/tinc.conf:
|
|
|
|
@example
|
|
Name = C
|
|
ConnectTo = A
|
|
TapDevice = /dev/tap1
|
|
VpnMask = 255.0.0.0
|
|
@end example
|
|
|
|
C already has another daemon that runs on port 655, so they have to
|
|
reserve another port for tinc. It can connect to other tinc daemons on
|
|
the regular port though, so no ConnectPort variable is needed. They
|
|
also use the netname to distinguish between the two. tinc is started
|
|
with `tincd -n A'.
|
|
|
|
On all hosts, /etc/tinc/hosts/C:
|
|
|
|
@example
|
|
Subnet = 10.3.0.0/16
|
|
Port = 2000
|
|
PublicKey = /etc/tinc/hosts/C.pub
|
|
@end example
|
|
|
|
|
|
@subsubheading For D
|
|
|
|
@example
|
|
#ifconfig tap0 10.4.3.32 netmask 255.255.0.0 broadcast 10.4.255.255
|
|
ifconfig tap0 hw ether fe:fd:0a:04:03:20
|
|
ifconfig tap0 10.4.3.32 netmask 255.0.0.0
|
|
@end example
|
|
|
|
and in /etc/tinc/tinc.conf:
|
|
|
|
@example
|
|
MyVirtualIP = 10.4.3.32/16
|
|
ConnectTo = 3.4.5.6
|
|
ConnectPort = 2000
|
|
VpnMask=255.0.0.0
|
|
@end example
|
|
|
|
D will be connecting to C, which has a tincd running for this network on
|
|
port 2000. Hence they need to put in a ConnectPort, but it doesn't need
|
|
to have a different ListenPort.
|
|
|
|
@subsubheading Key files
|
|
|
|
A, B, C and D all have generate a public key with tincd -K, the output is
|
|
stored in /etc/tinc/hosts/X.pub (where X is A, B or D), except for C,
|
|
who stored it in /etc/tinc/A/hosts/C.pub.
|
|
|
|
A stores a copy of B's public key in /etc/tinc/hosts/B.pub
|
|
|
|
A stores a copy of C's public key in /etc/tinc/hosts/C.pub
|
|
|
|
B stores a copy of A's public key in /etc/tinc/hosts/A.pub
|
|
|
|
C stores a copy of A's public key in /etc/tinc/A/hosts/A.pub
|
|
|
|
C stores a copy of D's public key in /etc/tinc/A/hosts/D.pub
|
|
|
|
D stores a copy of C's public key in /etc/tinc/hosts/C.pub
|
|
|
|
@subsubheading Starting
|
|
|
|
A has to start their tincd first. Then come B and C, where C has to
|
|
provide the option `-n A', because they have more than one tinc
|
|
network. Finally, D's tincd is started.
|
|
|
|
|
|
|
|
@c ==================================================================
|
|
@node Running tinc, Technical information, Configuring tinc, Top
|
|
@chapter Running tinc
|
|
|
|
Running tinc isn't just as easy as typing `tincd' and hoping everything
|
|
will just work out the way you wanted. Instead, the use of tinc is a
|
|
project that involves trust relations and more than one computer.
|
|
|
|
@menu
|
|
* Managing keys::
|
|
* Runtime options::
|
|
* Error messages::
|
|
@end menu
|
|
|
|
|
|
@c ==================================================================
|
|
@node Managing keys, Runtime options, Running tinc, Running tinc
|
|
@section Managing keys
|
|
|
|
Before attempting to start tinc, you have to create public/private keypairs.
|
|
When tinc tries to make a connection, it exchanges some sensitive
|
|
data. Before doing so, it likes to know if the other end is
|
|
trustworthy.
|
|
|
|
To do this, both ends must have some knowledge about the other. In the
|
|
case of tinc this is the public keys.
|
|
|
|
To generate a public/private keypair, run `tincd -n vpn-name -K<bits>'.
|
|
<bits> is optional, you can use it to specify the length of the keys.
|
|
The length of the public/private keypairs
|
|
should be at least 1024 for reasonable security (reasonable being good enough
|
|
to keep the NSA busy for a few weeks).
|
|
|
|
Every computer that wants to participate in the VPN should do this. The
|
|
public keyfile should get the name of each tinc daemon and an extension .pub,
|
|
and it should be stored in the hosts directory.
|
|
|
|
When every computer has his own keys and configuration files, the files in the
|
|
hosts directory should be exchanged with each other computer that it wants to
|
|
talk to directly. Since only public keys are involved, you can safely do this
|
|
via email, telnet or ftp, or even putting the contents on a public billboard.
|
|
|
|
|
|
@c ==================================================================
|
|
@node Runtime options, Error messages, Managing keys, Running tinc
|
|
@section Runtime options
|
|
|
|
Besides the settings in the configuration file, tinc also accepts some
|
|
command line options.
|
|
|
|
This list is a longer version of that in the manpage. The latter is
|
|
generated automatically, so may be more up-to-date.
|
|
|
|
@cindex command line
|
|
@cindex runtime options
|
|
@cindex options
|
|
@c from the manpage
|
|
@table @samp
|
|
@item -c, --config=PATH
|
|
Read configuration options from the directory PATH. The default is
|
|
@file{/etc/tinc/nn/}.
|
|
|
|
@item -d
|
|
Increase debug level. The higher it gets, the more gets
|
|
logged. Everything goes via syslog.
|
|
|
|
0 is the default, only some basic information connection attempts get
|
|
logged. Setting it to 1 will log a bit more, still not very
|
|
disturbing. With two -d's tincd will log protocol information, which can
|
|
get pretty noisy. Three or more -d's will output every single packet
|
|
that goes out or comes in, which probably generates more data than the
|
|
packets themselves.
|
|
|
|
@item -k, --kill
|
|
Attempt to kill a running tincd and exit. A TERM signal (15) gets sent
|
|
to the daemon that his its PID in /var/run/tinc.pid.
|
|
|
|
Because it kills only one tinc daemon, you should use -n here if you
|
|
started it that way. It will then read the PID from
|
|
@file{/var/run/tinc.NETNAME.pid}.
|
|
|
|
@item -n, --net=NETNAME
|
|
Connect to net NETNAME. @xref{Multiple networks}.
|
|
|
|
@item -K, --generate-keys[=BITS]
|
|
Generate public/private keypair of BITS length. If BITS is not specified,
|
|
1024 is the default. tinc will ask where you want to store the files,
|
|
but will default to the configuration directory (you can use the -c or -n option
|
|
in combination with -K). After that, tinc will quit.
|
|
|
|
@item --help
|
|
Display a short reminder of these runtime options and terminate.
|
|
|
|
@item --version
|
|
Output version information and exit.
|
|
|
|
@end table
|
|
|
|
|
|
@c ==================================================================
|
|
@node Error messages, , Runtime options, Running tinc
|
|
@section Error messages
|
|
|
|
What follows is a list of the most common error messages you can see
|
|
when configuring tinc. Most of these messages are visible in the syslog
|
|
only, so keep an eye on it!
|
|
|
|
@table @strong
|
|
@item Could not open /dev/tap0: No such device
|
|
@table @bullet
|
|
@item You forgot to insmod netlink_dev.o
|
|
@item You forgot to compile `Netlink device emulation' in the kernel
|
|
@end table
|
|
|
|
@item Can't write to tun/tap device: No such device
|
|
@table @bullet
|
|
@item You forgot to insmod tun.o
|
|
@item You forgot to compile `Universal TUN/TAP driver' in the kernel
|
|
@end table
|
|
|
|
@item Packet with destination 1.2.3.4 is looping back to us!
|
|
@table @bullet
|
|
@item Something is not configured right. Packets are being sent out to the
|
|
tap device, but according to the Subnet directives in your host configuration
|
|
file, those packets should go to your own host. Most common mistake is that
|
|
you have a Subnet line in your host configuration file with a netmask which is
|
|
just as large as the netmask of the tap device. The latter should in almost all
|
|
cases be larger. Rethink your configuration.
|
|
Note that you will only see this message if you specified a debug
|
|
level of 5 or higher!
|
|
@end table
|
|
|
|
@item Network address and subnet mask do not match!
|
|
@table @bullet
|
|
@item The Subnet field must contain a network address. That means that
|
|
the lower order bits of the address must be zero. For example, 192.168.1.1/24
|
|
is wrong, you should use 192.168.1.0/24.
|
|
@item If you only want to use one IP address, set the netmask to /32.
|
|
@end table
|
|
|
|
@item This is a bug: net.c:253: 24: Some error
|
|
@table @bullet
|
|
@item This is something that should not have happened
|
|
Please report this, and tell us exactly what went wrong before you got
|
|
this message. In normal operation, these errors should not occur.
|
|
@end table
|
|
|
|
@item Error reading RSA key file `rsa_key.priv': No such file or directory
|
|
@table @bullet
|
|
@item You must specify the complete pathname
|
|
Specifying a relative path does not make sense here. tinc changes its
|
|
directory to / when starting (to avoid keeping a mount point busy); and
|
|
even if we built in a default directory to look for these files, the key
|
|
files are bound to be in a different directory.
|
|
@end table
|
|
|
|
@end table
|
|
|
|
|
|
@c ==================================================================
|
|
@node Technical information, About us, Running tinc, Top
|
|
@chapter Technical information
|
|
|
|
@menu
|
|
* The Connection::
|
|
* Security::
|
|
@end menu
|
|
|
|
|
|
@c ==================================================================
|
|
@node The Connection, Security, Technical information, Technical information
|
|
@section The basic philosophy of the way tinc works
|
|
@cindex connection
|
|
|
|
tinc is a daemon that takes VPN data and transmit that to another host
|
|
computer over the existing Internet infrastructure.
|
|
|
|
@menu
|
|
* Protocol Preview::
|
|
* The Meta-connection::
|
|
@end menu
|
|
|
|
|
|
@c ==================================================================
|
|
@node Protocol Preview, The Meta-connection, The Connection, The Connection
|
|
@subsection A preview of the way the tinc works
|
|
|
|
@cindex ethertap
|
|
@cindex frame type
|
|
The data itself is read from a character device file, the so-called
|
|
@emph{ethertap} device. This device is associated with a network
|
|
interface. Any data sent to this interface can be read from the device,
|
|
and any data written to the device gets sent from the interface. Data to
|
|
and from the device is formatted as if it were a normal ethernet card,
|
|
so a frame is preceded by two MAC addresses and a @emph{frame type}
|
|
field.
|
|
|
|
So when tinc reads an ethernet frame from the device, it determines its
|
|
type. Right now, tinc can only handle Internet Protocol version 4 (IPv4)
|
|
frames, because it needs IP headers for routing.
|
|
Plans to support other protocols and switching instead of routing are being made.
|
|
When tinc knows
|
|
which type of frame it has read, it can also read the source and
|
|
destination address from it.
|
|
|
|
Now it is time that the frame gets encrypted. Currently the only
|
|
encryption algorithm available is blowfish.
|
|
|
|
@cindex encapsulating
|
|
When the encryption is ready, time has come to actually transport the
|
|
packet to the destination computer. We do this by sending the packet
|
|
over an UDP connection to the destination host. This is called
|
|
@emph{encapsulating}, the VPN packet (though now encrypted) is
|
|
encapsulated in another IP datagram.
|
|
|
|
When the destination receives this packet, the same thing happens, only
|
|
in reverse. So it does a decrypt on the contents of the UDP datagram,
|
|
and it writes the decrypted information to its own ethertap device.
|
|
|
|
To let the kernel on the receiving end accept the packet, the destination MAC
|
|
address must match that of the tap interface. Because of the routing nature
|
|
of tinc, ARP is not possible. tinc solves this by always overwriting the
|
|
destination MAC address with fe:fd:0:0:0:0. That is also the reason why you must
|
|
set the MAC address of your tap interface to that address.
|
|
|
|
|
|
@c ==================================================================
|
|
@node The Meta-connection, , Protocol Preview, The Connection
|
|
@subsection The meta-connection
|
|
|
|
Having only an UDP connection available is not enough. Though suitable
|
|
for transmitting data, we want to be able to reliably send other
|
|
information, such as routing and encryption information to somebody.
|
|
|
|
TCP is a better alternative, because it already contains protection
|
|
against information being lost, unlike UDP.
|
|
|
|
So we establish two connections. One for the encrypted VPN data, and one
|
|
for other information, the meta-data. Hence, we call the second
|
|
connection the meta-connection. We can now be sure that the
|
|
meta-information doesn't get lost on the way to another computer.
|
|
|
|
@cindex data-protocol
|
|
@cindex meta-protocol
|
|
Like with any communication, we must have a protocol, so that everybody
|
|
knows what everything stands for, and how she should react. Because we
|
|
have two connections, we also have two protocols. The protocol used for
|
|
the UDP data is the ``data-protocol,'' the other one is the
|
|
``meta-protocol.''
|
|
|
|
The reason we don't use TCP for both protocols is that UDP is much
|
|
better for encapsulation, even while it is less reliable. The real
|
|
problem is that when TCP would be used to encapsulate a TCP stream
|
|
that's on the private network, for every packet sent there would be
|
|
three ACK's sent instead of just one. Furthermore, if there would be
|
|
a timeout, both TCP streams would sense the timeout, and both would
|
|
start resending packets.
|
|
|
|
@c ==================================================================
|
|
@node Security, , The Connection, Technical information
|
|
@section About tinc's encryption and other security-related issues.
|
|
|
|
@cindex tinc
|
|
@cindex Cabal
|
|
tinc got its name from ``TINC,'' short for @emph{There Is No Cabal}; the
|
|
alleged Cabal was/is an organization that was said to keep an eye on the
|
|
entire Internet. As this is exactly what you @emph{don't} want, we named
|
|
the tinc project after TINC.
|
|
|
|
@cindex SVPN
|
|
But in order to be ``immune'' to eavesdropping, you'll have to encrypt
|
|
your data. Because tinc is a @emph{Secure} VPN (SVPN) daemon, it does
|
|
exactly that: encrypt.
|
|
|
|
This chapter is a mixture of ideas, reasoning and explanation, please
|
|
don't take it too serious.
|
|
|
|
@menu
|
|
* Key Types::
|
|
@end menu
|
|
|
|
@c ==================================================================
|
|
@node Key Types, , Security, Security
|
|
@subsection Key Types
|
|
@c FIXME: check if I'm not talking nonsense
|
|
|
|
There are several types of encryption keys. Tinc uses two of them,
|
|
symmetric private keypairs and public/private keypairs.
|
|
|
|
Public/private keypairs are used in public key cryptography. It enables
|
|
someone to send out a public key with which other people can encrypt their
|
|
data. The encrypted data now can only be decrypted by the person who has
|
|
the private key that matches the public key. So, a public key only allows
|
|
@emph{other} people to send encrypted messages to you. This is very useful
|
|
in setting up private communications channels. Just send out your public key
|
|
and other people can talk to you in a secure way. But how can you know
|
|
the other person is who she says she is? This is done by sending out an
|
|
encrypted challenge that only the person with the right private key can decode
|
|
an respond to.
|
|
|
|
However, encryption with public/private keys is very slow. Symmetric key cryptography
|
|
is orders of magnitudes faster, but it is very hard to safely exchange the symmetric
|
|
keys, since they should be kept private.
|
|
|
|
The idea is to use public/private cryptography for authentication, and for
|
|
exchanging symmetric keys in a safe way. After that, all communications are encrypted
|
|
with the symmetric cipher.
|
|
|
|
|
|
@c ==================================================================
|
|
@node About us, Concept Index, Technical information, Top
|
|
@chapter About us
|
|
|
|
|
|
@menu
|
|
* Contact Information::
|
|
* Authors::
|
|
@end menu
|
|
|
|
|
|
@c ==================================================================
|
|
@node Contact Information, Authors, About us, About us
|
|
@section Contact information
|
|
|
|
tinc's main page is at @url{http://tinc.nl.linux.org/},
|
|
this server is located in the Netherlands.
|
|
|
|
We have an IRC channel on the Open Projects IRC network. Connect to
|
|
@uref{http://openprojects.nu/services/irc.html, irc.openprojects.net},
|
|
and join channel #tinc.
|
|
|
|
|
|
@c ==================================================================
|
|
@node Authors, , Contact Information, About us
|
|
@section Authors
|
|
|
|
@table @asis
|
|
@item Ivo Timmermans (zarq) (@email{itimmermans@@bigfoot.com})
|
|
Main coder/hacker and maintainer of the package.
|
|
|
|
@item Guus Sliepen (guus) (@email{guus@@sliepen.warande.net})
|
|
Originator of it all, co-author.
|
|
|
|
@item Wessel Dankers (Ubiq) (@email{wsl@@nl.linux.org})
|
|
For the name `tinc' and various suggestions.
|
|
|
|
@end table
|
|
|
|
We have received a lot of valuable input from users. With their help,
|
|
tinc has become the flexible and robust tool that it is today. We have
|
|
composed a list of contributions, in the file called @file{THANKS} in
|
|
the source distribution.
|
|
|
|
|
|
@c ==================================================================
|
|
@node Concept Index, , About us, Top
|
|
@c node-name, next, previous, up
|
|
@unnumbered Concept Index
|
|
|
|
@c ==================================================================
|
|
@printindex cp
|
|
|
|
|
|
@c ==================================================================
|
|
@contents
|
|
@bye
|
|
|