Merging of the entire pre5 branch.

This commit is contained in:
Guus Sliepen 2002-02-10 21:57:54 +00:00
parent c2752b961c
commit f0aa9641e8
70 changed files with 2575 additions and 4056 deletions

View file

@ -5,7 +5,6 @@ Ivo Timmermans <itimmermans@bigfoot.com>
These files are from other sources:
* lib/pidfile.h and lib/pidfile.c are by Martin Schulze, taken from
the syslog 1.3 sources.
* lib/dropin.c has various parts taken from OpenSSH.
Also some of the macro files in the directory m4, and their
accompanying files in lib, were taken from GNU fileutils.

View file

@ -2,7 +2,7 @@
AUTOMAKE_OPTIONS = gnu
SUBDIRS = m4 intl lib src doc po redhat
SUBDIRS = m4 intl lib src doc po
ACLOCAL_AMFLAGS =

23
NEWS
View file

@ -1,4 +1,25 @@
version 1.0pre4 Jan 17 2000
version 1.0pre5 Feb 9 2002
* Security enhancements:
* Added sequence number and optional message authentication code to
the packets.
* Configurable encryption cipher and digest algorithms.
* More robust handling of dis- and reconnects.
* Added a "switch" and a "hub" mode to allow bridging setups.
* Preliminary support for routing of IPv6 packets.
* Supports Linux, FreeBSD, OpenBSD and Solaris.
It looks like this might be the last release before 1.0.
version 1.0pre4 Jan 17 2001
* Updated documentation; the documentation now reflects the
configuration as it is.

48
README
View file

@ -1,7 +1,7 @@
This is the README file for tinc version 1.0pre4. Installation
This is the README file for tinc version 1.0pre5. Installation
instructions may be found in the INSTALL file.
tinc is Copyright (C) 1998-2001 by:
tinc is Copyright (C) 1998-2002 by:
Ivo Timmermans <itimmermans@bigfoot.com>,
Guus Sliepen <guus@sliepen.warande.net>,
@ -18,12 +18,16 @@ your option) any later version. See the file COPYING for more details.
Security statement
------------------
In august 2000, we discovered the existence of a security hole in all
versions of tinc up to and including 1.0pre2. This had to do with the
way we exchanged keys. Since then, we have been working on a new
authentication scheme to make tinc as secure as possible. The current
version uses the OpenSSL library and does authentication in much the
same way as the SSH protocol does.
In August 2000, we discovered the existence of a security hole in all versions
of tinc up to and including 1.0pre2. This had to do with the way we exchanged
keys. Since then, we have been working on a new authentication scheme to make
tinc as secure as possible. The current version uses the OpenSSL library and
uses strong authentication with RSA keys.
On the 29th of December 2001, Jerome Etienne posted a security analysis of tinc
1.0pre4. Due to a lack of sequence numbers and a message authentication code
for each packet, an attacker could possibly disrupt certain network services or
launch a denial of service attack by replaying intercepted packets.
Cryptography is a hard thing to get right. We cannot make any
guarantees. Time, review and feedback are the only things that can
@ -31,6 +35,14 @@ prove the security of any cryptographic product. If you wish to review
tinc or give us feedback, you are stronly encouraged to do so.
Changes to configuration file format
------------------------------------
Some configuration variables have different names now. Most notably "TapDevice"
should be changed into "Device", and "Device" should be changed into
"BindToDevice".
Requirements
------------
@ -41,6 +53,9 @@ this library is not installed on you system, configure will fail. The
manual in doc/tinc.texi contains more detailed information on how to
install this library.
In order to compile tinc, you will also need autoconf, automake, GNU make, m4
and gettext.
Features
--------
@ -68,3 +83,20 @@ This version supports multiple subnets at once. They are also sorted
on subnet mask size. This means that it is possible to have
overlapping subnets on the VPN, as long as their subnet mask sizes
differ.
Since pre5, tinc can operate in several routing modes. The default mode,
"router", works exactly like the older version, and uses Subnet lines to
determine the destination of packets. The other two modes, "switch" and "hub",
allow the tinc daemons to work together like a single network switch or hub.
This is useful for bridging networks.
The algorithms used for encryption and generating message authentication codes
can now be changed in the configuration files. All cipher and digest algorithms
supported by OpenSSL can be used. Useful ciphers are "blowfish" (default),
"bf-ofb", "des", "des3", etcetera. Useful digests are "sha1" (default), "md5",
etcetera.
Preliminary support for routing IPv6 packets has been added. Just add Subnet
lines with IPv6 addresses (without using :: abbreviations) and use ifconfig to
give the virtual network interface corresponding IPv6 addresses.
Autoconfiguration will not work in router mode.

1
THANKS
View file

@ -16,6 +16,7 @@ We would like to thank
* Matias Carrasco (for the Spanish translation of the manual)
* Jamie Briggs (for finding a lot of socket leaks)
* Armijn Hemel (for being our very own PR manager)
* Jerome Etienne (for a thorough security analysis of tinc)
for their help, support and ideas. Thank you guys!

26
TODO
View file

@ -1,27 +1,5 @@
TODO LIST
Goals for 1.0 release:
1.0:
* Check Solaris port
* Check FreeBSD port again (done)
* Check TCPonly and IndirectData
* Check different linux architectures (x86, alpha and sparc32 done)
* Store private key in a separate file (done, 1 dec 2000)
* Sanity checks on configuration directory (mostly done)
* Use efficient tree algorithms instead of linked lists (done)
* Reenable queues for delayed packets (done)
* Merge documentation files (SECURITY, INSTALL, PROTOCOL) into tinc.texi (done)
* Different authentication scheme (done)
* Add randomness to packet headers and PING/PONG requests (done)
Goals for future releases:
* Compression
* Routing by MAC/switching (allows for more than only IPv4) (done)
* Broadcast/multicast (done)
* Windowing, chaffing, scattering, background noise
* ABC protocol (superscalabilty)
* Proxy ARP (done)
* Easy setup scripts (graphical?)
* Threading
* A nice, secure and stable release

View file

@ -36,7 +36,6 @@
/* Define to 1 if you have the stpcpy function. */
#undef HAVE_STPCPY
/* For getopt */
#if HAVE_STDLIB_H
# define getopt system_getopt
@ -68,5 +67,5 @@
/* Define to 1 if checkpoint tracing is enabled */
#undef ENABLE_TRACING
/* Define to 1 if you have struct addrinfo */
#undef HAVE_STRUCT_ADDRINFO
/* Define to enable use of old SSLeay_add_all_algorithms() function */
#undef HAVE_SSLEAY_ADD_ALL_ALGORITHMS

View file

@ -1,6 +1,6 @@
dnl Process this file with autoconf to produce a configure script.
dnl $Id: configure.in,v 1.13.2.38 2001/11/15 23:49:46 zarq Exp $
dnl $Id: configure.in,v 1.13.2.39 2002/02/10 21:57:51 guus Exp $
AC_INIT(src/tincd.c)
AM_INIT_AUTOMAKE(tinc, 1.0-cvs)
@ -36,19 +36,19 @@ AC_CANONICAL_HOST
case $host_os in
*linux*)
AC_DEFINE(HAVE_LINUX)
[ ln -sf linux/device.c src/device.c ]
[ rm -f src/device.c; ln -sf linux/device.c src/device.c ]
;;
*freebsd*)
AC_DEFINE(HAVE_FREEBSD)
[ ln -sf freebsd/device.c src/device.c ]
[ rm -f src/device.c; ln -sf freebsd/device.c src/device.c ]
;;
*solaris*)
AC_DEFINE(HAVE_SOLARIS)
[ ln -sf solaris/device.c src/device.c ]
[ rm -f src/device.c; ln -sf solaris/device.c src/device.c ]
;;
*openbsd*)
AC_DEFINE(HAVE_OPENBSD)
[ ln -sf openbsd/device.c src/device.c ]
[ rm -f src/device.c; ln -sf openbsd/device.c src/device.c ]
;;
esac
@ -68,28 +68,12 @@ AC_TYPE_SIZE_T
AC_HEADER_TIME
AC_STRUCT_TM
AC_CACHE_CHECK([for struct addrinfo], ac_cv_have_struct_addrinfo, [
AC_TRY_COMPILE(
[
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
],
[ struct addrinfo s; s.ai_flags = 0; ],
[ ac_cv_have_struct_addrinfo="yes" ],
[ ac_cv_have_struct_addrinfo="no" ]
)])
if test "x$ac_cv_have_struct_addrinfo" = "xyes" ; then
AC_DEFINE(HAVE_STRUCT_ADDRINFO)
fi
dnl Checks for library functions.
AC_FUNC_MEMCMP
AC_FUNC_ALLOCA
AC_TYPE_SIGNAL
AC_CHECK_FUNCS([ftime socket select strtol strerror flock unsetenv \
asprintf putenv strdup fcloseall daemon strsignal get_current_dir_name \
getaddrinfo getnameinfo gai_strerror freeaddrinfo])
asprintf putenv strdup fcloseall daemon strsignal get_current_dir_name])
jm_FUNC_MALLOC
jm_FUNC_REALLOC
@ -127,5 +111,6 @@ intl/Makefile
lib/Makefile
m4/Makefile
po/Makefile.in
redhat/Makefile
debian/Makefile)
po/POTFILES
po/Makefile
)

2
debian/.cvsignore vendored
View file

@ -1,2 +0,0 @@
Makefile Makefile.in tmp postinst.debhelper postrm.debhelper
preinst.debhelper prerm.debhelper substvars files

3
debian/Makefile.am vendored
View file

@ -1,3 +0,0 @@
EXTRA_DIST = README.Debian changelog conffiles control copyright dirs \
docs info init.d postinst rules doc-base.tinc tinc-up tinc-down \
tinc.modules

10
debian/README.Debian vendored
View file

@ -1,10 +0,0 @@
tinc for Debian
----------------------
The manual for tinc is also available as info pages, type `info tinc'
to read it.
The system startup script for tinc, /etc/init.d/tinc, uses the file
/etc/tinc/nets.boot to find out which networks have to be started.
-- Ivo Timmermans <itimmermans@bigfoot.com>, Wed, 31 May 2000, 19:56:05 +0200

68
debian/changelog vendored
View file

@ -1,68 +0,0 @@
tinc (1.0pre4-1) unstable; urgency=low
* New upstream version.
-- Ivo Timmermans <ivo@debian.org> Wed, 17 Jan 2001 02:42:49 +0100
tinc (1.0pre3-2) unstable; urgency=low
* Set architecture to any (Closes: #80451).
* Added tinc.modules with some useful module aliases.
-- Ivo Timmermans <ivo@debian.org> Sat, 13 Jan 2001 16:10:57 +0100
tinc (1.0pre3-1) unstable; urgency=low
* New upstream version (1.0pre3) (Closes: #71274).
* Better Depends and Build-Depends lines.
* Dropped dependencies on libgmp, added libssl.
* doc-base.tinc: New file.
* Deleted the file shlibs, as there on longer is a libblowfish.
* Patch po/Makefile.in.in from po-Makefile.in.in.diff if necessary.
* Use dh_perl to get accurate perl dependencies.
-- Ivo Timmermans <ivo@debian.org> Thu, 9 Nov 2000 21:58:40 +0100
tinc (1.0pre2-1.1) unstable; urgency=low
* NMU at Ivo's request as his application is being processed, and his
sponsor is based in the US.
-- J.H.M. Dassen (Ray) <jdassen@debian.org> Wed, 28 Jun 2000 21:52:30 +0200
tinc (1.0pre2-1) unstable; urgency=low
* postinst creates a file /etc/tinc/nets.boot, containing all networks
to be started upon system startup;
* init.d script starts all networks from that list.
* postinst script creates tap devices.
-- Ivo Timmermans <itimmermans@bigfoot.com> Tue, 16 May 2000 00:06:25 +0200
tinc (1.0pre1-0.4) unstable; urgency=low
* postinst script.
-- Ivo Timmermans <itimmermans@bigfoot.com> Mon, 15 May 2000 19:22:05 +0200
tinc (1.0pre1-0.3) unstable; urgency=low
* system startup script.
-- Ivo Timmermans <itimmermans@bigfoot.com> Sun, 14 May 2000 22:58:02 +0200
tinc (1.0pre1-0.2) unstable; urgency=low
* Included the blowfish license.
-- Ivo Timmermans <itimmermans@bigfoot.com> Fri, 21 Apr 2000 17:07:50 +0200
tinc (1.0pre1-0.1) unstable; urgency=low
* Initial Release.
-- Ivo Timmermans <itimmermans@bigfoot.com> Fri, 21 Apr 2000 17:07:50 +0200
Local variables:
mode: debian-changelog
End:

5
debian/conffiles vendored
View file

@ -1,5 +0,0 @@
/etc/tinc/example/tinc.conf
/etc/tinc/example/tinc-down
/etc/tinc/example/tinc-up
/etc/modutils/tinc
/etc/init.d/tinc

20
debian/control vendored
View file

@ -1,20 +0,0 @@
Source: tinc
Section: non-US/main
Priority: optional
Maintainer: Ivo Timmermans <ivo@debian.org>
Standards-Version: 3.0.1
Build-Depends: libssl-dev, autoconf (>= 2.12),
automake, debhelper, gettext
Package: tinc
Architecture: all
Depends: ${shlibs:Depends}, ${perl:Depends}
Description: Virtual Private Network daemon
tinc is a daemon with which you can create a virtual private network
(VPN). One daemon can handle multiple connections, so you can
create an entire (moderately sized) VPN with only one daemon per
participating computer.
.
You need to have two kernel modules installed, on a Debian system
they should already be there. If they are not, the manual will
explain you how to do that.

63
debian/copyright vendored
View file

@ -1,63 +0,0 @@
This package was debianized by Ivo Timmermans <itimmermans@bigfoot.com> on
Fri, 21 Apr 2000 17:07:50 +0200.
It was downloaded from http://tinc.nl.linux.org/
Upstream Author(s):
Ivo Timmermans <itimmermans@bigfoot.com>
Guus Sliepen <guus@sliepen.warande.net>
Copyright: GPL version 2. On Debian GNU/Linux systems, the complete
text of the GNU General Public License can be found in
/usr/share/common-licenses/GPL.
The blowfish library is from the libssl package by Eric Young. The
copyright notice for this library follows.
----------------------------------------------------------------------
Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au)
All rights reserved.
This package is an Blowfish implementation written
by Eric Young (eay@mincom.oz.au).
This library is free for commercial and non-commercial use as long as
the following conditions are aheared to. The following conditions
apply to all code found in this distribution.
Copyright remains Eric Young's, and as such any Copyright notices in
the code are not to be removed.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. All advertising materials mentioning features or use of this software
must display the following acknowledgement:
This product includes software developed by Eric Young (eay@mincom.oz.au)
THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
The license and distribution terms for any publically available version or
derivative of this code cannot be changed. i.e. this code cannot simply be
copied and put under another distrubution license
[including the GNU Public License.]
The reason behind this being stated in this direct manner is past
experience in code simply being copied and the attribution removed
from it and then being distributed as part of other packages. This
implementation was a non-trivial and unpaid effort.

2
debian/dirs vendored
View file

@ -1,2 +0,0 @@
etc/tinc
etc/tinc/example

10
debian/doc-base.tinc vendored
View file

@ -1,10 +0,0 @@
Document: tinc
Title: tinc Manual
Author: Ivo Timmermans, Guus Sliepen
Abstract: This manual describes how to set up a Virtual Private
Network with tinc.
Section: net
Format: HTML
Files: /usr/share/doc/tinc/tinc*.html
Index: /usr/share/doc/tinc/tinc_toc.html

3
debian/docs vendored
View file

@ -1,3 +0,0 @@
INSTALL
NEWS
README

1
debian/info vendored
View file

@ -1 +0,0 @@
doc/tinc.info

66
debian/init.d vendored
View file

@ -1,66 +0,0 @@
#! /bin/sh
#
# System startup script for tinc
# $Id: init.d,v 1.14.2.4 2000/12/05 09:03:41 zarq Exp $
#
# Based on Lubomir Bulej's Redhat init script.
#
# Create a file $NETSFILE (/etc/tinc/nets.boot), and put all the names of
# the networks in there. These names must be valid directory names under
# $TCONF (/etc/tinc). Lines starting with a # will be ignored in this
# file.
#
DAEMON="/usr/sbin/tincd"
NAME="tinc"
DESC="tinc daemons"
TCONF="/etc/tinc"
EXTRA=""
NETSFILE="$TCONF/nets.boot"
NETS=""
test -f $DAEMON || exit 0
find_nets () {
if [ ! -f $NETSFILE ] ; then
echo "Please create $NETSFILE."
exit 0
fi
NETS="`egrep '^[ ]*[a-zA-Z0-9_]+[ ]*$' $NETSFILE`"
}
case "$1" in
start)
find_nets
echo -n "Starting $DESC:"
for n in $NETS ; do
echo -n " $n"
$DAEMON -n $n $EXTRA
done
echo "."
;;
stop)
find_nets
echo -n "Stopping $DESC:"
for n in $NETS ; do
echo -n " $n"
$DAEMON -n $n $EXTRA -k
done
echo "."
;;
restart|force-reload)
find_nets
echo -n "Restarting $DESC:"
for n in $NETS ; do
echo -n " $n"
$DAEMON -n $n $EXTRA -k
sleep 1
$DAEMON -n $n $EXTRA
done
echo "."
;;
*)
echo "Usage: /etc/init.d/$NAME {start|stop|restart|force-reload}"
exit 1
;;
esac

View file

@ -1,32 +0,0 @@
--- Makefile.in.in.orig Thu Nov 2 20:02:58 2000
+++ Makefile.in.in Thu Nov 2 23:25:42 2000
@@ -24,6 +24,8 @@
gettextsrcdir = $(prefix)/share/gettext/po
subdir = po
+DESTDIR =
+
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
MKINSTALLDIRS = $(top_srcdir)/@MKINSTALLDIRS@
@@ -111,16 +113,16 @@
install-data-no: all
install-data-yes: all
if test -r "$(MKINSTALLDIRS)"; then \
- $(MKINSTALLDIRS) $(datadir); \
+ $(MKINSTALLDIRS) $(DESTDIR)$(datadir); \
else \
- $(SHELL) $(top_srcdir)/mkinstalldirs $(datadir); \
+ $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(datadir); \
fi
@catalogs='$(CATALOGS)'; \
for cat in $$catalogs; do \
cat=`basename $$cat`; \
case "$$cat" in \
- *.gmo) destdir=$(gnulocaledir);; \
- *) destdir=$(localedir);; \
+ *.gmo) destdir=$(DESTDIR)$(gnulocaledir);; \
+ *) destdir=$(DESTDIR)$(localedir);; \
esac; \
lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
dir=$$destdir/$$lang/LC_MESSAGES; \

70
debian/postinst vendored
View file

@ -1,70 +0,0 @@
#! /bin/sh
# postinst script for tinc
#
# $Id: postinst,v 1.6.4.1 2000/12/05 09:04:32 zarq Exp $
#
# see: dh_installdeb(1)
TCONF="/etc/tinc"
NETSFILE="$TCONF/nets.boot"
set -e
# summary of how this script can be called:
# * <postinst> `configure' <most-recently-configured-version>
# * <old-postinst> `abort-upgrade' <new version>
# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
# <new-version>
# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
# <failed-install-package> <version> `removing'
# <conflicting-package> <version>
# for details, see /usr/doc/packaging-manual/
#
# quoting from the policy:
# Any necessary prompting should almost always be confined to the
# post-installation script, and should be protected with a conditional
# so that unnecessary prompting doesn't happen if a package's
# installation fails and the `postinst' is called with `abort-upgrade',
# `abort-remove' or `abort-deconfigure'.
case "$1" in
configure)
if [ ! -e /dev/.devfs ] ; then
devices_exist=1
for d in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
test -e /dev/tap$d || devices_exist=0
done
if [ $devices_exist -eq 0 ] ; then
cd /dev && ./MAKEDEV netlink || true
fi
fi
if [ ! -e $NETSFILE ] ; then
echo "## This file contains all names of the networks to be started on system startup." > $NETSFILE
fi
if fgrep -q PublicKey `find /etc/tinc -type f` ; then
echo "If you are upgrading from version 1.0pre3, make sure you"
echo "regenerate the host keys. For more information, refer to"
echo "/usr/share/doc/tinc/UPGRADING.txt."
fi
;;
abort-upgrade|abort-remove|abort-deconfigure)
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 0
;;
esac
# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.
#DEBHELPER#
exit 0

78
debian/rules vendored
View file

@ -1,78 +0,0 @@
#!/usr/bin/make -f
# Sample debian/rules that uses debhelper.
# GNU copyright 1997 to 1999 by Joey Hess.
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
# This is the debhelper compatability version to use.
export DH_COMPAT=1
build: build-stamp
build-stamp:
dh_testdir
# # If the Makefile.in.in file in po/ already contains DESTDIR support, skip the patching.
cd `pwd`/po ; ( \
if ! grep DESTDIR Makefile.in.in > /dev/null ; then \
patch -Ns -p0 < `pwd`/../debian/po-Makefile.in.in.diff || true ;\
fi ;\
)
env CFLAGS='-O2 -Wall' ./autogen.sh --prefix=/usr --mandir=\$${prefix}/share/man \
--infodir=\$${prefix}/share/info --sysconfdir=/etc --localstatedir=/var
$(MAKE)
touch build-stamp
clean:
dh_testdir
dh_testroot
rm -f build-stamp
-$(MAKE) cvs-clean
dh_clean
install: build
dh_testdir
dh_testroot
dh_clean -k
dh_installdirs
$(MAKE) install DESTDIR=`pwd`/debian/tmp
mkdir -p `pwd`/debian/tmp/etc/tinc
cp -a doc/sample-config.tar.gz `pwd`/debian/tmp/etc/tinc/example
cd `pwd`/debian/tmp/etc/tinc/example && tar xzf sample-config.tar.gz && rm sample-config.tar.gz
ln -s /usr/share/doc/tinc/README.Debian `pwd`/debian/tmp/etc/tinc/example/README
# Build architecture-independent files here.
binary-indep: build install
# We have nothing to do by default.
# Build architecture-dependent files here.
binary-arch: build install
dh_testdir
dh_testroot
dh_installdocs
dh_installexamples
dh_installinit
dh_installmanpages
dh_installmodules
dh_installinfo
dh_installchangelogs ChangeLog
dh_link
dh_strip
dh_compress
dh_fixperms
dh_installdeb
dh_perl
dh_shlibdeps
dh_gencontrol
dh_md5sums
dh_builddeb
binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install

13
debian/tinc.modules vendored
View file

@ -1,13 +0,0 @@
alias char-major-36 netlink_dev
alias tap0 ethertap
alias tap1 ethertap
alias tap2 ethertap
alias tap3 ethertap
options tap0 -o tap0 -x unit=0
options tap1 -o tap1 -x unit=1
options tap2 -o tap2 -x unit=2
options tap3 -o tap3 -x unit=3
alias char-major-10-200 tun

View file

@ -1,7 +1,7 @@
This document describes how nodes in a VPN find and connect to eachother and
maintain a stable network.
Copyright 2001 Guus Sliepen <guus@sliepen.warande.net>
Copyright 2001-2002 Guus Sliepen <guus@sliepen.warande.net>
Permission is granted to make and distribute verbatim copies of
this documentation provided the copyright notice and this
@ -12,7 +12,7 @@ maintain a stable network.
provided that the entire resulting derived work is distributed
under the terms of a permission notice identical to this one.
$Id: CONNECTIVITY,v 1.1.2.7 2001/07/24 08:51:36 guus Exp $
$Id: CONNECTIVITY,v 1.1.2.8 2002/02/10 21:57:51 guus Exp $
1. Problem
==========

View file

@ -1,7 +1,7 @@
This is the network infrastructure documentation for tinc, a Virtual Private
Network daemon.
Copyright 2001 Guus Sliepen <guus@sliepen.warande.net>
Copyright 2001-2002 Guus Sliepen <guus@sliepen.warande.net>
Permission is granted to make and distribute verbatim copies of
this documentation provided the copyright notice and this
@ -12,7 +12,7 @@ Network daemon.
provided that the entire resulting derived work is distributed
under the terms of a permission notice identical to this one.
$Id: NETWORKING,v 1.1.2.1 2001/03/04 14:00:24 guus Exp $
$Id: NETWORKING,v 1.1.2.2 2002/02/10 21:57:51 guus Exp $
1. Packet flow
==============

View file

@ -1,7 +1,7 @@
This is the protocol documentation for tinc, a Virtual Private Network daemon.
Copyright 2000,2001 Guus Sliepen <guus@sliepen.warande.net>,
2000,2001 Ivo Timmmermans <itimmermans@bigfoot.com>
Copyright 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
2000-2002 Ivo Timmmermans <itimmermans@bigfoot.com>
Permission is granted to make and distribute verbatim copies of
this documentation provided the copyright notice and this
@ -12,7 +12,7 @@ This is the protocol documentation for tinc, a Virtual Private Network daemon.
provided that the entire resulting derived work is distributed
under the terms of a permission notice identical to this one.
$Id: PROTOCOL,v 1.1.2.4 2001/01/07 17:08:02 guus Exp $
$Id: PROTOCOL,v 1.1.2.5 2002/02/10 21:57:51 guus Exp $
1. Protocols used in tinc
@ -33,17 +33,19 @@ can be found in various UNIX flavours.
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 is 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.
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
| LEN | DATA : \
: DATA . } encrypted
. : /
.
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
----------------
@ -59,7 +61,7 @@ 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 SECURITY file. After a
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
@ -67,19 +69,23 @@ synchronised.
daemon message
--------------------------------------------------------------------------
origin ADD_HOST daemon a329e18c:655 0
| | +--> options
| +---------> real address:port
+-------------------> name of new tinc daemon
origin ADD_SUBNET daemon 1,0a010100/ffffff00
| | | +--> netmask
| | +----------> vpn IPv4 network address
| +----------------> subnet type (1=IPv4)
+--------------------> owner of this subnet
origin ADD_EDGE node1 12.23.34.45 655 node2 21.32.43.54 655 222 0
| | | \___________________/ | +-> options
| | | | +----> weight
| | | +----------------> see below
| | +--> UDP port
| +----------> real address
+------------------> name of node on one side of the edge
origin ADD_SUBNET node 192.168.1.0/24
| | +--> masklength
| +--------> IPv4 network address
+------------------> owner of this subnet
--------------------------------------------------------------------------
In case daemons leave the VPN, DEL_HOST and DEL_SUBNET messages with exactly
the same syntax are sent to inform the other daemons of the departure.
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.
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
@ -87,18 +93,22 @@ 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 it's copy back to the requestor.
act as a proxy and forward its copy back to the requestor.
daemon message
--------------------------------------------------------------------------
daemon REQ_KEY origin destination
| +--> name of the tinc daemon it wants the key from
+----------> name of the daemon that wants the key
daemon ANS_KEY origin destination e4ae0b0a82d6e0078179b5290c62c7d0
| | \______________________________/
| | +--> 128 bits key
daemon 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
daemon KEY_CHANGED origin
+--> daemon that has changed it's packet key
--------------------------------------------------------------------------

View file

@ -1,7 +1,7 @@
This is the security documentation for tinc, a Virtual Private Network daemon.
Copyright 2001 Guus Sliepen <guus@sliepen.warande.net>,
2001 Wessel Dankers <wsl@nl.linux.org>
Copyright 2001-2002 Guus Sliepen <guus@sliepen.warande.net>,
2001-2002 Wessel Dankers <wsl@nl.linux.org>
Permission is granted to make and distribute verbatim copies of
this documentation provided the copyright notice and this
@ -12,7 +12,7 @@ This is the security documentation for tinc, a Virtual Private Network daemon.
provided that the entire resulting derived work is distributed
under the terms of a permission notice identical to this one.
$Id: SECURITY2,v 1.1.2.1 2001/02/13 09:54:29 guus Exp $
$Id: SECURITY2,v 1.1.2.2 2002/02/10 21:57:51 guus Exp $
Proposed new authentication scheme
----------------------------------
@ -27,13 +27,11 @@ client <attempts connection>
server <accepts connection>
client ID client 9 0
| | +-> options
client ID client 12
| +---> version
+-------> name of tinc daemon
server ID server 9 0
| | +-> options
server ID server 12
| +---> version
+-------> name of tinc daemon
@ -64,6 +62,21 @@ client CHAL_REPLY 816a86
server CHAL_REPLY 928ffe
+-> 160 bits SHA1 of H1
After the correct challenge replies are recieved, both ends have proved
their identity. Further information is exchanged.
client ACK 655 12.23.34.45 123 0
| | | +-> options
| | +----> estimated weight
| +------------> IP address of server as seen by client
+--------------------> UDP port of client
server ACK 655 21.32.43.54 321 0
| | | +-> options
| | +----> estimated weight
| +------------> IP address of client as seen by server
+--------------------> UDP port of server
--------------------------------------------------------------------------
This new scheme has several improvements, both in efficiency and security.
@ -107,9 +120,6 @@ Fourth: the first thing that is send via the symmetric cipher encrypted
connection is a totally random string, so that there is no known plaintext (for
an attacker) in the beginning of the encrypted stream.
An explicit ACK is no longer needed, the CHAL_REPLY serves as an ACK.
Some things to be discussed:
- What should CHALLEN be? Same as RSAKEYLEN? 256 bits? More/less?

View file

@ -1,7 +1,4 @@
#!/bin/sh
# This file closes down the tap device.
# Note that if you use the universal tun/tap driver, you don't
# need to do anything; once tinc quits the tap device is already
# removed by the kernel.
ifconfig tap1 down
ifconfig $INTERFACE down

View file

@ -2,13 +2,14 @@
# This file sets up the tap device.
# It gives you the freedom to do anything you want with it.
# Use the correct name for the tap device:
# For ethertap this is tap0, tap1, tap2 etcetera,
# but for the universal tun/tap device use $NETNAME.
# For the Linux tun/tap device $INTERFACE is set to the right name,
# but for ethertap and FreeBSD this is tap0, tap1, tap2 etcetera,
# for Solaris and OpenBSD it is tun0, tun1, etcetera.
# Set hardware ethernet address (required!)
ifconfig tap1 hw ether fe:fd:0:0:0:0
ifconfig $INTERFACE hw ether fe:fd:0:0:0:0
# Give it the right ip and netmask. Remember, the subnet of the
# tap device must be larger than that of the individual Subnets
# as defined in the host configuration file!
ifconfig tap1 192.168.1.1 netmask 255.255.0.0 -arp
ifconfig $INTERFACE 192.168.1.1 netmask 255.255.0.0 -arp

View file

@ -16,8 +16,10 @@ Name = alpha
ConnectTo = beta
# The tap device tinc will use. Required.
# Default is /dev/tap0
TapDevice = /dev/tap1
# Default is /dev/tap0 for ethertap or FreeBSD,
# /dev/tun0 for Solaris and OpenBSD,
# and /dev/misc/net/tun for Linux tun/tap device.
Device = /dev/misc/net/tun
# The file in which the private key for this host is stored. Required.
PrivateKeyFile = /etc/tinc/example/rsa_key.priv

View file

@ -1,246 +1,322 @@
.TH TINC 5 "Jan 2001" "tinc version 1.0pre4" "FSF"
.SH NAME
tinc.conf \- tinc daemon configuration
.SH "DESCRIPTION"
The files in the \fI/etc/tinc\fR directory contain runtime and
security information for the \fBtincd\fR(8) daemon.
.PP
.SH "NETWORKS"
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 \fI-c\fR option.
We have thought of another way of dealing with this: network
names. This means that you call \fBtincd\fR with the \fI-n\fR argument,
which will assign a name to this daemon.
The effect of this is that the daemon will set its configuration
``root'' to \fI/etc/tinc/\fBnetname\fI/\fR, where \fBnetname\fR is your argument
to the \fI-n\fR option. You'll notice that it appears in syslog as
``tincd.\fBnetname\fR''.
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 \fI/etc/tinc/\fR,
instead of \fI/etc/tinc/\fBnetname\fI/\fR; the configuration file should be
\fI/etc/tinc/tinc.conf\fR, and the passphrases are now expected to be
in \fI/etc/tinc/passphrases/\fR.
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.
.PP
.SH "NAMES"
Each tinc daemon should have a name that is unique in the network which
it will be part of. The name will be used by other tinc daemons for
identification. The name has to be declared in the
\fI/etc/tinc/\fBnetname\fI/tinc.conf\fR file.
To make things easy, choose something that will give unique and easy
to rememebr names to your tinc daemon(s).
.Dd 2002-02-06
.Dt TINC.CONF 5
.\" Manual page created by:
.\" Ivo Timmermans <itimmermans@bigfoot.com>
.\" Guus Sliepen <guus@sliepen.warande.net>
.Sh NAME
.Nm tinc.conf
.Nd tinc daemon configuration
.Sh DESCRIPTION
The files in the
.Pa /etc/tinc/
directory contain runtime and security information for the tinc daemon.
.Sh NETWORKS
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
.Fl c
option.
.Pp
We have thought of another way of dealing with this: network names.
This means that you call
.Nm
with the
.Fl n
option, which will assign a name to this daemon.
.Pp
The effect of this is that the daemon will set its configuration root to
.Pa /etc/tinc/ Ns Ar NETNAME Ns Pa / ,
where
.Ar NETNAME
is your argument to the
.Fl n
option.
You'll notice that messages appear in syslog as coming from
.Nm tincd. Ns Ar NETNAME .
.Pp
However, it is not strictly necessary that you call tinc with the
.Fl n
option.
In this case, the network name would just be empty,
and it will be used as such.
.Nm tinc
now looks for files in
.Pa /etc/tinc/ ,
instead of
.Pa /etc/tinc/ Ns Ar NETNAME Ns Pa / ;
the configuration file should be
.Pa /etc/tinc/tinc.conf ,
and the host configuration files are now expected to be in
.Pa /etc/tinc/hosts/ .
.Pp
But it is highly recommended that you use this feature of
.Nm tinc ,
because it will be so much clearer whom your daemon talks to.
Hence, we will assume that you use it.
.Sh NAMES
Each tinc daemon should have a name that is unique in the network which it will be part of.
The name will be used by other tinc daemons for identification.
The name has to be declared in the
.Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /tinc.conf
file.
.Pp
To make things easy,
choose something that will give unique and easy to remember names to your tinc daemon(s).
You could try things like hostnames, owner surnames or location names.
.PP
.SH "PUBLIC/PRIVATE KEYS"
You should use \fBtincd --generate-keys\fR to generate public/private
keypairs. It will generate two keys. The private
key should be stored in a separate file \fI/etc/tinc/\fBnetname\fI/rsa_key.priv\fR
\-\- where \fBnetname\fR stands for the network (See under \fBNETWORKS\fR)
above. The public key should be stored in
the host configuration file \fI/etc/tinc/\fBnetname\fI/hosts/\fBname\fR \-\- where \fBname\fR stands
for the name of the local tinc daemon (See \fBNAMES\fR).
.PP
.SH "SERVER CONFIGURATION"
.Sh PUBLIC/PRIVATE KEYS
You should use
.Ic tincd -K
to generate public/private keypairs.
It will generate two keys.
The private key should be stored in a separate file
.Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /rsa_key.priv
\-\- where
.Ar NETNAME
stands for the network (see
.Sx NETWORKS )
above.
The public key should be stored in the host configuration file
.Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /hosts/ Ns Va NAME
\-\- where
.Va NAME
stands for the name of the local tinc daemon (see
.Sx NAMES ) .
.Sh SERVER CONFIGURATION
The server configuration of the daemon is done in the file
\fI/etc/tinc/\fBnetname\fI/tinc.conf\fR.
This file consists of comments (lines started with a \fB#\fR) or
assignments in the form of
.PP
.Vb 1
\& \fIVariable \fB= \fIValue\fR.
.Ve
.PP
.Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /tinc.conf .
This file consists of comments (lines started with a
.Li # )
or assignments in the form of:
.Pp
.Va Variable Li = Ar Value .
.Pp
The variable names are case insensitive, and any spaces, tabs,
newlines and carriage returns are ignored. \fINote\fR: it is not
required that you put in the \fB=\fR sign, but doing so improves
readability. If you leave it out, remember to replace it with at least
one space character.
.PP
Here are all valid variables, listed in alphabetical order. The default
value is given between parentheses.
.TP
\fBConnectTo\fR = <\fIname\fR>
Specifies which host to connect to on startup. Multiple \fBConnectTo\fR variables
may be specified, if connecting to the first one fails then tinc will try
the next one, and so on. The names should be known to this tinc daemon
(i.e., there should be a host configuration file for the name on the ConnectTo
newlines and carriage returns are ignored.
Note: it is not required that you put in the
.Li =
sign, but doing so improves readability.
If you leave it out, remember to replace it with at least one space character.
.Pp
Here are all valid variables, listed in alphabetical order.
The default value is given between parentheses.
.Bl -tag -width indent
.It Va BindToInterface Li = Ar interface Bq experimental
If your computer has more than one network interface,
.Nm tinc
will by default listen on all of them for incoming connections.
It is possible to bind only to a single interface with this variable.
.Pp
This option may not work on all platforms.
.It Va BindToIP Li = Ar address Bq experimental
If your computer has more than one IP address on a single interface
(for example if you are running virtual hosts),
.Nm tinc
will by default listen on all of them for incoming connections.
It is possible to bind only 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.
.Pp
This option may not work on all platforms.
.It Va ConnectTo Li = Ar name
Specifies which other tinc daemon to connect to on startup.
Multiple
.Va ConnectTo
variables may be specified;
if connecting to the first one fails then tinc will try the next one, and so on.
The names should be known to this tinc daemon
(i.e., there should be a host configuration file for the name on the
.Va ConnectTo
line).
If you don't specify a host with \fBConnectTo\fR, tinc won't try to connect to other daemons at all,
.Pp
If you don't specify a host with
.Va ConnectTo ,
.Nm tinc
won't try to connect to other daemons at all,
and will instead just listen for incoming connections.
.TP
\fBHostnames\fR = <\fIyes|no\fR> (no)
.It Va Device Li = Ar device Po /dev/tap0 or /dev/misc/net/tun Pc
The virtual network device to use.
.Nm tinc
will automatically detect what kind of device it is.
Note that you can only use one device per daemon.
The info pages of the tinc package contain more information
about configuring the virtual network device.
.It Va Hostnames Li = yes | no Pq 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
efficiency, even stopping the daemon for a few seconds every time it does
a lookup if your DNS server is not responding.
.Pp
This does not affect resolving hostnames to IP addresses from the
host configuration files.
.TP
\fBInterface\fR = <\fIdevice\fR>
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.
.TP
\fBInterfaceIP\fR = <\fIlocal address\fR>
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.
.TP
\fBKeyExpire\fR = <\fIseconds\fR> (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.
.TP
\fBName\fR = <\fIname\fR> [required]
This is the name which identifies this tinc daemon. It must be unique for
the virtual private network this daemon will connect to.
.TP
\fBPingTimeout\fR = <\fIseconds\fR> (60)
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.
.TP
\fBPrivateKey\fR = <\fIkey\fR> [obsolete]
The private RSA key of this tinc daemon. It will allow this tinc daemon to
authenticate itself to other daemons.
.TP
\fBPrivateKeyFile\fR = <\fIfilename\fR> [recommended]
.It Va Interface Li = Ar interface
Defines the name of the interface corresponding to the virtual network device.
Depending on the operating system and the type of device this may or may not actually set the name.
Currently this option only affects the Linux tun/tap device.
.It Va KeyExpire Li = Ar period Pq 3600
This option controls the period 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.
.It Va MaxTimeout Li = Ar period Pq 900
This is the maximum delay before trying to reconnect to other tinc daemons.
.It Va Mode Li = router | switch | hub Pq router
This option selects the way packets are routed to other daemons.
.Bl -tag -width indent
.It router
In this mode
.Va Subnet
variables in the host configuration files will be used to form a routing table.
Only unicast packets of routable protocols (IPv4 and IPv6) are supported in this mode.
.It switch
In this mode the MAC addresses of the packets on the VPN will be used to
dynamically create a routing table just like a network switch does.
Unicast, multicast and broadcast packets of every Ethernet protocol are supported in this mode
at the cost of frequent broadcast ARP requests and routing table updates.
.It hub
In this mode every packet will be broadcast to the other daemons.
.El
.It Va Name Li = Ar name Bq required
This is the name which identifies this tinc daemon.
It must be unique for the virtual private network this daemon will connect to.
.It Va PingTimeout Li = Ar period Pq 60
The number of seconds of inactivity that
.Nm tinc
will wait before sending a probe to the other end.
If that other end doesn't answer within that same amount of time,
the connection is terminated,
and the others will be notified of this.
.It Va PrivateKey Li = Ar key Bq obsolete
The private RSA key of this tinc daemon.
It will allow this tinc daemon to authenticate itself to other daemons.
.It Va PrivateKeyFile Li = Ar filename Bq recommended
The file in which the private RSA key of this tinc daemon resides.
Note that there must be exactly one of \fBPrivateKey\fR or \fBPrivateKeyFile\fR
Note that there must be exactly one of
.Va PrivateKey
or
.Va PrivateKeyFile
specified in the configuration file.
.TP
\fBTapDevice\fR = <\fIdevice\fR> (/dev/tap0 or /dev/net/tun)
The ethertap or tun/tap device to use. tinc will automatically detect what
kind of tapdevice it is.
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.
.PP
.SH "HOST CONFIGURATION FILES"
The host configuration files contain all information needed to establish a
connection to those hosts. A host configuration file is also required for the
local tinc daemon, it will use it to read in it's listen port, public key and
subnets.
The idea is that these files are ``portable''. You can safely mail your own host
configuration file to someone else. That other person can then copy it to his
own hosts directory, and now his tinc daemon will be able to connect to your
tinc daemon. Since host configuration files only contain public keys, no secrets
are revealed by sending out this information.
.PP
.TP
\fBAddress\fR = <\fIIP address\fR> [recommended]
The real address or hostname of this tinc daemon.
.TP
\fBIndirectData\fR = <\fIyes\fR|\fIno\fR> (no) [experimental]
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.
.TP
\fBPort\fR = <\fIport number\fR> (655)
The port on which this tinc daemon is listening for incoming connections.
.TP
\fBPublicKey\fR = <\fIkey\fR> [obsolete]
The public RSA key of this tinc daemon. It will be used to cryptographically
verify it's identity and to set up a secure connection.
.TP
\fBPublicKeyFile\fR = <\fIfilename\fR> [obsolete]
.El
.Sh HOST CONFIGURATION FILES
The host configuration files contain all information needed
to establish a connection to those hosts.
A host configuration file is also required for the local tinc daemon,
it will use it to read in it's listen port, public key and subnets.
.Pp
The idea is that these files are portable.
You can safely mail your own host configuration file to someone else.
That other person can then copy it to his own hosts directory,
and now his tinc daemon will be able to connect to your tinc daemon.
Since host configuration files only contain public keys,
no secrets are revealed by sending out this information.
.Bl -tag -width indent
.It Va Address Li = Ar address Bq recommended
The IP address or hostname of this tinc daemon on the real network.
.It Va Cipher Li = Ar cipher Pq blowfish
The symmetric cipher algorithm used to encrypt UDP packets.
Any cipher supported by OpenSSL is recognised.
Furthermore, specifying
.Qq none
will turn off packet encryption.
.It Va Digest Li = Ar digest Pq sha1
The digest algorithm used to authenticate UDP packets.
Any digest supported by OpenSSL is recognised.
Furthermore, specifying
.Qq none
will turn off packet authentication.
.It Va IndirectData Li = yes | no Po no Pc Bq experimental
This option specifies whether other tinc daemons besides the one you specified with
.Va 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.
.It Va MACLength Li = Ar length Pq 4
The length of the message authentication code used to authenticate UDP packets.
Can be anything from
.Qq 0
up to the length of the digest produced by the digest algorithm.
.It Va Port Li = Ar port Pq 655
The port number on which this tinc daemon is listening for incoming connections.
.It Va PublicKey Li = Ar key Bq obsolete
The public RSA key of this tinc daemon.
It will be used to cryptographically verify it's identity and to set up a secure connection.
.It Va PublicKeyFile Li = Ar filename Bq obsolete
The file in which the public RSA key of this tinc daemon resides.
From version 1.0pre4 on tinc will store the public key directly into the
host configuration file in PEM format, the above two options then are not
necessary. Either the PEM format is used, or exactly
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.
.TP
\fBSubnet\fR = <\fIaddress/masklength\fR>
The subnet which this tinc daemon will serve. tinc tries to look up which other
daemon it should send a packet to by searching the appropiate subnet. If the
packet matches a subnet, it will be sent to the daemon who has this subnet in his
host configuration file. Multiple subnet lines can be specified.
At the moment, this directive is only used in the host configuration file of
the local tinc daemon itself. In upcoming versions of tinc, it will be possible to
restrict other hosts in which subnets they server.
The subnets must be in a form like \fI192.168.1.0/24\fR, where 192.168.1.0 is the
network address and 24 is the number of bits set in the netmask. Note that subnets
like \fI192.168.1.1/24\fR are invalid! Read a networking howto/FAQ/guide if you
don't understand this.
.TP
\fBTCPonly\fR = <\fIyes\fR|\fIno\fR> (no) [experimental]
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. This is
experimental code, try this at your own risk. It may not work at all.
.Pp
From version 1.0pre4 on
.Nm tinc
will store the public key directly into the host configuration file in PEM format,
the above two options then are not necessary.
Either the PEM format is used, or exactly 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.
.It Va Subnet Li = Ar address Ns Op Li / Ns Ar masklength
The subnet which this tinc daemon will serve.
.Nm tinc
tries to look up which other daemon it should send a packet to by searching the appropriate subnet.
If the packet matches a subnet,
it will be sent to the daemon who has this subnet in his host configuration file.
Multiple subnet lines can be specified.
.Pp
Subnets can either be single MAC, IPv4 or IPv6 addresses,
in which case a subnet consisting of only that single address is assumed,
or they can be a IPv4 or IPv6 network address with a masklength.
For example, IPv4 subnets must be in a form like 192.168.1.0/24,
where 192.168.1.0 is the network address and 24 is the number of bits set in the netmask.
Note that subnets like 192.168.1.1/24 are invalid!
Read a networking HOWTO/FAQ/guide if you don't understand this.
.It Va TCPOnly Li = yes | no Po no Pc Bq experimental
If this variable is set to yes,
then the packets are tunnelled over the 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.
This is experimental code, try this at your own risk.
It may not work at all.
Setting this options also implicitly sets IndirectData.
.SH "FILES"
.TP
\fI/etc/tinc/\fR
.El
.Sh FILES
.Bl -tag -width indent
.It Pa /etc/tinc/
The top directory for configuration files.
.TP
\fI/etc/tinc/\fBnetname\fI/tinc.conf\fR
.It Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /tinc.conf
The default name of the server configuration file for net
\fBnetname\fR.
.TP
\fI/etc/tinc/\fBnetname\fI/hosts/\fR
.Ar NETNAME .
.It Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /hosts/
Host configuration files are kept in this directory.
.TP
\fI/etc/tinc/\fBnetname\fI/tinc-up\fR
If an executable file with this name exists, it will be executed
right after the tinc daemon has connected to the tap device. It can
be used to ifconfig the network interface.
If the tapdevice is a tun/tap device, the evironment variable
\fB$IFNAME\fR will be set to the name of the network interface.
.TP
\fI/etc/tinc/\fBnetname\fI/tinc-down\fR
If an executable file with this name exists, it will be executed
right before the tinc daemon is going to close it's connection to the
tap device.
.PP
.SH "SEE ALSO"
\fBtincd\fR(8)
.TP
\fBhttp://tinc.nl.linux.org/\fR
.TP
\fBhttp://www.linuxdoc.org/LDP/nag2/\fR
.PP
.It Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /tinc-up
If an executable file with this name exists,
it will be executed right after the tinc daemon has connected to the virtual network device.
It can be used to set up the corresponding network interface.
.Pp
The environment variable
.Ev NETNAME
will be passed to the executable.
If specified with the
.Va Interface
configuration variable,
or if the virtual network device is a Linux tun/tap device,
the environment variable
.Ev INTERFACE
will be set to the name of the network interface.
.It Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /tinc-down
If an executable file with this name exists,
it will be executed right before the tinc daemon is going to close
its connection to the virtual network device.
The same environment variables will be passed as mentioned above.
.El
.Sh SEE ALSO
.Xr tincd 8 ,
.Pa http://tinc.nl.linux.org/ ,
.Pa http://www.linuxdoc.org/LDP/nag2/ .
.Pp
The full documentation for
.B tinc
is maintained as a Texinfo manual. If the
.B info
and
.B tinc
programs are properly installed at your site, the command
.IP
.B info tinc
.PP
.Nm tinc
is maintained as a Texinfo manual.
If the info and tinc programs are properly installed at your site, the command
.Ic info tinc
should give you access to the complete manual.
.PP
tinc comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions;
.Pp
.Nm tinc
comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it under certain conditions;
see the file COPYING for details.

View file

@ -1,5 +1,5 @@
\input texinfo @c -*-texinfo-*-
@c $Id: tinc.texi,v 1.8.4.18 2001/05/25 12:45:37 guus Exp $
@c $Id: tinc.texi,v 1.8.4.19 2002/02/10 21:57:51 guus Exp $
@c %**start of header
@setfilename tinc.info
@settitle tinc Manual
@ -7,17 +7,18 @@
@c %**end of header
@ifinfo
@dircategory Networking tools
@direntry
* tinc: (tinc). The tinc Manual.
@end direntry
This is the info manual for tinc, a Virtual Private Network daemon.
Copyright @copyright{} 1998-2001 Ivo Timmermans
Copyright @copyright{} 1998-2002 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.18 2001/05/25 12:45:37 guus Exp $
$Id: tinc.texi,v 1.8.4.19 2002/02/10 21:57:51 guus Exp $
Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
@ -38,11 +39,11 @@ permission notice identical to this one.
@page
@vskip 0pt plus 1filll
@cindex copyright
Copyright @copyright{} 1998-2001 Ivo Timmermans
Copyright @copyright{} 1998-2002 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.18 2001/05/25 12:45:37 guus Exp $
$Id: tinc.texi,v 1.8.4.19 2002/02/10 21:57:51 guus Exp $
Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
@ -176,16 +177,14 @@ available too.
@section Supported platforms
@cindex 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
tinc has been verified to work under Linux, FreeBSD, OpenBSD and Solaris, with
various hardware architectures. These are some of the platforms
that are supported by the universal tun/tap device driver or other virtual network device drivers.
Without such a driver, tinc will most
likely compile and run, but it will not be able to send or receive data
packets.
@cindex release
The official release only truly supports Linux.
For an up to date list of supported platforms, please check the list on
our website:
@uref{http://tinc.nl.linux.org/platforms.html}.
@ -202,24 +201,32 @@ 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 or the universal TUN/TAP driver. The former is provided in the standard kernel
from version 2.1.60 up to 2.3.x, but has been replaced in favour of the TUN/TAP driver in kernel versions 2.4.0 and later.
tinc uses the ethertap device or the universal tun/tap driver. The former is provided in the standard kernel
from version 2.1.60 up to 2.3.x, but has been replaced in favour of the tun/tap driver in kernel versions 2.4.0 and later.
@c ==================================================================
@subsection FreeBSD
@cindex FreeBSD
tinc on FreeBSD relies on the universial TUN/TAP driver for its data
tinc on FreeBSD relies on the universal tun/tap driver for its data
acquisition from the kernel. Therefore, tinc will work on the same platforms
as this driver. These are: FreeBSD 3.x, 4.x, 5.x.
@c ==================================================================
@subsection OpenBSD
@cindex OpenBSD
tinc on OpenBSD relies on the tun driver for its data
acquisition from the kernel. It has been verified to work under at least OpenBSD 2.9.
@c ==================================================================
@subsection Solaris
@cindex Solaris
tinc on Solaris relies on the universial TUN/TAP driver for its data
tinc on Solaris relies on the universal tun/tap driver for its data
acquisition from the kernel. Therefore, tinc will work on the same platforms
as this driver. These are: Solaris, 2.1.x.
@ -278,6 +285,7 @@ you should read the @uref{http://howto.linuxberg.com/LDP/HOWTO/Kernel-HOWTO.html
* Configuration of Linux kernels 2.1.60 up to 2.4.0::
* Configuration of Linux kernels 2.4.0 and higher::
* Configuration of FreeBSD kernels::
* Configuration of OpenBSD kernels::
* Configuration of Solaris kernels::
@end menu
@ -329,18 +337,18 @@ Here are the options you have to turn on when configuring a new kernel:
Code maturity level options
[*] Prompt for development and/or incomplete code/drivers
Network device support
<M> Universal TUN/TAP device driver support
<M> Universal tun/tap device driver support
@end example
It's not necessary to compile this driver as a module, even if you are going to
run more than one instance of tinc.
If you have an early 2.4 kernel, you can choose both the TUN/TAP driver and the
If you have an early 2.4 kernel, you can choose both the tun/tap driver and the
`Ethertap network tap' device. This latter is marked obsolete, and chances are
that it won't even function correctly anymore. Make sure you select the
universal TUN/TAP driver.
universal tun/tap driver.
If you decide to build the TUN/TAP driver as a kernel module, add these lines
If you decide to build the tun/tap driver as a kernel module, add these lines
to @file{/etc/modules.conf}:
@example
@ -349,24 +357,35 @@ alias char-major-10-200 tun
@c ==================================================================
@node Configuration of FreeBSD kernels, Configuration of Solaris kernels, Configuration of Linux kernels 2.4.0 and higher, Configuring the kernel
@node Configuration of FreeBSD kernels, Configuration of OpenBSD kernels, Configuration of Linux kernels 2.4.0 and higher, Configuring the kernel
@subsection Configuration of FreeBSD kernels
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
kernel to support the universal tun/tap device. For 4.1 and higher
versions, this is included in the default kernel configuration, for earlier
systems (4.0 and earlier), you need to install the universal tun/tap driver
yourself.
Unfortunately somebody still has to write the text.
@c ==================================================================
@node Configuration of Solaris kernels, , Configuration of FreeBSD kernels, Configuring the kernel
@node Configuration of OpenBSD kernels, Configuration of Solaris kernels, Configuration of FreeBSD kernels, Configuring the kernel
@subsection Configuration of OpenBSD kernels
This section will contain information on how to configure your OpenBSD
kernel to support the tun device. For 2.9 and 3.0 systems,
this is included in the default kernel configuration.
Unfortunately somebody still has to write the text.
@c ==================================================================
@node Configuration of Solaris kernels, , Configuration of OpenBSD kernels, Configuring the kernel
@subsection Configuration of Solaris kernels
This section will contain information on how to configure your Solaris
kernel to support the universal TUN/TAP device. You need to install
kernel to support the universal tun/tap device. You need to install
this driver yourself.
Unfortunately somebody still has to write the text.
@ -451,11 +470,11 @@ all other requirements of the GPL are met.
@node Installation, Configuration, Preparations, Top
@chapter Installation
If you use Redhat or Debian, you may want to install one of the
If you use 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
If you cannot use one of the precompiled packages, 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
@ -528,7 +547,7 @@ chown 0.0 /dev/tap@emph{N}
There is a maximum of 16 ethertap devices.
If you use the universal TUN/TAP driver, you have to create the
If you use the universal tun/tap driver, you have to create the
following device file (unless it already exist):
@example
@ -537,8 +556,8 @@ chown 0.0 /dev/tun
@end example
If you use Linux, and you run the new 2.4 kernel using the devfs filesystem,
then the TUN/TAP device will probably be automatically generated as
@file{/dev/net/tun}.
then the tun/tap device will probably be automatically generated as
@file{/dev/misc/net/tun}.
Unlike the ethertap device, you do not need multiple device files if
you are planning to run multiple tinc daemons.
@ -617,7 +636,7 @@ A good resource on networking is the
If you have everything clearly pictured in your mind,
proceed in the following order:
First, generate the configuration files (tinc.conf, your host configuration file, tinc-up and perhaps tinc-down).
First, generate the configuration files (@file{tinc.conf}, your host configuration file, @file{tinc-up} and perhaps @file{tinc-down}).
Then generate the keypairs.
Finally, distribute the host configuration files.
These steps are described in the subsections below.
@ -717,8 +736,28 @@ required directives are given in @strong{bold}.
@subsection Main configuration variables
@table @asis
@item @strong{ConnectTo = <name>}
@cindex BindToInterface
@item BindToInterface = <interface>
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.
This option may not work on all platforms.
@cindex BindToIP
@item BindToIP = <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.
This option may not work on all platforms.
@cindex ConnectTo
@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
@ -729,8 +768,13 @@ 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)
@cindex Device
@item @strong{Device = <device>} (/dev/tap0 or /dev/misc/net/tun)
The virtual network device to use. Note that you can only use one device per
daemon. See also @ref{Device files}.
@cindex Hostnames
@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
@ -739,57 +783,68 @@ 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>
@cindex Interface
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 Interface = <interface>
Defines the name of the interface corresponding to the virtual network device.
Depending on the operating system and the type of device this may or may not actually set the name.
Currently this option only affects the Linux tun/tap device.
@item InterfaceIP = <local address>
@cindex InterfaceIP
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.
@cindex Mode
@item Mode = <router|switch|hub> (router)
This option selects the way packets are routed to other daemons.
@table @asis
@cindex router
@item router
In this mode Subnet
variables in the host configuration files will be used to form a routing table.
Only unicast packets of routable protocols (IPv4 and IPv6) are supported in this mode.
@cindex switch
@item switch
In this mode the MAC addresses of the packets on the VPN will be used to
dynamically create a routing table just like a network switch does.
Unicast, multicast and broadcast packets of every ethernet protocol are supported in this mode
at the cost of frequent broadcast ARP requests and routing table updates.
@cindex hub
@item hub
In this mode every packet will be broadcast to the other daemons.
@end table
@item KeyExpire = <seconds> (3600)
@cindex KeyExpire
@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>}
@cindex Name
@item @strong{Name = <name>}
This is a symbolic name for this connection. It can be anything
@item PingTimeout = <seconds> (60)
@cindex PingTimeout
@item PingTimeout = <seconds> (60)
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> [obsolete]
@cindex PrivateKey
@item PrivateKey = <key> [obsolete]
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 @strong{PrivateKeyFile = <path>} [recommended]
@cindex PrivateKeyFile
@item @strong{PrivateKeyFile = <path>} [recommended]
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.
@item @strong{TapDevice = <device>} (/dev/tap0 or /dev/net/tun)
@cindex TapDevice
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.
Note that there must be exactly one of PrivateKey
or PrivateKeyFile
specified in the configuration file.
@end table
@ -799,33 +854,50 @@ about configuring an ethertap device for Linux.
@subsection Host configuration variables
@table @asis
@item @strong{Address = <IP address|hostname>} [recommended]
@cindex Address
@item @strong{Address = <IP address|hostname>} [recommended]
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) [experimental]
@cindex Cipher
@item Cipher = <cipher> (blowfish)
The symmetric cipher algorithm used to encrypt UDP packets.
Any cipher supported by OpenSSL is recognized.
@cindex Digest
@item Digest = <digest> (sha1)
The digest algorithm used to authenticate UDP packets.
Any digest supported by OpenSSL is recognized.
Furthermore, specifying "none" will turn off packet authentication.
@cindex IndirectData
@item IndirectData = <yes|no> (no) [experimental]
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)
@cindex MACLength
@item MACLength = <length> (4)
The length of the message authentication code used to authenticate UDP packets.
Can be anything from 0
up to the length of the digest produced by the digest algorithm.
@cindex Port
@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> [obsolete]
@cindex PublicKey
@item PublicKey = <key> [obsolete]
This is the RSA public key for this host.
@item PublicKeyFile = <path> [obsolete]
@cindex PublicKeyFile
@item PublicKeyFile = <path> [obsolete]
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.
@ -838,22 +910,29 @@ necessary. Either the PEM format is used, or exactly
in each host configuration file, if you want to be able to establish a
connection with that host.
@item Subnet = <IP address/maskbits>
@cindex Subnet
This is the subnet range of all IP addresses that will be accepted by
the host that defines it.
@item Subnet = <address[/masklength]>
The subnet which this tinc daemon will serve.
tinc tries to look up which other daemon it should send a packet to by searching the appropiate subnet.
If the packet matches a subnet,
it will be sent to the daemon who has this subnet in his host configuration file.
Multiple subnet lines can be specified for each daemon.
The range must be contained in the IP address range of the tap device,
not the real IP address of the host running tincd.
Subnets can either be single MAC, IPv4 or IPv6 addresses,
in which case a subnet consisting of only that single address is assumed,
or they can be a IPv4 or IPv6 network address with a masklength.
For example, IPv4 subnets must be in a form like 192.168.1.0/24,
where 192.168.1.0 is the network address and 24 is the number of bits set in the netmask.
Note that subnets like 192.168.1.1/24 are invalid!
@cindex CIDR notation
maskbits is the number of bits set to 1 in the netmask part; for
masklength 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) [experimental]
@cindex TCPonly
@item TCPonly = <yes|no> (no) [experimental]
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
@ -874,7 +953,7 @@ Adapt the following example to create a basic configuration file:
@example
Name = @emph{yourname}
TapDevice = @emph{/dev/tap0}
Device = @emph{/dev/tap0}
PrivateKeyFile = /etc/tinc/@emph{netname}/rsa_key.priv
@end example
@ -919,37 +998,39 @@ Just press enter to accept the defaults.
@section Network interfaces
Before tinc can start transmitting data over the tunnel, it must
set up the ethertap network devices.
set up the virtual network interface.
First, decide which IP addresses you want to have associated with these
devices, and what network mask they must have.
tinc will open an ethertap device or TUN/TAP device, which will also
create a network interface called `tap0', or `tap1', and so on if you are using
the ethertap driver, or a network interface with the same name as netname
if you are using the universal TUN/TAP driver.
tinc will open a virtual network device (@file{/dev/tun}, @file{/dev/tap0} or similar),
which will also create a network interface called something like `tun0', `tap0', or,
if you are using the Linux tun/tap driver, the network interface will by default have the same name as the netname.
@cindex tinc-up
You can configure that device by putting ordinary ifconfig, route, and other commands
You can configure the network interface by putting ordinary ifconfig, route, and other commands
to a script named @file{/etc/tinc/netname/tinc-up}. When tinc starts, this script
will be executed. When tinc exits, it will execute the script named
@file{/etc/tinc/netname/tinc-down}, but normally you don't need to create that script.
An example @file{tinc-up} script when using the TUN/TAP driver:
An example @file{tinc-up} script:
@example
#!/bin/sh
ifconfig $NETNAME hw ether fe:fd:00:00:00:00
ifconfig $NETNAME @emph{xx}.@emph{xx}.@emph{xx}.@emph{xx} netmask @emph{mask}
ifconfig $NETNAME -arp
ifconfig $INTERFACE hw ether fe:fd:0:0:0:0
ifconfig $INTERFACE 192.168.1.1 netmask 255.255.0.0
ifconfig $INTERFACE -arp
@end example
@cindex MAC address
@cindex hardware address
The first line sets up the MAC address of the network interface.
Due to the nature of how Ethernet and tinc work, it has to be set to fe:fd:00:00:00:00.
(tinc versions prior to 1.0pre3 required that the MAC address matched the IP address.)
You can use the environment variable $NETNAME to get the name of the interface.
Due to the nature of how Ethernet and tinc work, it has to be set to fe:fd:0:0:0:0
for tinc to work in it's normal mode.
If you configured tinc to work in `switch' or `hub' mode, the hardware address should instead
be set to a unique address instead of fe:fd:0:0:0:0.
You can use the environment variable $INTERFACE to get the name of the interface.
If you are using the ethertap driver however, you need to replace it with tap@emph{N},
corresponding to the device file name.
@ -964,7 +1045,8 @@ own subnet.
@cindex arp
The last line tells the kernel not to use ARP on that interface.
Again this has to do with how Ethernet and tinc work. Don't forget to add this line.
Again this has to do with how Ethernet and tinc work.
Use this option only if you are running tinc under Linux and are using tinc's normal routing mode.
@c ==================================================================
@ -1010,7 +1092,7 @@ In @file{/etc/tinc/company/tinc-up}:
# Real interface of internal network:
# 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 hw ether fe:fd:0:0:0:0
ifconfig tap0 10.1.54.1 netmask 255.0.0.0
ifconfig tap0 -arp
@end example
@ -1020,7 +1102,7 @@ and in @file{/etc/tinc/company/tinc.conf}:
@example
Name = BranchA
PrivateKey = /etc/tinc/company/rsa_key.priv
TapDevice = /dev/tap0
Device = /dev/tap0
@end example
On all hosts, /etc/tinc/company/hosts/BranchA contains:
@ -1048,7 +1130,7 @@ In @file{/etc/tinc/company/tinc-up}:
# Real interface of internal network:
# 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 hw ether fe:fd:0:0:0:0
ifconfig tap0 10.2.1.12 netmask 255.0.0.0
ifconfig tap0 -arp
@end example
@ -1085,7 +1167,7 @@ In @file{/etc/tinc/company/tinc-up}:
# Real interface of internal network:
# ifconfig eth0 10.3.69.254 netmask 255.255.0.0 broadcast 10.3.255.255
ifconfig tap1 hw ether fe:fd:00:00:00:00
ifconfig tap1 hw ether fe:fd:0:0:0:0
ifconfig tap1 10.3.69.254 netmask 255.0.0.0
ifconfig tap1 -arp
@end example
@ -1095,7 +1177,7 @@ and in @file{/etc/tinc/company/tinc.conf}:
@example
Name = BranchC
ConnectTo = BranchA
TapDevice = /dev/tap1
Device = /dev/tap1
@end example
C already has another daemon that runs on port 655, so they have to
@ -1133,13 +1215,13 @@ and in @file{/etc/tinc/company/tinc.conf}:
@example
Name = BranchD
ConnectTo = BranchC
TapDevice = /dev/net/tun
Device = /dev/misc/net/tun
PrivateKeyFile = /etc/tinc/company/rsa_key.priv
@end example
D will be connecting to C, which has a tincd running for this network on
port 2000. It knows the port number from the host configuration file.
Also note that since D uses the TUN/TAP driver, the network interface
Also note that since D uses the tun/tap driver, the network interface
will not be called `tun' or `tap0' or something like that, but will
have the same name as netname.
@ -1211,33 +1293,19 @@ generated automatically, so may be more up-to-date.
@cindex options
@c from the manpage
@table @samp
@item --bypass-security
Disables encryption and authentication.
Only useful for debugging.
@item -c, --config=PATH
Read configuration options from the directory PATH. The default is
@file{/etc/tinc/netname/}.
@cindex debug level
@item -d
Increase debug level. The higher it gets, the more gets
@item -d, --debug=LEVEL
Set debug level to LEVEL. The higher the debug level, 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,
@ -1247,6 +1315,18 @@ in combination with -K). After that, tinc will quit.
@item --help
Display a short reminder of these runtime options and terminate.
@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 @file{/var/run/tinc.NETNAME.pid}.
Use it in conjunction with the -n option to make sure you kill the right tinc daemon.
@item -n, --net=NETNAME
Connect to net NETNAME. @xref{Multiple networks}.
@item -D, --no-detach
Don't fork and detach.
This will also disable the automatic restart mechanism for fatal errors.
@item --version
Output version information and exit.
@ -1269,7 +1349,7 @@ only, so keep an eye on it!
@item You forgot to compile `Netlink device emulation' in the kernel.
@end itemize
@item Can't write to /dev/net/tun: No such device
@item Can't write to /dev/misc/net/tun: No such device
@itemize
@item You forgot to `modprobe tun'.
@ -1280,10 +1360,10 @@ only, so keep an eye on it!
@itemize
@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
virtual network 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
just as large as the netmask of the virtual network interface. 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!
@ -1300,7 +1380,7 @@ Jan 1 12:00:00 host tinc.net[1234]: Read packet of length 46 from tap device
Jan 1 12:00:00 host tinc.net[1234]: Trying to look up 0.0.192.168 in connection list failed!
@end example
@itemize
@item Add the `ifconfig $NETNAME -arp' to tinc-up.
@item Add the `ifconfig $INTERFACE -arp' to tinc-up.
@end itemize
@item Network address and subnet mask do not match!
@ -1360,10 +1440,10 @@ computer over the existing Internet infrastructure.
@node The UDP tunnel, The meta-connection, The connection, The connection
@subsection The UDP tunnel
@cindex ethertap
@cindex virtual network device
@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
@emph{virtual network 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,
@ -1371,32 +1451,35 @@ 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.
(Some code for IPv6 routing and switching is already present but nonfunctional.)
When tinc knows
which type of frame it has read, it can also read the source and
destination address from it.
type. When tinc is in it's default routing mode, it can handle IPv4 and IPv6
packets. Depending on the Subnet lines, it will send the packets off to their destination.
In the `switch' and `hub' mode, tinc will use broadcasts and MAC address discovery
to deduce the destination of the packets.
Since the latter modes only depend on the link layer information,
any protocol that runs over Ethernet is supported (for instance IPX and Appletalk).
Now it is time that the frame gets encrypted. Currently the only
encryption algorithm available is blowfish.
After the destination has been determined, a sequence number will be added to the packet.
The packet will then be encrypted and a message authentication
code will be appended.
@cindex encapsulating
@cindex UDP
When the encryption is ready, time has come to actually transport the
When that is done, 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.
in reverse. So it checks the message authentication code, decrypts the contents of the UDP datagram,
checks the sequence number
and writes the decrypted information to its own virtual network 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
address must match that of the virtual network interface.
If tinc is in it's default routing mode, ARP does not work, so the correct destination MAC cannot be set
by the sending daemons.
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.
@ -1451,32 +1534,35 @@ daemon and to read and write requests by hand, provided that one
understands the numeric codes sent.
The authentication scheme is described in @ref{Authentication protocol}. After a
succesful authentication, the server and the client will exchange all the
successful 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.
@cindex ADD_HOST
@cindex ADD_EDGE
@cindex ADD_SUBNET
@example
daemon message
--------------------------------------------------------------------------
origin ADD_HOST daemon a329e18c:655 0
| | +--> options
| +---------> real address:port
+-------------------> name of new tinc daemon
origin ADD_SUBNET daemon 1,0a010100/ffffff00
| | | +--> netmask
| | +----------> vpn IPv4 network address
| +----------------> subnet type (1=IPv4)
+--------------------> owner of this subnet
origin ADD_EDGE node1 12.23.34.45 655 node2 21.32.43.54 655 222 0
| | | \___________________/ | +-> options
| | | | +----> weight
| | | +----------------> see below
| | +--> UDP port
| +----------> real address
+------------------> name of node on one side of the edge
origin ADD_SUBNET node 192.168.1.0/24
| | +--> masklength
| +--------> IPv4 network address
+------------------> owner of this subnet
--------------------------------------------------------------------------
@end example
@cindex DEL_HOST
@cindex DEL_SUBNET
In case daemons leave the VPN, DEL_HOST and DEL_SUBNET messages with exactly
the same syntax are sent to inform the other daemons of the departure.
@cindex DEL_EDGE
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.
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
@ -1484,7 +1570,7 @@ 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 it's copy back to the requestor.
act as a proxy and forward its copy back to the requester.
@cindex REQ_KEY
@cindex ANS_KEY
@ -1495,11 +1581,15 @@ daemon message
daemon REQ_KEY origin destination
| +--> name of the tinc daemon it wants the key from
+----------> name of the daemon that wants the key
daemon ANS_KEY origin destination e4ae0b0a82d6e0078179b5290c62c7d0
| | \______________________________/
| | +--> 128 bits key
daemon 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
daemon KEY_CHANGED origin
+--> daemon that has changed it's packet key
--------------------------------------------------------------------------
@ -1518,12 +1608,8 @@ messages without any other traffic won't result in known plaintext.
@example
daemon message
--------------------------------------------------------------------------
origin PING 9e76
\__/
+--> 2 bytes of salt (random data)
dest. PONG 3b8d
\__/
+--> 2 bytes of salt (random data)
origin PING
dest. PONG
--------------------------------------------------------------------------
@end example
@ -1546,9 +1632,8 @@ the tinc project after TINC.
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.
tinc uses blowfish encryption in CBC mode and a small amount of salt
at the beginning of each packet to make sure eavesdroppers cannot get
any information at all from the packets they can intercept.
tinc uses blowfish encryption in CBC mode, sequence numbers and message authentication codes
to make sure eavesdroppers cannot get and cannot change any information at all from the packets they can intercept.
@menu
* Authentication protocol::
@ -1565,6 +1650,11 @@ A new scheme for authentication in tinc has been devised, which offers some
improvements over the protocol used in 1.0pre2 and 1.0pre3. Explanation is
below.
@cindex ID
@cindex META_KEY
@cindex CHALLENGE
@cindex CHAL_REPLY
@cindex ACK
@example
daemon message
--------------------------------------------------------------------------
@ -1572,15 +1662,13 @@ client <attempts connection>
server <accepts connection>
client ID client 10 0
| | +-> options
| +---> version
+--------> name of tinc daemon
client ID client 12
| +---> version
+-------> name of tinc daemon
server ID server 10 0
| | +-> options
| +---> version
+--------> name of tinc daemon
server ID server 12
| +---> version
+-------> name of tinc daemon
client META_KEY 5f0823a93e35b69e...7086ec7866ce582b
\_________________________________/
@ -1593,8 +1681,8 @@ server META_KEY 6ab9c1640388f8f0...45d1a07f8a672630
encrypted with client's public RSA key
From now on:
- the client will encrypt outgoing traffic using S1
- the server will encrypt outgoing traffic using S2
- the client will symmetrically encrypt outgoing traffic using S1
- the server will symmetrically encrypt outgoing traffic using S2
client CHALLENGE da02add1817c1920989ba6ae2a49cecbda0
\_________________________________/
@ -1609,6 +1697,21 @@ client CHAL_REPLY 816a86
server CHAL_REPLY 928ffe
+-> 160 bits SHA1 of H1
After the correct challenge replies are received, both ends have proved
their identity. Further information is exchanged.
client ACK 655 12.23.34.45 123 0
| | | +-> options
| | +----> estimated weight
| +------------> IP address of server as seen by client
+--------------------> UDP port of client
server ACK 655 21.32.43.54 321 0
| | | +-> options
| | +----> estimated weight
| +------------> IP address of client as seen by server
+--------------------> UDP port of server
--------------------------------------------------------------------------
@end example
@ -1662,35 +1765,26 @@ an attacker) in the beginning of the encrypted stream.
A data packet can only be sent if the encryption key is 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. The packet is stored in a queue while waiting for the
to retrieve it. The packet is stored in a queue while waiting for the
key to arrive.
@cindex UDP
The UDP packet containing the network packet from the VPN has the following layout:
@example
... | IP header | UDP header | salt | VPN packet | UDP trailer
\___________________/
|
V
... | IP header | UDP header | seqno | VPN packet | MAC | UDP trailer
\___________________/\_____/
| |
V +---> digest algorithm
Encrypted with symmetric cipher
@end example
So, the entire UDP payload is encrypted using a symmetric cipher (blowfish in CBC mode).
2 bytes of salt (random data) are added in front of the actual VPN packet,
so that two VPN packets with (almost) the same content do not seem to be
the same for eavesdroppers.
2 bytes of salt may not seem much, but you can encrypt 65536 identical packets
now without an attacker being able to see that they were identical.
Given a MTU of 1500 this means 96 Megabyte of data.
There is no @emph{extra} provision against replay attacks or alteration of packets.
However, the VPN packets, normally UDP or TCP packets themselves, contain
checksums and sequence numbers.
Since those checksums and sequence numbers are encrypted,
they automatically become @emph{cryptographically secure}.
The kernel will handle any checksum errors and duplicate packets.
So, the entire VPN packet is encrypted using a symmetric cipher. A 32 bits
sequence number is added in front of the actual VPN packet, to act as a unique
IV for each packet and to prevent replay attacks. A message authentication code
is added to the UDP packet to prevent alteration of packets. By default the
first 4 bytes of the digest are used for this, but this can be changed using
the MACLength configuration variable.
@c ==================================================================
@node About us, Concept Index, Technical information, Top

View file

@ -1,153 +1,170 @@
.TH TINCD 8 "Jan 2001" "tinc version 1.0pre4" "FSF"
.SH NAME
tincd \- tinc VPN daemon
.SH SYNOPSIS
.B tincd
[\fIoption\fR]...
.SH DESCRIPTION
.PP
This is the daemon of tinc, a secure virtual private
network (VPN) project. When started, tincd will read
it's configuration file to determine what virtual subnets
it has to serve and to what other tinc daemons it should connect.
It will connect to the ethertap or tun/tap device and set up a socket
for incoming connections.
Optionally a script will be executed to further configure the tap device.
If that succeeds, it will detach from the controlling terminal and
continue in the background, accepting and setting up connections to other
tinc daemons that are part of the virtual private network.
.SH OPTIONS
.TP
\fB\-c\fR, \fB\-\-config\fR=\fIDIR\fR
Read configuration options from DIR.
.TP
\fB\-D\fR, \fB\-\-no\-detach\fR
Don't fork and detach. This will also disable the automatic
restart mechanism for fatal errors.
.TP
\fB\-d\fR
Increase debug level (see below).
.TP
\fB\-k\fR, \fB\-\-kill\fR
Attempt to kill a running tincd and exit.
.TP
\fB\-n\fR, \fB\-\-net\fR=\fInetname\fR
Connect to net `netname'.
.TP
\fB\-K\fR, \fB\-\-generate-keys\fR[=\fIBITS]\fR
Generate public/private RSA keypair and exit. If BITS is omitted,
the default length will be 1024 bits.
.TP
\fB\-\-help\fR
.Dd 2002-02-07
.Dt TINCD 8
.\" Manual page created by:
.\" Ivo Timmermans <itimmermans@bigfoot.com>
.\" Guus Sliepen <guus@sliepen.warande.net>
.Sh NAME
.Nm tincd
.Nd tinc VPN daemon
.Sh SYNOPSIS
.Nm
.Op Fl cdDkKn
.Op Fl -bypass-security
.Op Fl -config Ns = Ns Ar DIR
.Op Fl -debug Ns = Ns Ar LEVEL
.Op Fl -generate-keys Ns Op = Ns Ar BITS
.Op Fl -help
.Op Fl -kill Ns = Ns Ar SIGNAL
.Op Fl -net Ns = Ns Ar NETNAME
.Op Fl -no-detach
.Op Fl -version
.Sh DESCRIPTION
This is the daemon of tinc, a secure virtual private network (VPN) project.
When started,
.Nm
will read it's configuration file to determine what virtual subnets it has to serve
and to what other tinc daemons it should connect.
It will connect to the ethertap or tun/tap device
and set up a socket for incoming connections.
Optionally a script will be executed to further configure the virtual device.
If that succeeds,
it will detach from the controlling terminal and continue in the background,
accepting and setting up connections to other tinc daemons
that are part of the virtual private network.
.Sh OPTIONS
.Bl -tag -width indent
.It Fl -bypass-security
Disables encryption and authentication.
Only useful for debugging.
.It Fl c, -config Ns = Ns Ar DIR
Read configuration options from
.Ar DIR .
.It Fl d, -debug Ns Op = Ns Ar LEVEL
Increase debug level or set it to
.Ar LEVEL
(see below).
.It Fl K, -generate-keys Ns Op = Ns Ar BITS
Generate public/private RSA keypair and exit.
If
.Ar BITS
is omitted, the default length will be 1024 bits.
.It Fl -help
Display short list of options.
.TP
\fB\-\-version\fR
.It Fl k, -kill Ns Op = Ns Ar SIGNAL
Attempt to kill a running
.Nm
(optionally with the specified
.Ar SIGNAL
instead of SIGQUIT) and exit.
.It Fl n, -net Ns = Ns Ar NETNAME
Connect to net
.Ar NETNAME .
.It Fl D, -no-detach
Don't fork and detach.
This will also disable the automatic restart mechanism for fatal errors.
.It Fl -version
Output version information and exit.
.PP
.SH "SIGNALS"
.TP
\fBHUP\fR
.El
.Sh SIGNALS
.Bl -tag -width indent
.It ALRM
Forces
.Nm
to try to connect to all uplinks immediately.
Usually
.Nm
attempts to do this itself,
but increases the time it waits between the attempts each time it failed,
and if
.Nm
didn't succeed to connect to an uplink the first time after it started,
it defaults to the maximum time of 15 minutes.
.It HUP
Closes all connections, rereads the configuration file and restarts the daemon.
.TP
\fBINT\fR
Closes all connections and quits.
.TP
\fBUSR1\fR
.It INT
Temporarily increases debug level to 5.
Send this signal again to revert to the original level.
.It USR1
Dumps the connection list to syslog.
.TP
\fBUSR2\fR
Dumps the subnet list to syslog.
.TP
\fBALRM\fR
Forces tincd to try to connect to an uplink immediately. Usually tincd attempts
to do this itself, but increases the time it waits between the attempts each time
it failed, and if tincd didn't succeed to connect to an uplink the first time after
it started, it defaults to the maximum time of 15 minutes.
.PP
.SH "DEBUG LEVELS"
The tinc daemon can send a lot of messages to the syslog. The more \fB\-d\fR options are
given to tincd, the more messages it will log. Each level inherits all messages of the
previous level:
.TP
\fIno debug options\fR
This will log a message indicating tincd has started along with a version number.
.It USR2
Dumps virtual network device statistics, all known nodes, edges and subnets to syslog.
.It WINCH
Purges all information remembered about unreachable nodes.
.El
.Sh DEBUG LEVELS
The tinc daemon can send a lot of messages to the syslog.
The higher the debug level,
the more messages it will log.
Each level inherits all messages of the previous level:
.Bl -tag -width indent
.It 0
This will log a message indicating
.Nm
has started along with a version number.
It will also any serious error.
.TP
\fB\-d\fR
.It 1
This will log all connections that are made with other tinc daemons.
.TP
\fB\-dd\fR
.It 2
This will log status and error messages from other tinc daemons.
.TP
\fB\-ddd\fR
.It 3
This will log all requests that are exchanged with other tinc daemons. These include
authentication, key exchange and connection list updates.
.TP
\fB\-dddd\fR
.It 4
This will log a copy of everything received on the meta socket.
.TP
\fB\-ddddd\fR
.It 5
This will log all network traffic over the virtual private network.
.PP
.SH "FILES"
.TP
\fI/etc/tinc/\fBnetname\fI/tinc.conf\fR
The configuration file for tincd.
.TP
\fI/etc/tinc/\fBnetname\fI/tinc-up\fR
Script which is executed as soon as a tap device has been allocated.
.El
.Sh FILES
.Bl -tag -width indent
.It Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /tinc.conf
The configuration file for
.Nm .
.It Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /tinc-up
Script which is executed as soon as the virtual network device has been allocated.
Purpose is to further configure that device.
.TP
\fI/etc/tinc/\fBnetname\fI/tinc-down\fR
Script which is executed when tinc quits.
Purpose is to shut down the tap device.
.TP
\fI/etc/tinc/\fBnetname\fI/hosts/*\fR
.It Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /tinc-down
Script which is executed when
.Nm
exits.
Purpose is to cleanly shut down the virtual network device before it will be deallocated.
.It Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /hosts/*
The directory containing the host configuration files
used to authenticate other tinc daemons.
.TP
\fI/var/run/tinc.\fBnetname\fI.pid\fR
The PID of the currently running tincd is stored in this file.
.PP
.SH "BUGS"
The TCPonly and IndirectData options may not work correctly.
.PP
\fBThe cryptography in tinc is not well tested yet. Use it at your own risk!\fR
.PP
If you find any bugs, report them to tinc@nl.linux.org.
.PP
.SH "TODO"
A lot, especially security auditting.
.PP
.SH "SEE ALSO"
\fBtinc.conf\fR(5)
.TP
\fBhttp://tinc.nl.linux.org/\fR
.TP
\fBhttp://www.cabal.org/\fR
.PP
The full documentation for
.B tinc
is maintained as a Texinfo manual. If the
.B info
.It Pa /var/run/tinc. Ns Ar NETNAME Ns Pa .pid
The PID of the currently running
.Nm
is stored in this file.
.El
.Sh BUGS
The
.Va BindToInterface ,
.Va BindToIP ,
.Va IndirectData
and
.B tinc
programs are properly installed at your site, the command
.IP
.B info tinc
.PP
.Va TCPOnly
options may not work correctly.
.Pp
.Sy The cryptography in tinc is not well tested yet. Use it at your own risk!
.Pp
If you find any bugs, report them to tinc@nl.linux.org.
.Sh TODO
A lot, especially security auditing.
.Sh SEE ALSO
.Xr tinc.conf 5 ,
.Pa http://tinc.nl.linux.org/ ,
.Pa http://www.cabal.org/ .
.Pp
The full documentation for tinc is maintained as a Texinfo manual.
If the info and tinc programs are properly installed at your site,
the command
.Ic info tinc
should give you access to the complete manual.
.PP
tinc comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions;
.Pp
tinc comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it under certain conditions;
see the file COPYING for details.
.SH "AUTHORS"
.na
.nf
Ivo Timmermans <itimmermans@bigfoot.com>
Guus Sliepen <guus@sliepen.warande.net>
.Sh AUTHORS
.An "Ivo Timmermans" Aq itimmermans@bigfoot.com
.An "Guus Sliepen" Aq guus@sliepen.warande.net
.Pp
And thanks to many others for their contributions to tinc!
.PP

View file

@ -29,7 +29,7 @@
library for inclusion into tinc (http://tinc.nl.linux.org/) by
Guus Sliepen <guus@sliepen.warande.net>.
$Id: avl_tree.c,v 1.1.2.7 2001/02/27 16:50:29 guus Exp $
$Id: avl_tree.c,v 1.1.2.8 2002/02/10 21:57:51 guus Exp $
*/
#include <stdio.h>
@ -597,6 +597,15 @@ void avl_unlink_node(avl_tree_t *tree, avl_node_t *node)
}
avl_rebalance(tree, balnode);
node->next = node->prev = node->parent = node->left = node->right = NULL;
#ifdef AVL_COUNT
node->count = 0;
#endif
#ifdef AVL_DEPTH
node->depth = 0;
#endif
}
void avl_delete_node(avl_tree_t *tree, avl_node_t *node)

View file

@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: dropin.c,v 1.1.2.7 2001/11/16 17:36:56 zarq Exp $
$Id: dropin.c,v 1.1.2.8 2002/02/10 21:57:51 guus Exp $
*/
#include "config.h"
@ -169,188 +169,3 @@ int asprintf(char **buf, const char *fmt, ...)
return status;
}
#endif
/*
* fake library for ssh
*
* This file is included in getaddrinfo.c and getnameinfo.c.
* See getaddrinfo.c and getnameinfo.c.
*/
/* $Id: dropin.c,v 1.1.2.7 2001/11/16 17:36:56 zarq Exp $ */
/* for old netdb.h */
#ifndef EAI_NODATA
#define EAI_NODATA 1
#define EAI_MEMORY 2
#endif
/*
* fake library for ssh
*
* This file includes getaddrinfo(), freeaddrinfo() and gai_strerror().
* These funtions are defined in rfc2133.
*
* But these functions are not implemented correctly. The minimum subset
* is implemented for ssh use only. For exapmle, this routine assumes
* that ai_family is AF_INET. Don't use it for another purpose.
*/
#ifndef HAVE_GAI_STRERROR
char *gai_strerror(int ecode)
{
switch (ecode) {
case EAI_NODATA:
return "no address associated with hostname.";
case EAI_MEMORY:
return "memory allocation failure.";
default:
return "unknown error.";
}
}
#endif /* !HAVE_GAI_STRERROR */
#ifndef HAVE_FREEADDRINFO
void freeaddrinfo(struct addrinfo *ai)
{
struct addrinfo *next;
do {
next = ai->ai_next;
free(ai);
} while (NULL != (ai = next));
}
#endif /* !HAVE_FREEADDRINFO */
#ifndef HAVE_GETADDRINFO
static struct addrinfo *malloc_ai(int port, u_long addr)
{
struct addrinfo *ai;
ai = malloc(sizeof(struct addrinfo) + sizeof(struct sockaddr_in));
if (ai == NULL)
return(NULL);
memset(ai, 0, sizeof(struct addrinfo) + sizeof(struct sockaddr_in));
ai->ai_addr = (struct sockaddr *)(ai + 1);
/* XXX -- ssh doesn't use sa_len */
ai->ai_addrlen = sizeof(struct sockaddr_in);
ai->ai_addr->sa_family = ai->ai_family = AF_INET;
((struct sockaddr_in *)(ai)->ai_addr)->sin_port = port;
((struct sockaddr_in *)(ai)->ai_addr)->sin_addr.s_addr = addr;
return(ai);
}
int getaddrinfo(const char *hostname, const char *servname,
const struct addrinfo *hints, struct addrinfo **res)
{
struct addrinfo *cur, *prev = NULL;
struct hostent *hp;
struct in_addr in;
int i, port;
if (servname)
port = htons(atoi(servname));
else
port = 0;
if (hints && hints->ai_flags & AI_PASSIVE) {
if (NULL != (*res = malloc_ai(port, htonl(0x00000000))))
return 0;
else
return EAI_MEMORY;
}
if (!hostname) {
if (NULL != (*res = malloc_ai(port, htonl(0x7f000001))))
return 0;
else
return EAI_MEMORY;
}
if (inet_aton(hostname, &in)) {
if (NULL != (*res = malloc_ai(port, in.s_addr)))
return 0;
else
return EAI_MEMORY;
}
hp = gethostbyname(hostname);
if (hp && hp->h_name && hp->h_name[0] && hp->h_addr_list[0]) {
for (i = 0; hp->h_addr_list[i]; i++) {
cur = malloc_ai(port, ((struct in_addr *)hp->h_addr_list[i])->s_addr);
if (cur == NULL) {
if (*res)
freeaddrinfo(*res);
return EAI_MEMORY;
}
if (prev)
prev->ai_next = cur;
else
*res = cur;
prev = cur;
}
return 0;
}
return EAI_NODATA;
}
#endif /* !HAVE_GETADDRINFO */
/*
* fake library for ssh
*
* This file includes getnameinfo().
* These funtions are defined in rfc2133.
*
* But these functions are not implemented correctly. The minimum subset
* is implemented for ssh use only. For exapmle, this routine assumes
* that ai_family is AF_INET. Don't use it for another purpose.
*/
#ifndef HAVE_GETNAMEINFO
int getnameinfo(const struct sockaddr *sa, size_t salen, char *host,
size_t hostlen, char *serv, size_t servlen, int flags)
{
struct sockaddr_in *sin = (struct sockaddr_in *)sa;
struct hostent *hp;
char tmpserv[16];
if (serv) {
snprintf(tmpserv, sizeof(tmpserv), "%d", ntohs(sin->sin_port));
if (strlen(tmpserv) >= servlen)
return EAI_MEMORY;
else
strcpy(serv, tmpserv);
}
if (host) {
if (flags & NI_NUMERICHOST) {
if (strlen(inet_ntoa(sin->sin_addr)) >= hostlen)
return EAI_MEMORY;
strcpy(host, inet_ntoa(sin->sin_addr));
return 0;
} else {
hp = gethostbyaddr((char *)&sin->sin_addr,
sizeof(struct in_addr), AF_INET);
if (hp == NULL)
return EAI_NODATA;
if (strlen(hp->h_name) >= hostlen)
return EAI_MEMORY;
strcpy(host, hp->h_name);
return 0;
}
}
return 0;
}
#endif /* !HAVE_GETNAMEINFO */

View file

@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: dropin.h,v 1.1.2.5 2001/11/16 17:37:08 zarq Exp $
$Id: dropin.h,v 1.1.2.6 2002/02/10 21:57:51 guus Exp $
*/
#ifndef __DROPIN_H__
@ -35,53 +35,4 @@ extern char* get_current_dir_name(void);
extern int asprintf(char **, const char *, ...);
#endif
#ifndef HAVE_STRUCT_ADDRINFO
struct addrinfo {
int ai_flags; /* AI_PASSIVE, AI_CANONNAME */
int ai_family; /* PF_xxx */
int ai_socktype; /* SOCK_xxx */
int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
size_t ai_addrlen; /* length of ai_addr */
char *ai_canonname; /* canonical name for hostname */
struct sockaddr *ai_addr; /* binary address */
struct addrinfo *ai_next; /* next structure in linked list */
};
#endif /* !HAVE_STRUCT_ADDRINFO */
#ifndef HAVE_GETADDRINFO
int getaddrinfo(const char *hostname, const char *servname,
const struct addrinfo *hints, struct addrinfo **res);
#endif /* !HAVE_GETADDRINFO */
#ifndef HAVE_GAI_STRERROR
char *gai_strerror(int ecode);
#endif /* !HAVE_GAI_STRERROR */
#ifndef HAVE_FREEADDRINFO
void freeaddrinfo(struct addrinfo *ai);
#endif /* !HAVE_FREEADDRINFO */
#ifndef HAVE_GETNAMEINFO
int getnameinfo(const struct sockaddr *sa, size_t salen, char *host,
size_t hostlen, char *serv, size_t servlen, int flags);
#endif /* !HAVE_GETNAMEINFO */
#ifndef NI_MAXSERV
# define NI_MAXSERV 32
#endif /* !NI_MAXSERV */
#ifndef NI_MAXHOST
# define NI_MAXHOST 1025
#endif /* !NI_MAXHOST */
#ifndef AI_PASSIVE
# define AI_PASSIVE 1
# define AI_CANONNAME 2
#endif
#ifndef NI_NUMERICHOST
# define NI_NUMERICHOST 2
# define NI_NAMEREQD 4
# define NI_NUMERICSERV 8
#endif
#endif /* __DROPIN_H__ */

View file

@ -31,6 +31,14 @@ AC_DEFUN(tinc_OPENSSL,
AC_CHECK_FUNCS(RAND_pseudo_bytes)
AC_CHECK_FUNC(OpenSSL_add_all_algorithms,
[],
AC_CHECK_FUNC(SSLeay_add_all_algorithms,
[AC_DEFINE(HAVE_SSLEAY_ADD_ALL_ALGORITHMS)],
[AC_MSG_ERROR("Missing required OpenSSL functionality!")]
)
)
AC_CHECK_FUNC(dlopen,
[],
AC_CHECK_LIB(dl, dlopen,

View file

@ -11,7 +11,19 @@ src/meta.c
src/net.c
src/netutl.c
src/protocol.c
src/protocol_auth.c
src/protocol_edge.c
src/protocol_key.c
src/protocol_misc.c
src/protocol_subnet.c
src/subnet.c
src/tincd.c
src/process.c
src/route.c
src/node.c
src/edge.c
src/graph.c
src/linux/device.c
src/freebsd/device.c
src/openbsd/device.c
src/solaris/device.c

1147
po/nl.po

File diff suppressed because it is too large Load diff

View file

@ -1 +0,0 @@
EXTRA_DIST = tinc tinc.spec

View file

@ -1,14 +1,17 @@
## Produce this file with automake to get Makefile.in
# $Id: Makefile.am,v 1.4.4.18 2001/11/16 12:16:28 zarq Exp $
# $Id: Makefile.am,v 1.4.4.19 2002/02/10 21:57:52 guus Exp $
sbin_PROGRAMS = tincd
tincd_SOURCES = conf.c connection.c device.c edge.c graph.c meta.c net.c node.c process.c \
protocol.c route.c subnet.c tincd.c
EXTRA_DIST = linux/device.c freebsd/device.c openbsd/device.c solaris/device.c
tincd_SOURCES = conf.c connection.c device.c edge.c event.c graph.c meta.c net.c netutl.c node.c process.c \
protocol.c protocol_auth.c protocol_edge.c protocol_misc.c protocol_key.c protocol_subnet.c \
route.c subnet.c tincd.c
INCLUDES = @INCLUDES@ -I$(top_builddir) -I$(top_srcdir)/lib -I$(top_srcdir)/intl
noinst_HEADERS = conf.h connection.h device.h edge.h graph.h meta.h net.h node.h process.h \
noinst_HEADERS = conf.h connection.h device.h edge.h event.h graph.h meta.h net.h netutl.h node.h process.h \
protocol.h route.h subnet.h
LIBS = @LIBS@ @INTLLIBS@

View file

@ -1,8 +1,8 @@
/*
conf.c -- configuration code
Copyright (C) 1998 Robert van der Meulen
1998-2001 Ivo Timmermans <itimmermans@bigfoot.com>
2000,2001 Guus Sliepen <guus@sliepen.warande.net>
1998-2002 Ivo Timmermans <itimmermans@bigfoot.com>
2000-2002 Guus Sliepen <guus@sliepen.warande.net>
2000 Cris van Pelt <tribbel@arise.dhs.org>
This program is free software; you can redistribute it and/or modify
@ -19,7 +19,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: conf.c,v 1.9.4.51 2001/11/16 22:31:41 zarq Exp $
$Id: conf.c,v 1.9.4.52 2002/02/10 21:57:53 guus Exp $
*/
#include "config.h"
@ -42,19 +42,17 @@
#include <avl_tree.h>
#include "conf.h"
#include "netutl.h" /* for str2address */
#include "system.h"
avl_tree_t *config_tree;
int debug_lvl = 0;
int timeout = 0; /* seconds before timeout */
int pingtimeout = 0; /* seconds before timeout */
char *confbase = NULL; /* directory in which all config files are */
char *netname = NULL; /* name of the vpn network */
/* Will be set if HUP signal is received. It will be processed when it is safe. */
int sighup = 0;
int config_compare(config_t *a, config_t *b)
{
int result;
@ -202,6 +200,41 @@ cp
return 1;
}
int get_config_address(config_t *cfg, ipv4_t **result)
{
ipv4_t *ip;
cp
if(!cfg)
return 0;
ip = xmalloc(sizeof(*ip));
*ip = str2address(cfg->value);
if(ip)
{
*result = ip;
return 1;
}
syslog(LOG_ERR, _("IP address expected for configuration variable %s in %s line %d"),
cfg->variable, cfg->file, cfg->line);
return 0;
}
int get_config_port(config_t *cfg, port_t *result)
{
cp
if(!cfg)
return 0;
if(sscanf(cfg->value, "%hu", result) == 1)
return 1;
syslog(LOG_ERR, _("Port number expected for configuration variable %s in %s line %d"),
cfg->variable, cfg->file, cfg->line);
return 0;
}
int get_config_subnet(config_t *cfg, subnet_t **result)
{
subnet_t *subnet;
@ -209,34 +242,27 @@ cp
if(!cfg)
return 0;
#warning FIXME
/* ip = strtoip(cfg->value); */
subnet = str2net(cfg->value);
/* if(!ip) */
/* { */
/* syslog(LOG_ERR, _("IP address expected for configuration variable %s in %s line %d"), */
/* cfg->variable, cfg->file, cfg->line); */
/* return 0; */
/* } */
if(!subnet)
{
syslog(LOG_ERR, _("Subnet expected for configuration variable %s in %s line %d"),
cfg->variable, cfg->file, cfg->line);
return 0;
}
/* Teach newbies what subnets are... */
/* if((ip->address & ip->mask) != ip->address) */
/* { */
/* syslog(LOG_ERR, _("Network address and subnet mask for configuration variable %s in %s line %d"), */
/* cfg->variable, cfg->file, cfg->line); */
/* free(ip); */
/* return 0; */
/* } */
if(subnet->type == SUBNET_IPV4)
if((subnet->net.ipv4.address & subnet->net.ipv4.mask) != subnet->net.ipv4.address)
{
syslog(LOG_ERR, _("Network address and mask length do not match for configuration variable %s in %s line %d"),
cfg->variable, cfg->file, cfg->line);
free(subnet);
return 0;
}
/* subnet = new_subnet(); */
/* subnet->type = SUBNET_IP; */
/* subnet->net.ip.address = ip->address; */
/* subnet->net.ip.mask = ip->mask; */
/* free(ip); */
/* *result = subnet; */
*result = subnet;
return 1;
}

View file

@ -1,7 +1,7 @@
/*
conf.h -- header for conf.c
Copyright (C) 1998-2001 Ivo Timmermans <itimmermans@bigfoot.com>
2000,2001 Guus Sliepen <guus@sliepen.warande.net>
Copyright (C) 1998-2002 Ivo Timmermans <itimmermans@bigfoot.com>
2000-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: conf.h,v 1.6.4.30 2001/11/16 12:14:20 zarq Exp $
$Id: conf.h,v 1.6.4.31 2002/02/10 21:57:53 guus Exp $
*/
#ifndef __TINC_CONF_H__
@ -37,9 +37,8 @@ typedef struct config_t {
extern avl_tree_t *config_tree;
extern int debug_lvl;
extern int timeout;
extern int pingtimeout;
extern int maxtimeout;
extern int sighup;
extern int bypass_security;
extern char *confbase;
extern char *netname;
@ -53,7 +52,9 @@ extern config_t *lookup_config(avl_tree_t *, char *);
extern config_t *lookup_config_next(avl_tree_t *, config_t *);
extern int get_config_bool(config_t *, int *);
extern int get_config_int(config_t *, int *);
extern int get_config_port(config_t *, port_t *);
extern int get_config_string(config_t *, char **);
extern int get_config_address(config_t *, ipv4_t **);
struct subnet_t; /* Needed for next line. */
extern int get_config_subnet(config_t *, struct subnet_t **);

View file

@ -1,7 +1,7 @@
/*
connection.c -- connection list management
Copyright (C) 2000,2001 Guus Sliepen <guus@sliepen.warande.net>,
2000,2001 Ivo Timmermans <itimmermans@bigfoot.com>
Copyright (C) 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: connection.c,v 1.1.2.26 2001/11/16 12:20:44 zarq Exp $
$Id: connection.c,v 1.1.2.27 2002/02/10 21:57:53 guus Exp $
*/
#include "config.h"
@ -31,6 +31,7 @@
#include <list.h>
#include "net.h" /* Don't ask. */
#include "netutl.h"
#include "config.h"
#include "conf.h"
#include <utils.h>
@ -105,11 +106,12 @@ cp
cp
}
connection_t *lookup_connection(struct addrinfo *address)
connection_t *lookup_connection(ipv4_t address, port_t port)
{
connection_t c;
cp
c.address = address;
c.port = port;
return avl_search(connection_tree, &c);
}

View file

@ -1,7 +1,7 @@
/*
connection.h -- header for connection.c
Copyright (C) 2000,2001 Guus Sliepen <guus@sliepen.warande.net>,
2000,2001 Ivo Timmermans <itimmermans@bigfoot.com>
Copyright (C) 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: connection.h,v 1.1.2.23 2001/11/16 12:01:48 zarq Exp $
$Id: connection.h,v 1.1.2.24 2002/02/10 21:57:53 guus Exp $
*/
#ifndef __TINC_CONNECTION_H__
@ -46,30 +46,26 @@
#include "node.h"
#include "edge.h"
#include <config.h>
#include <dropin.h>
#define OPTION_INDIRECT 0x0001
#define OPTION_TCPONLY 0x0002
typedef struct connection_status_t {
int pinged:1; /* sent ping */
int active:1; /* 1 if active.. */
int outgoing:1; /* I myself asked for this conn */
int termreq:1; /* the termination of this connection was requested */
int remove:1; /* Set to 1 if you want this connection removed */
int timeout:1; /* 1 if gotten timeout */
int encryptout:1; /* 1 if we can encrypt outgoing traffic */
int decryptin:1; /* 1 if we have to decrypt incoming traffic */
int mst:1; /* 1 if this connection is part of a minimum spanning tree */
int unused:17;
int unused:18;
} connection_status_t;
typedef struct connection_t {
char *name; /* name he claims to have */
struct addrinfo *address; /* his real (internet) ip */
char *port; /* port number of meta connection */
ipv4_t address; /* his real (internet) ip */
port_t port; /* port number of meta connection */
char *hostname; /* the hostname of its real ip */
int protocol_version; /* used protocol */
@ -78,9 +74,10 @@ typedef struct connection_t {
struct connection_status_t status; /* status info */
int estimated_weight; /* estimation for the weight of the edge for this connection */
struct timeval start; /* time this connection was started, used for above estimation */
struct outgoing_t *outgoing; /* used to keep track of outgoing connections */
struct node_t *node; /* node associated with the other end */
struct edge_t *edge; /* edge associated with this connection */
struct edge_t *edge; /* edge associated with this connection */
RSA *rsa_key; /* his public/private key */
EVP_CIPHER *incipher; /* Cipher he will use to send data to us */
@ -112,7 +109,7 @@ extern connection_t *new_connection(void);
extern void free_connection(connection_t *);
extern void connection_add(connection_t *);
extern void connection_del(connection_t *);
extern connection_t *lookup_connection(struct addrinfo *);
extern connection_t *lookup_connection(ipv4_t, short unsigned int);
extern void dump_connections(void);
extern int read_connection_config(connection_t *);

View file

@ -1,7 +1,7 @@
/*
net.h -- generic header for device.c
Copyright (C) 2001 Ivo Timmermans <zarq@iname.com>
2001 Guus Sliepen <guus@sliepen.warande.net>
Copyright (C) 2001-2002 Ivo Timmermans <zarq@iname.com>
2001-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: device.h,v 1.1.2.4 2001/10/31 12:50:24 guus Exp $
$Id: device.h,v 1.1.2.5 2002/02/10 21:57:54 guus Exp $
*/
#ifndef __TINC_DEVICE_H__

View file

@ -1,7 +1,7 @@
/*
edge.c -- edge tree management
Copyright (C) 2000,2001 Guus Sliepen <guus@sliepen.warande.net>,
2000,2001 Ivo Timmermans <itimmermans@bigfoot.com>
Copyright (C) 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: edge.c,v 1.1.2.5 2001/11/16 12:21:49 zarq Exp $
$Id: edge.c,v 1.1.2.6 2002/02/10 21:57:54 guus Exp $
*/
#include "config.h"
@ -30,6 +30,7 @@
#include <list.h>
#include "net.h" /* Don't ask. */
#include "netutl.h"
#include "config.h"
#include "conf.h"
#include <utils.h>
@ -45,12 +46,12 @@ int edge_compare(edge_t *a, edge_t *b)
{
int result;
result = strcmp(a->from->name, b->from->name);
result = strcmp(a->from.node->name, b->from.node->name);
if(result)
return result;
else
return strcmp(a->to->name, b->to->name);
return strcmp(a->to.node->name, b->to.node->name);
}
/* Evil edge_compare() from a parallel universe ;)
@ -59,7 +60,7 @@ int edge_compare(edge_t *a, edge_t *b)
{
int result;
return (result = strcmp(a->from->name, b->from->name)) || (result = strcmp(a->to->name, b->to->name)), result;
return (result = strcmp(a->from.node->name, b->from.node->name)) || (result = strcmp(a->to.node->name, b->to.node->name)), result;
}
*/
@ -69,15 +70,15 @@ int edge_name_compare(edge_t *a, edge_t *b)
int result;
char *name_a1, *name_a2, *name_b1, *name_b2;
if(strcmp(a->from->name, a->to->name) < 0)
name_a1 = a->from->name, name_a2 = a->to->name;
if(strcmp(a->from.node->name, a->to.node->name) < 0)
name_a1 = a->from.node->name, name_a2 = a->to.node->name;
else
name_a1 = a->to->name, name_a2 = a->from->name;
name_a1 = a->to.node->name, name_a2 = a->from.node->name;
if(strcmp(b->from->name, b->to->name) < 0)
name_b1 = b->from->name, name_b2 = b->to->name;
if(strcmp(b->from.node->name, b->to.node->name) < 0)
name_b1 = b->from.node->name, name_b2 = b->to.node->name;
else
name_b1 = b->to->name, name_b2 = b->from->name;
name_b1 = b->to.node->name, name_b2 = b->from.node->name;
result = strcmp(name_a1, name_b1);
@ -151,8 +152,8 @@ void edge_add(edge_t *e)
cp
avl_insert(edge_tree, e);
avl_insert(edge_weight_tree, e);
avl_insert(e->from->edge_tree, e);
avl_insert(e->to->edge_tree, e);
avl_insert(e->from.node->edge_tree, e);
avl_insert(e->to.node->edge_tree, e);
cp
}
@ -161,8 +162,8 @@ void edge_del(edge_t *e)
cp
avl_delete(edge_tree, e);
avl_delete(edge_weight_tree, e);
avl_delete(e->from->edge_tree, e);
avl_delete(e->to->edge_tree, e);
avl_delete(e->from.node->edge_tree, e);
avl_delete(e->to.node->edge_tree, e);
cp
}
@ -170,16 +171,16 @@ edge_t *lookup_edge(node_t *from, node_t *to)
{
edge_t v, *result;
cp
v.from = from;
v.to = to;
v.from.node = from;
v.to.node = to;
result = avl_search(edge_tree, &v);
if(result)
return result;
cp
v.from = to;
v.to = from;
v.from.node = to;
v.to.node = from;
return avl_search(edge_tree, &v);
}
@ -188,14 +189,21 @@ void dump_edges(void)
{
avl_node_t *node;
edge_t *e;
char *from_address, *to_address;
cp
syslog(LOG_DEBUG, _("Edges:"));
for(node = edge_tree->head; node; node = node->next)
{
e = (edge_t *)node->data;
syslog(LOG_DEBUG, _(" %s - %s options %ld weight %d"),
e->from->name, e->to->name, e->options, e->weight);
from_address = address2str(e->from.address);
to_address = address2str(e->to.address);
syslog(LOG_DEBUG, _(" %s at %s port %hd - %s at %s port %hd options %ld weight %d"),
e->from.node->name, from_address, e->from.port,
e->to.node->name, to_address, e->to.port,
e->options, e->weight);
free(from_address);
free(to_address);
}
syslog(LOG_DEBUG, _("End of edges."));

View file

@ -1,7 +1,7 @@
/*
edge.h -- header for edge.c
Copyright (C) 2001 Guus Sliepen <guus@sliepen.warande.net>,
2001 Ivo Timmermans <itimmermans@bigfoot.com>
Copyright (C) 2001-2002 Guus Sliepen <guus@sliepen.warande.net>,
2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: edge.h,v 1.1.2.4 2001/11/16 12:13:34 zarq Exp $
$Id: edge.h,v 1.1.2.5 2002/02/10 21:57:54 guus Exp $
*/
#ifndef __TINC_EDGE_H__
@ -28,18 +28,16 @@
#include "node.h"
#include "connection.h"
/* I don't know if halfconnection_t is useful... */
typedef struct halfconnection_t {
struct node_t *node; /* node associated with this end of the connection */
struct addrinfo *address; /* real (internet) ip on this end of the meta connection */
char *hostname; /* the hostname of real ip */
ipv4_t address; /* real (internet) ip on this end of the meta connection */
port_t port; /* port number of this end of the meta connection */
} halfconnection_t;
typedef struct edge_t {
struct node_t *from;
struct node_t *to;
struct halfconnection_t from;
struct halfconnection_t to;
long int options; /* options turned on for this edge */
int weight; /* weight of this edge */

View file

@ -1,7 +1,7 @@
/*
device.c -- Interaction with FreeBSD tap device
Copyright (C) 2001 Ivo Timmermans <itimmermans@bigfoot.com>,
2001 Guus Sliepen <guus@sliepen.warande.net>
Copyright (C) 2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
2001-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,38 +17,59 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: device.c,v 1.1.2.1 2001/10/12 15:22:59 guus Exp $
$Id: device.c,v 1.1.2.2 2002/02/10 21:57:54 guus Exp $
*/
#include "config.h"
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <net/if.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>
#include <utils.h>
#include "conf.h"
#include "net.h"
#include "subnet.h"
#include "system.h"
#define DEFAULT_DEVICE "/dev/tap0"
int device_fd = -1;
int device_type;
char *device_fname;
char *device;
char *interface;
char *device_info;
int device_total_in = 0;
int device_total_out = 0;
*
extern subnet_t mymac;
/*
open the local ethertap device
*/
int setup_device(void)
{
struct ifreq ifr;
cp
if(!get_config_string(lookup_config(config_tree, "Device"), &device_fname)))
device_fname = DEFAULT_DEVICE;
if(!get_config_string(lookup_config(config_tree, "Device"), &device))
device = DEFAULT_DEVICE;
if(!get_config_string(lookup_config(config_tree, "Interface"), &interface))
interface = netname;
cp
if((device_fd = open(device_fname, O_RDWR | O_NONBLOCK)) < 0)
if((device_fd = open(device, O_RDWR | O_NONBLOCK)) < 0)
{
syslog(LOG_ERR, _("Could not open %s: %m"), device_fname);
syslog(LOG_ERR, _("Could not open %s: %m"), device);
return -1;
}
cp
device_fd = device_fd;
/* Set default MAC address for ethertap devices */
@ -62,11 +83,17 @@ cp
device_info = _("FreeBSD tap device");
syslog(LOG_INFO, _("%s is a %s"), device_fname, device_info);
syslog(LOG_INFO, _("%s is a %s"), device, device_info);
cp
return 0;
}
void close_device(void)
{
cp
close(device_fd);
}
/*
read, encrypt and send data that is
available through the ethertap device
@ -77,7 +104,7 @@ int read_packet(vpn_packet_t *packet)
cp
if((lenin = read(device_fd, packet->data, MTU)) <= 0)
{
syslog(LOG_ERR, _("Error while reading from %s %s: %m"), device_info, device_fname);
syslog(LOG_ERR, _("Error while reading from %s %s: %m"), device_info, device);
return -1;
}
@ -102,10 +129,19 @@ cp
if(write(device_fd, packet->data, packet->len) < 0)
{
syslog(LOG_ERR, _("Error while writing to %s %s: %m"), device_info, device_fname);
syslog(LOG_ERR, _("Error while writing to %s %s: %m"), device_info, device);
return -1;
}
device_total_out += packet->len;
cp
}
void dump_device_stats(void)
{
cp
syslog(LOG_DEBUG, _("Statistics for %s %s:"), device_info, device);
syslog(LOG_DEBUG, _(" total bytes in: %10d"), device_total_in);
syslog(LOG_DEBUG, _(" total bytes out: %10d"), device_total_out);
cp
}

View file

@ -1,7 +1,7 @@
/*
graph.c -- graph algorithms
Copyright (C) 2001 Guus Sliepen <guus@sliepen.warande.net>,
2001 Ivo Timmermans <itimmermans@bigfoot.com>
Copyright (C) 2001-2002 Guus Sliepen <guus@sliepen.warande.net>,
2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: graph.c,v 1.1.2.5 2001/10/31 12:50:24 guus Exp $
$Id: graph.c,v 1.1.2.6 2002/02/10 21:57:54 guus Exp $
*/
/* We need to generate two trees from the graph:
@ -38,14 +38,24 @@
For the SSSP algorithm Dijkstra's seems to be a nice choice. Currently a
simple breadth-first search is presented here.
The SSSP algorithm will also be used to determine whether nodes are directly,
indirectly or not reachable from the source. It will also set the correct
destination address and port of a node if possible.
*/
#include <syslog.h>
#include "config.h"
#include <string.h>
#if defined(HAVE_FREEBSD) || defined(HAVE_OPENBSD)
#include <sys/param.h>
#endif
#include <netinet/in.h>
#include <avl_tree.h>
#include <utils.h>
#include "netutl.h"
#include "node.h"
#include "edge.h"
#include "connection.h"
@ -67,6 +77,11 @@ void mst_kruskal(void)
int safe_edges = 0;
int skipped;
/* Do we have something to do at all? */
if(!edge_weight_tree->head)
return;
/* Clear visited status on nodes */
for(node = node_tree->head; node; node = node->next)
@ -78,7 +93,7 @@ void mst_kruskal(void)
/* Starting point */
((edge_t *)edge_weight_tree->head->data)->from->status.visited = 1;
((edge_t *)edge_weight_tree->head->data)->from.node->status.visited = 1;
/* Clear MST status on connections */
@ -95,14 +110,14 @@ void mst_kruskal(void)
next = node->next;
e = (edge_t *)node->data;
if(e->from->status.visited == e->to->status.visited)
if(e->from.node->status.visited == e->to.node->status.visited)
{
skipped = 1;
continue;
}
e->from->status.visited = 1;
e->to->status.visited = 1;
e->from.node->status.visited = 1;
e->to.node->status.visited = 1;
if(e->connection)
e->connection->status.mst = 1;
@ -120,11 +135,12 @@ void mst_kruskal(void)
Running time: O(E)
*/
void sssp_bfs(int prune)
void sssp_bfs(void)
{
avl_node_t *node, *from, *next, *to;
edge_t *e;
node_t *n, *check;
node_t *n;
halfconnection_t to_hc, from_hc;
avl_tree_t *todo_tree;
todo_tree = avl_alloc_tree(NULL, NULL);
@ -150,46 +166,82 @@ void sssp_bfs(int prune)
while(todo_tree->head)
{
for(from = todo_tree->head; from; from = next)
for(from = todo_tree->head; from; from = next) /* "from" is the node from which we start */
{
next = from->next;
n = (node_t *)from->data;
for(to = n->edge_tree->head; to; to = to->next)
for(to = n->edge_tree->head; to; to = to->next) /* "to" is the edge connected to "from" */
{
e = (edge_t *)to->data;
if(e->from == n)
check = e->to;
if(e->from.node == n) /* "from_hc" is the halfconnection with .node == from */
to_hc = e->to, from_hc = e->from;
else
check = e->from;
to_hc = e->from, from_hc = e->to;
if(!check->status.visited)
if(!to_hc.node->status.visited)
{
check->status.visited = 1;
check->nexthop = (n->nexthop == myself) ? check : n->nexthop;
check->via = (e->options & OPTION_INDIRECT || n->via != n) ? n->via : check;
to_hc.node->status.visited = 1;
to_hc.node->nexthop = (n->nexthop == myself) ? to_hc.node : n->nexthop;
to_hc.node->via = (e->options & OPTION_INDIRECT || n->via != n) ? n->via : to_hc.node;
to_hc.node->options = e->options;
if(to_hc.node->address != to_hc.address || to_hc.node->port != to_hc.port)
{
node = avl_unlink(node_udp_tree, to_hc.node);
to_hc.node->address = to_hc.address;
to_hc.node->port = to_hc.port;
if(to_hc.node->hostname)
free(to_hc.node->hostname);
to_hc.node->hostname = hostlookup(htonl(to_hc.address));
avl_insert_node(node_udp_tree, node);
}
to_hc.node->port = to_hc.port;
node = avl_alloc_node();
node->data = check;
node->data = to_hc.node;
avl_insert_before(todo_tree, from, node);
}
}
avl_delete_node(todo_tree, from);
avl_delete_node(todo_tree, from);
}
}
avl_free_tree(todo_tree);
/* Nodes we haven't visited are unreachable, prune them. */
/* Check reachability status. */
if(prune)
for(node = node_tree->head; node; node = next)
for(node = node_tree->head; node; node = next)
{
next = node->next;
n = (node_t *)node->data;
if(n->status.visited)
{
next = node->next;
n = (node_t *)node->data;
if(n->status.visited == 0)
node_del(n);
if(!n->status.reachable)
{
if(debug_lvl >= DEBUG_TRAFFIC)
syslog(LOG_DEBUG, _("Node %s (%s) became reachable"), n->name, n->hostname);
n->status.reachable = 1;
}
}
else
{
if(n->status.reachable)
{
if(debug_lvl >= DEBUG_TRAFFIC)
syslog(LOG_DEBUG, _("Node %s (%s) became unreachable"), n->name, n->hostname);
n->status.reachable = 0;
n->status.validkey = 0;
n->status.waitingforkey = 0;
n->sent_seqno = 0;
}
}
}
}
void graph(void)
{
mst_kruskal();
sssp_bfs();
}

View file

@ -1,7 +1,7 @@
/*
graph.h -- header for graph.c
Copyright (C) 2001 Guus Sliepen <guus@sliepen.warande.net>,
2001 Ivo Timmermans <itimmermans@bigfoot.com>
Copyright (C) 2001-2002 Guus Sliepen <guus@sliepen.warande.net>,
2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,8 +17,9 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: graph.h,v 1.1.2.2 2001/10/31 12:50:24 guus Exp $
$Id: graph.h,v 1.1.2.3 2002/02/10 21:57:54 guus Exp $
*/
extern void graph(void);
extern void mst_kruskal(void);
extern void sssp_bfs(int);
extern void sssp_bfs(void);

View file

@ -1,7 +1,7 @@
/*
device.c -- Interaction with Linux ethertap and tun/tap device
Copyright (C) 2001 Ivo Timmermans <itimmermans@bigfoot.com>,
2001 Guus Sliepen <guus@sliepen.warande.net>
Copyright (C) 2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
2001-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: device.c,v 1.1.2.4 2001/10/31 12:50:24 guus Exp $
$Id: device.c,v 1.1.2.5 2002/02/10 21:57:54 guus Exp $
*/
#include "config.h"
@ -63,7 +63,7 @@ char *device_info;
int device_total_in = 0;
int device_total_out = 0;
subnet_t mymac;
extern subnet_t mymac;
/*
open the local ethertap device
@ -158,9 +158,7 @@ cp
}
else /* ethertap */
{
struct iovec vector[2] = {{&packet->len, 2}, {packet->data, MTU}};
if((lenin = readv(device_fd, vector, 2)) <= 0)
if((lenin = read(device_fd, packet->data - 2, MTU + 2)) <= 0)
{
syslog(LOG_ERR, _("Error while reading from %s %s: %m"), device_info, device);
return -1;
@ -197,9 +195,8 @@ cp
}
else/* ethertap */
{
struct iovec vector[2] = {{&packet->len, 2}, {packet->data, MTU}};
if(writev(device_fd, vector, 2) < 0)
*(short int *)(packet->data - 2) = packet->len;
if(write(device_fd, packet->data - 2, packet->len + 2) < 0)
{
syslog(LOG_ERR, _("Can't write to %s %s: %m"), device_info, device);
return -1;

View file

@ -1,7 +1,7 @@
/*
meta.c -- handle the meta communication
Copyright (C) 2000,2001 Guus Sliepen <guus@sliepen.warande.net>,
2000,2001 Ivo Timmermans <itimmermans@bigfoot.com>
Copyright (C) 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: meta.c,v 1.1.2.21 2001/10/27 12:13:17 guus Exp $
$Id: meta.c,v 1.1.2.22 2002/02/10 21:57:54 guus Exp $
*/
#include "config.h"

View file

@ -1,7 +1,7 @@
/*
meta.h -- header for meta.c
Copyright (C) 2000,2001 Guus Sliepen <guus@sliepen.warande.net>,
2000,2001 Ivo Timmermans <itimmermans@bigfoot.com>
Copyright (C) 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: meta.h,v 1.1.2.5 2001/01/07 17:08:58 guus Exp $
$Id: meta.h,v 1.1.2.6 2002/02/10 21:57:54 guus Exp $
*/
#ifndef __TINC_META_H__

766
src/net.c

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,7 @@
/*
net.h -- header for net.c
Copyright (C) 1998-2001 Ivo Timmermans <zarq@iname.com>
2000,2001 Guus Sliepen <guus@sliepen.warande.net>
Copyright (C) 1998-2002 Ivo Timmermans <zarq@iname.com>
2000-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: net.h,v 1.9.4.37 2001/11/16 12:08:38 zarq Exp $
$Id: net.h,v 1.9.4.38 2002/02/10 21:57:54 guus Exp $
*/
#ifndef __TINC_NET_H__
@ -27,41 +27,35 @@
#include "config.h"
#define MAXSIZE 1700 /* should be a bit more than the MTU for the tapdevice */
#define MTU 1600
#define SALTLEN 2 /* to spice things up for the NSA... */
#define MTU 1514 /* 1500 bytes payload + 14 bytes ethernet header */
#define MAXSIZE 1600 /* MTU + header (seqno) and trailer (CBC padding and HMAC) */
#define MAC_ADDR_S "%02x:%02x:%02x:%02x:%02x:%02x"
#define MAC_ADDR_V(x) ((unsigned char*)&(x))[0],((unsigned char*)&(x))[1], \
((unsigned char*)&(x))[2],((unsigned char*)&(x))[3], \
((unsigned char*)&(x))[4],((unsigned char*)&(x))[5]
#define IP_ADDR_S "%d.%d.%d.%d"
#ifdef WORDS_BIGENDIAN
# define IP_ADDR_V(x) ((unsigned char*)&(x))[0],((unsigned char*)&(x))[1], \
((unsigned char*)&(x))[2],((unsigned char*)&(x))[3]
#else
# define IP_ADDR_V(x) ((unsigned char*)&(x))[3],((unsigned char*)&(x))[2], \
((unsigned char*)&(x))[1],((unsigned char*)&(x))[0]
#endif
#define MAXBUFSIZE 4096 /* Probably way too much, but it must fit every possible request. */
/* tap types */
#define TAP_TYPE_ETHERTAP 0
#define TAP_TYPE_TUNTAP 1
#define MAXBUFSIZE 2048 /* Probably way too much, but it must fit every possible request. */
typedef struct mac_t
{
unsigned char x[6];
} mac_t;
typedef unsigned long ipv4_t;
typedef struct ip_mask_t {
ipv4_t address;
ipv4_t mask;
} ip_mask_t;
typedef struct ipv6_t
{
unsigned short x[8];
} ipv6_t;
typedef unsigned short port_t;
typedef short length_t;
typedef struct vpn_packet_t {
length_t len; /* the actual number of bytes in the `data' field */
unsigned char salt[SALTLEN]; /* two bytes of randomness */
unsigned int seqno; /* 32 bits sequence number (network byte order of course) */
unsigned char data[MAXSIZE];
} vpn_packet_t;
@ -76,11 +70,16 @@ typedef struct packet_queue_t {
queue_element_t *tail;
} packet_queue_t;
typedef struct outgoing_t {
char *name;
int timeout;
} outgoing_t;
extern int maxtimeout;
extern int seconds_till_retry;
extern char *request_name[256];
extern char *status_text[10];
extern char *request_name[];
extern char *status_text[];
#include "connection.h" /* Yes, very strange placement indeed, but otherwise the typedefs get all tangled up */
@ -89,11 +88,12 @@ extern void receive_packet(struct node_t *, vpn_packet_t *);
extern void receive_tcppacket(struct connection_t *, char *, int);
extern void broadcast_packet(struct node_t *, vpn_packet_t *);
extern int setup_network_connections(void);
extern void setup_outgoing_connection(struct outgoing_t *);
extern void try_outgoing_connections(void);
extern void close_network_connections(void);
extern void main_loop(void);
extern void terminate_connection(connection_t *, int);
extern void flush_queue(struct node_t *);
extern int read_rsa_public_key(struct connection_t *);
extern RETSIGTYPE try_outgoing_connections(int);
#endif /* __TINC_NET_H__ */

View file

@ -1,7 +1,7 @@
/*
node.c -- node tree management
Copyright (C) 2001 Guus Sliepen <guus@sliepen.warande.net>,
2001 Ivo Timmermans <itimmermans@bigfoot.com>
Copyright (C) 2001-2002 Guus Sliepen <guus@sliepen.warande.net>,
2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: node.c,v 1.1.2.7 2001/11/16 17:39:38 zarq Exp $
$Id: node.c,v 1.1.2.8 2002/02/10 21:57:54 guus Exp $
*/
#include "config.h"
@ -47,10 +47,13 @@ int node_udp_compare(node_t *a, node_t *b)
{
if(a->address < b->address)
return -1;
else if (a->address > b->address)
if (a->address > b->address)
return 1;
else
return a->port - b->port;
if (a->port < b->port)
return -1;
if (a->port > b->port)
return 1;
return (a->name && b->name)?strcmp(a->name, b->name):0;
}
void init_nodes(void)
@ -140,11 +143,13 @@ cp
return avl_search(node_tree, &n);
}
node_t *lookup_node_udp(struct addrinfo *address)
node_t *lookup_node_udp(ipv4_t address, port_t port)
{
node_t n;
cp
n.name = NULL;
n.address = address;
n.port = port;
return avl_search(node_udp_tree, &n);
}
@ -158,9 +163,9 @@ cp
for(node = node_tree->head; node; node = node->next)
{
n = (node_t *)node->data;
syslog(LOG_DEBUG, _(" %s at %s port %s options %ld status %04x nexthop %s via %s"),
n->name, n->hostname, n->port, n->options,
n->status, n->nexthop->name, n->via->name);
syslog(LOG_DEBUG, _(" %s at %s port %hd cipher %d digest %d maclength %d options %ld status %04x nexthop %s via %s"),
n->name, n->hostname, n->port, n->cipher?n->cipher->nid:0, n->digest?n->digest->type:0, n->maclength, n->options,
n->status, n->nexthop?n->nexthop->name:"-", n->via?n->via->name:"-");
}
syslog(LOG_DEBUG, _("End of nodes."));

View file

@ -1,7 +1,7 @@
/*
node.h -- header for node.c
Copyright (C) 2001 Guus Sliepen <guus@sliepen.warande.net>,
2001 Ivo Timmermans <itimmermans@bigfoot.com>
Copyright (C) 2001-2002 Guus Sliepen <guus@sliepen.warande.net>,
2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: node.h,v 1.1.2.9 2001/11/16 15:56:44 zarq Exp $
$Id: node.h,v 1.1.2.10 2002/02/10 21:57:54 guus Exp $
*/
#ifndef __TINC_NODE_H__
@ -33,23 +33,27 @@ typedef struct node_status_t {
int validkey:1; /* 1 if we currently have a valid key for him */
int waitingforkey:1; /* 1 if we already sent out a request */
int visited:1; /* 1 if this node has been visited by one of the graph algorithms */
int unused:28;
int reachable:1; /* 1 if this node is reachable in the graph */
int unused:27;
} node_status_t;
typedef struct node_t {
char *name; /* name of this node */
long int options; /* options turned on for this node */
struct addrinfo *address; /* his real (internet) ip to send UDP packets to */
char *port; /* string representation of the port number */
ipv4_t address; /* his real (internet) ip to send UDP packets to */
port_t port; /* port number of UDP connection */
char *hostname; /* the hostname of its real ip */
struct node_status_t status;
EVP_CIPHER *cipher; /* Cipher type for UDP packets */
const EVP_CIPHER *cipher; /* Cipher type for UDP packets */
char *key; /* Cipher key and iv */
int keylength; /* Cipher key and iv length*/
const EVP_MD *digest; /* Digest type for MAC */
int maclength; /* Length of MAC */
list_t *queue; /* Queue for packets awaiting to be encrypted */
struct node_t *nexthop; /* nearest node from us to him */
@ -60,10 +64,14 @@ typedef struct node_t {
avl_tree_t *edge_tree; /* Edges with this node as one of the endpoints */
struct connection_t *connection; /* Connection associated with this node (if a direct connection exists) */
unsigned int sent_seqno; /* Sequence number last sent to this node */
unsigned int received_seqno; /* Sequence number last received from this node */
} node_t;
extern struct node_t *myself;
extern avl_tree_t *node_tree;
extern avl_tree_t *node_udp_tree;
extern void init_nodes(void);
extern void exit_nodes(void);
@ -72,8 +80,7 @@ extern void free_node(node_t *n);
extern void node_add(node_t *n);
extern void node_del(node_t *n);
extern node_t *lookup_node(char *);
extern node_t *lookup_node_udp(struct addrinfo *);
extern node_t *lookup_node_udp(ipv4_t, port_t);
extern void dump_nodes(void);
#endif /* __TINC_NODE_H__ */

View file

@ -1,7 +1,7 @@
/*
device.c -- Interaction with OpenBSD tun device
Copyright (C) 2001 Ivo Timmermans <itimmermans@bigfoot.com>,
2001 Guus Sliepen <guus@sliepen.warande.net>
Copyright (C) 2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
2001-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,9 +17,30 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: device.c,v 1.1.2.2 2001/10/12 15:52:03 guus Exp $
$Id: device.c,v 1.1.2.3 2002/02/10 21:57:54 guus Exp $
*/
#include "config.h"
#include <stdio.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <net/if.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>
#include <utils.h>
#include "conf.h"
#include "net.h"
#include "subnet.h"
#include "system.h"
#define DEFAULT_DEVICE "/dev/tun0"
#define DEVICE_TYPE_ETHERTAP 0
@ -27,24 +48,29 @@
int device_fd = -1;
int device_type;
char *device_fname;
char *device;
char *interface;
char *device_info;
int device_total_in = 0;
int device_total_out = 0;
extern subnet_t mymac;
/*
open the local ethertap device
*/
int setup_device(void)
{
if(!get_config_string(lookup_config(config_tree, "Device"), &device_fname)))
device_fname = DEFAULT_DEVICE;
if(!get_config_string(lookup_config(config_tree, "Device"), &device))
device = DEFAULT_DEVICE;
if(!get_config_string(lookup_config(config_tree, "Interface"), &interface))
interface = netname;
cp
if((device_fd = open(device_fname, O_RDWR | O_NONBLOCK)) < 0)
if((device_fd = open(device, O_RDWR | O_NONBLOCK)) < 0)
{
syslog(LOG_ERR, _("Could not open %s: %m"), device_fname);
syslog(LOG_ERR, _("Could not open %s: %m"), device);
return -1;
}
cp
@ -60,28 +86,35 @@ cp
device_info = _("OpenBSD tun device");
syslog(LOG_INFO, _("%s is a %s"), device_fname, device_info);
syslog(LOG_INFO, _("%s is a %s"), device, device_info);
cp
return 0;
}
void close_device(void)
{
cp
close(device_fd);
cp
}
int read_packet(vpn_packet_t *packet)
{
int lenin;
u_int32_t type;
cp
struct iovec vector[2] = {{&type, sizeof(type)}, {packet->data + 14, MTU - 14}};
cp
if((lenin = readv(device_fd, vector, 2)) <= 0)
{
syslog(LOG_ERR, _("Error while reading from %s %s: %m"), device_info, device_fname);
syslog(LOG_ERR, _("Error while reading from %s %s: %m"), device_info, device);
return -1;
}
memcpy(vp->data, mymac.net.mac.address.x, 6);
memcpy(vp->data + 6, mymac.net.mac.address.x, 6);
vp->data[12] = 0x08;
vp->data[13] = 0x00;
memcpy(packet->data, mymac.net.mac.address.x, 6);
memcpy(packet->data + 6, mymac.net.mac.address.x, 6);
packet->data[12] = 0x08;
packet->data[13] = 0x00;
packet->len = lenin + 10;
@ -89,7 +122,7 @@ cp
if(debug_lvl >= DEBUG_TRAFFIC)
{
syslog(LOG_DEBUG, _("Read packet of %d bytes from %s"), device_info, packet.len);
syslog(LOG_DEBUG, _("Read packet of %d bytes from %s"), packet->len, device_info);
}
return 0;
@ -99,20 +132,32 @@ cp
int write_packet(vpn_packet_t *packet)
{
u_int32_t type = htonl(AF_INET);
struct iovec vector[2];
cp
if(debug_lvl >= DEBUG_TRAFFIC)
syslog(LOG_DEBUG, _("Writing packet of %d bytes to %s"),
packet->len, device_info);
struct iovec vector[2] = {{&type, sizeof(type)}, {packet->data + 14, packet->len - 14}};
vector[0].iov_base = &type;
vector[0].iov_len = sizeof(type);
vector[1].iov_base = packet->data + 14;
vector[1].iov_len = packet->len - 14;
if(writev(device_fd, vector, 2) < 0)
{
syslog(LOG_ERR, _("Can't write to %s %s: %m"), device_info, packet.len);
syslog(LOG_ERR, _("Can't write to %s %s: %m"), device_info, device);
return -1;
}
device_total_out += packet->len;
cp
}
void dump_device_stats(void)
{
cp
syslog(LOG_DEBUG, _("Statistics for %s %s:"), device_info, device);
syslog(LOG_DEBUG, _(" total bytes in: %10d"), device_total_in);
syslog(LOG_DEBUG, _(" total bytes out: %10d"), device_total_out);
cp
}

View file

@ -1,7 +1,7 @@
/*
process.c -- process management functions
Copyright (C) 1999-2001 Ivo Timmermans <itimmermans@bigfoot.com>,
2000,2001 Guus Sliepen <guus@sliepen.warande.net>
Copyright (C) 1999-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
2000-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: process.c,v 1.1.2.32 2001/11/03 22:53:02 guus Exp $
$Id: process.c,v 1.1.2.33 2002/02/10 21:57:54 guus Exp $
*/
#include "config.h"
@ -59,6 +59,10 @@ sigset_t emptysigset;
static int saved_debug_lvl = 0;
extern int sighup;
extern int sigalrm;
extern int do_purge;
void memory_full(int size)
{
syslog(LOG_ERR, _("Memory exhausted (couldn't allocate %d bytes), exiting."), size);
@ -342,6 +346,7 @@ sigsegv_handler(int a, siginfo_t *info, void *b)
act.sa_mask = emptysigset;
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = sigsegv_square;
sigaction(SIGSEGV, &act, NULL);
close_network_connections();
sleep(5);
@ -351,7 +356,7 @@ sigsegv_handler(int a, siginfo_t *info, void *b)
else
{
syslog(LOG_NOTICE, _("Not restarting."));
exit(0);
exit(1);
}
}
@ -382,6 +387,14 @@ sigint_handler(int a, siginfo_t *info, void *b)
}
}
RETSIGTYPE
sigalrm_handler(int a, siginfo_t *info, void *b)
{
if(debug_lvl > DEBUG_NOTHING)
syslog(LOG_NOTICE, _("Got ALRM signal"));
sigalrm = 1;
}
RETSIGTYPE
sigusr1_handler(int a, siginfo_t *info, void *b)
{
@ -397,6 +410,13 @@ sigusr2_handler(int a, siginfo_t *info, void *b)
dump_subnets();
}
RETSIGTYPE
sigwinch_handler(int a, siginfo_t *info, void *b)
{
extern int do_purge;
do_purge = 1;
}
RETSIGTYPE
unexpected_signal_handler(int a, siginfo_t *info, void *b)
{
@ -427,7 +447,8 @@ struct {
{ SIGUSR1, sigusr1_handler },
{ SIGUSR2, sigusr2_handler },
{ SIGCHLD, ignore_signal_handler },
{ SIGALRM, ignore_signal_handler },
{ SIGALRM, sigalrm_handler },
{ SIGWINCH, sigwinch_handler },
{ 0, NULL }
};
@ -447,7 +468,7 @@ setup_signals(void)
for(i = 0; i < NSIG; i++)
{
if(!do_detach)
act.sa_sigaction = SIG_DFL;
act.sa_sigaction = (void(*)(int, siginfo_t *, void *))SIG_DFL;
else
act.sa_sigaction = unexpected_signal_handler;
sigaction(i, &act, NULL);
@ -455,7 +476,7 @@ setup_signals(void)
/* If we didn't detach, allow coredumps */
if(!do_detach)
sighandlers[3].handler = SIG_DFL;
sighandlers[3].handler = (void(*)(int, siginfo_t *, void *))SIG_DFL;
/* Then, for each known signal that we want to catch, assign a
handler to the signal, with error checking this time. */

View file

@ -1,7 +1,7 @@
/*
process.h -- header file for process.c
Copyright (C) 1999-2001 Ivo Timmermans <itimmermans@bigfoot.com>,
2000,2001 Guus Sliepen <guus@sliepen.warande.net>
Copyright (C) 1999-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
2000-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: process.h,v 1.1.2.9 2001/09/01 12:36:53 guus Exp $
$Id: process.h,v 1.1.2.10 2002/02/10 21:57:54 guus Exp $
*/
#ifndef __TINC_PROCESS_H__

File diff suppressed because it is too large Load diff

View file

@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: protocol.h,v 1.5.4.24 2001/10/28 08:41:19 guus Exp $
$Id: protocol.h,v 1.5.4.25 2002/02/10 21:57:54 guus Exp $
*/
#ifndef __TINC_PROTOCOL_H__
@ -31,7 +31,7 @@
incompatible version have different protocols.
*/
#define PROT_CURRENT 11
#define PROT_CURRENT 12
/* Request numbers */
@ -40,7 +40,7 @@ enum {
ID = 0, METAKEY, CHALLENGE, CHAL_REPLY, ACK,
STATUS, ERROR, TERMREQ,
PING, PONG,
ADD_NODE, DEL_NODE,
// ADD_NODE, DEL_NODE,
ADD_SUBNET, DEL_SUBNET,
ADD_EDGE, DEL_EDGE,
KEY_CHANGED, REQ_KEY, ANS_KEY,
@ -53,33 +53,58 @@ enum {
#define MAX_STRING_SIZE 1024
#define MAX_STRING "%1024s"
extern int (*request_handlers[])(connection_t*);
/* Basic functions */
extern int send_id(connection_t*);
extern int send_metakey(connection_t*);
extern int send_challenge(connection_t*);
extern int send_chal_reply(connection_t*);
extern int send_ack(connection_t*);
extern int send_status(connection_t*, int, char*);
extern int send_error(connection_t*, int, char*);
extern int send_termreq(connection_t*);
extern int send_ping(connection_t*);
extern int send_pong(connection_t*);
extern int send_add_node(connection_t*, node_t*);
extern int send_del_node(connection_t*, node_t*);
extern int send_add_subnet(connection_t*, subnet_t*);
extern int send_del_subnet(connection_t*, subnet_t*);
extern int send_add_edge(connection_t*, edge_t*);
extern int send_del_edge(connection_t*, edge_t*);
extern int send_key_changed(connection_t*, node_t*);
extern int send_req_key(connection_t*, node_t*, node_t*);
extern int send_ans_key(connection_t*, node_t*, node_t*, char*);
extern int send_tcppacket(connection_t *, vpn_packet_t *);
/* Old functions */
extern int notify_others(connection_t *, connection_t *, int (*function)(connection_t*, connection_t*));
extern int send_request(connection_t*, const char*, ...);
extern int receive_request(connection_t *);
extern int check_id(char *);
/* Requests */
extern int send_id(connection_t *);
extern int send_metakey(connection_t *);
extern int send_challenge(connection_t *);
extern int send_chal_reply(connection_t *);
extern int send_ack(connection_t *);
extern int send_status(connection_t *, int, char *);
extern int send_error(connection_t *, int, char *);
extern int send_termreq(connection_t *);
extern int send_ping(connection_t *);
extern int send_pong(connection_t *);
// extern int send_add_node(connection_t *, node_t *);
// extern int send_del_node(connection_t *, node_t *);
extern int send_add_subnet(connection_t *, subnet_t *);
extern int send_del_subnet(connection_t *, subnet_t *);
extern int send_add_edge(connection_t *, edge_t *);
extern int send_del_edge(connection_t *, edge_t *);
extern int send_key_changed(connection_t *, node_t *);
extern int send_req_key(connection_t *, node_t *, node_t *);
extern int send_ans_key(connection_t *, node_t *, node_t *);
extern int send_tcppacket(connection_t *, vpn_packet_t *);
/* Request handlers */
extern int (*request_handlers[])(connection_t *);
extern int id_h(connection_t *);
extern int metakey_h(connection_t *);
extern int challenge_h(connection_t *);
extern int chal_reply_h(connection_t *);
extern int ack_h(connection_t *);
extern int status_h(connection_t *);
extern int error_h(connection_t *);
extern int termreq_h(connection_t *);
extern int ping_h(connection_t *);
extern int pong_h(connection_t *);
// extern int add_node_h(connection_t *);
// extern int del_node_h(connection_t *);
extern int add_subnet_h(connection_t *);
extern int del_subnet_h(connection_t *);
extern int add_edge_h(connection_t *);
extern int del_edge_h(connection_t *);
extern int key_changed_h(connection_t *);
extern int req_key_h(connection_t *);
extern int ans_key_h(connection_t *);
extern int tcppacket_h(connection_t *);
#endif /* __TINC_PROTOCOL_H__ */

View file

@ -1,7 +1,7 @@
/*
route.c -- routing
Copyright (C) 2000,2001 Ivo Timmermans <itimmermans@bigfoot.com>,
2000,2001 Guus Sliepen <guus@sliepen.warande.net>
Copyright (C) 2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
2000-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,17 +17,17 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: route.c,v 1.1.2.21 2001/11/16 17:40:50 zarq Exp $
$Id: route.c,v 1.1.2.22 2002/02/10 21:57:54 guus Exp $
*/
#include "config.h"
#ifdef HAVE_FREEBSD
#if defined(HAVE_FREEBSD) || defined(HAVE_OPENBSD)
#include <sys/param.h>
#endif
#include <sys/socket.h>
#include <netinet/in.h>
#ifdef HAVE_SOLARIS
#if defined(HAVE_SOLARIS) || defined(HAVE_OPENBSD)
#include <net/if.h>
#define ETHER_ADDR_LEN 6
#else
@ -66,7 +66,7 @@ cp
if(!subnet || subnet->owner!=myself)
{
if(debug_lvl >= DEBUG_TRAFFIC)
syslog(LOG_INFO, _("Learned new MAC address %hhx:%hhx:%hhx:%hhx:%hhx:%hhx"),
syslog(LOG_INFO, _("Learned new MAC address %hx:%hx:%hx:%hx:%hx:%hx"),
address->x[0], address->x[1], address->x[2], address->x[3], address->x[4], address->x[5]);
subnet = new_subnet();
@ -103,10 +103,26 @@ cp
return NULL;
}
node_t *route_ipv4(vpn_packet_t *packet)
{
ipv4_t dest;
subnet_t *subnet;
cp
#ifdef HAVE_SOLARIS
/* The other form gives bus errors on a SparcStation 20. */
dest = ((packet->data[30] * 0x100 + packet->data[31]) * 0x100 + packet->data[32]) * 0x100 + packet->data[33];
#else
dest = ntohl(*((unsigned long*)(&packet->data[30])));
#endif
cp
subnet = lookup_subnet_ipv4(&dest);
cp
if(!subnet)
{
if(debug_lvl >= DEBUG_TRAFFIC)
{
syslog(LOG_WARNING, _("Cannot route packet: unknown destination address %d.%d.%d.%d"),
packet->data[30], packet->data[31], packet->data[32], packet->data[33]);
}
return NULL;
@ -115,21 +131,25 @@ cp
return subnet->owner;
}
node_t *route_ip(vpn_packet_t *packet)
node_t *route_ipv6(vpn_packet_t *packet)
{
struct addrinfo *dest;
subnet_t *subnet;
cp
#warning FIXME
memcpy(&dest, &packet->data[30], 0);
subnet = lookup_subnet_ip(&dest);
subnet = lookup_subnet_ipv6((ipv6_t *)&packet->data[38]);
cp
if(!subnet)
{
if(debug_lvl >= DEBUG_TRAFFIC)
{
syslog(LOG_WARNING, _("Cannot route packet: unknown IP destination address"));
syslog(LOG_WARNING, _("Cannot route packet: unknown IPv6 destination address %hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx"),
ntohs(*(short unsigned int *)&packet->data[38]),
ntohs(*(short unsigned int *)&packet->data[40]),
ntohs(*(short unsigned int *)&packet->data[42]),
ntohs(*(short unsigned int *)&packet->data[44]),
ntohs(*(short unsigned int *)&packet->data[46]),
ntohs(*(short unsigned int *)&packet->data[48]),
ntohs(*(short unsigned int *)&packet->data[50]),
ntohs(*(short unsigned int *)&packet->data[52]));
}
return NULL;
@ -143,7 +163,7 @@ void route_arp(vpn_packet_t *packet)
struct ether_arp *arp;
subnet_t *subnet;
unsigned char ipbuf[4];
struct addrinfo *dest;
ipv4_t dest;
cp
/* First, snatch the source address from the ARP packet */
@ -172,9 +192,9 @@ cp
}
/* Check if the IP address exists on the VPN */
#warning FIXME
dest = ntohl(*((unsigned long*)(arp->arp_tpa)));
subnet = lookup_subnet_ip(&dest);
subnet = lookup_subnet_ipv4(&dest);
if(!subnet)
{

View file

@ -1,7 +1,7 @@
/*
route.h -- header file for route.c
Copyright (C) 2000,2001 Ivo Timmermans <zarq@iname.com>
2000,2001 Guus Sliepen <guus@sliepen.warande.net>
Copyright (C) 2000-2002 Ivo Timmermans <zarq@iname.com>
2000-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: route.h,v 1.1.2.4 2001/10/27 12:13:17 guus Exp $
$Id: route.h,v 1.1.2.5 2002/02/10 21:57:54 guus Exp $
*/
#ifndef __TINC_ROUTE_H__

View file

@ -1,7 +1,7 @@
/*
device.c -- Interaction with Solaris tun device
Copyright (C) 2001 Ivo Timmermans <itimmermans@bigfoot.com>,
2001 Guus Sliepen <guus@sliepen.warande.net>
Copyright (C) 2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
2001-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: device.c,v 1.1.2.3 2001/11/05 19:06:07 guus Exp $
$Id: device.c,v 1.1.2.4 2002/02/10 21:57:54 guus Exp $
*/
@ -157,7 +157,7 @@ cp
if(debug_lvl >= DEBUG_TRAFFIC)
{
syslog(LOG_DEBUG, _("Read packet of %d bytes from %s"), device_info, packet->len);
syslog(LOG_DEBUG, _("Read packet of %d bytes from %s"), packet->len, device_info);
}
return 0;

View file

@ -1,7 +1,7 @@
/*
subnet.c -- handle subnet lookups and lists
Copyright (C) 2000,2001 Guus Sliepen <guus@sliepen.warande.net>,
2000,2001 Ivo Timmermans <itimmermans@bigfoot.com>
Copyright (C) 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: subnet.c,v 1.1.2.28 2001/10/30 12:59:12 guus Exp $
$Id: subnet.c,v 1.1.2.29 2002/02/10 21:57:54 guus Exp $
*/
#include "config.h"
@ -25,6 +25,10 @@
#include <stdio.h>
#include <syslog.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
#include <netinet/in.h>
#include "conf.h"
#include "net.h"
@ -102,10 +106,12 @@ cp
case SUBNET_IPV6:
return subnet_compare_ipv6(a, b);
default:
syslog(LOG_ERR, _("subnet_compare() was called with unknown subnet type %d, restarting!"), a->type);
sighup = 1;
return 0;
syslog(LOG_ERR, _("subnet_compare() was called with unknown subnet type %d, exitting!"), a->type);
cp_trace();
exit(0);
}
return 0;
}
/* Initialising trees */
@ -178,65 +184,108 @@ cp
subnet_t *str2net(char *subnetstr)
{
int type;
int i, l;
subnet_t *subnet;
cp
if(sscanf(subnetstr, "%d,", &type) != 1)
return NULL;
unsigned short int x[6];
cp
subnet = new_subnet();
cp
switch(type)
if(sscanf(subnetstr, "%hu.%hu.%hu.%hu/%d",
&x[0],
&x[1],
&x[2],
&x[3],
&subnet->net.ipv4.masklength) == 5)
{
case SUBNET_MAC:
if(sscanf(subnetstr, "%d,%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", &subnet->type,
&subnet->net.mac.address.x[0],
&subnet->net.mac.address.x[1],
&subnet->net.mac.address.x[2],
&subnet->net.mac.address.x[3],
&subnet->net.mac.address.x[4],
&subnet->net.mac.address.x[5]) != 7)
{
free_subnet(subnet);
return NULL;
}
break;
case SUBNET_IPV4:
if(sscanf(subnetstr, "%d,%lx/%lx", &subnet->type, &subnet->net.ipv4.address, &subnet->net.ipv4.mask) != 3)
{
free_subnet(subnet);
return NULL;
}
break;
case SUBNET_IPV6:
if(sscanf(subnetstr, "%d,%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx/%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx", &subnet->type,
&subnet->net.ipv6.address.x[0],
&subnet->net.ipv6.address.x[1],
&subnet->net.ipv6.address.x[2],
&subnet->net.ipv6.address.x[3],
&subnet->net.ipv6.address.x[4],
&subnet->net.ipv6.address.x[5],
&subnet->net.ipv6.address.x[6],
&subnet->net.ipv6.address.x[7],
&subnet->net.ipv6.mask.x[0],
&subnet->net.ipv6.mask.x[1],
&subnet->net.ipv6.mask.x[2],
&subnet->net.ipv6.mask.x[3],
&subnet->net.ipv6.mask.x[4],
&subnet->net.ipv6.mask.x[5],
&subnet->net.ipv6.mask.x[6],
&subnet->net.ipv6.mask.x[7]) != 17)
{
free_subnet(subnet);
return NULL;
}
break;
default:
free_subnet(subnet);
return NULL;
subnet->type = SUBNET_IPV4;
subnet->net.ipv4.address = (((((x[0] << 8) + x[1]) << 8) + x[2]) << 8) + x[3];
subnet->net.ipv4.mask = ~((1 << (32 - subnet->net.ipv4.masklength)) - 1);
return subnet;
}
cp
return subnet;
if(sscanf(subnetstr, "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx/%d",
&subnet->net.ipv6.address.x[0],
&subnet->net.ipv6.address.x[1],
&subnet->net.ipv6.address.x[2],
&subnet->net.ipv6.address.x[3],
&subnet->net.ipv6.address.x[4],
&subnet->net.ipv6.address.x[5],
&subnet->net.ipv6.address.x[6],
&subnet->net.ipv6.address.x[7],
&subnet->net.ipv6.masklength) == 9)
{
subnet->type = SUBNET_IPV6;
for(l = subnet->net.ipv6.masklength, i = 0; i < 8; l -= 16, i++)
{
subnet->net.ipv6.address.x[i] = htons(subnet->net.ipv6.address.x[i]);
if(l >= 16)
subnet->net.ipv6.mask.x[i] = 65535;
else if (l > 0)
subnet->net.ipv6.mask.x[i] = htons(65536 - (1 << l));
else
subnet->net.ipv6.mask.x[i] = 0;
}
return subnet;
}
if(sscanf(subnetstr, "%hu.%hu.%hu.%hu",
&x[0],
&x[1],
&x[2],
&x[3]) == 4)
{
subnet->type = SUBNET_IPV4;
subnet->net.ipv4.address = (((((x[0] << 8) + x[1]) << 8) + x[2]) << 8) + x[3];
subnet->net.ipv4.mask = ~0;
subnet->net.ipv4.masklength = 32;
return subnet;
}
if(sscanf(subnetstr, "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx",
&subnet->net.ipv6.address.x[0],
&subnet->net.ipv6.address.x[1],
&subnet->net.ipv6.address.x[2],
&subnet->net.ipv6.address.x[3],
&subnet->net.ipv6.address.x[4],
&subnet->net.ipv6.address.x[5],
&subnet->net.ipv6.address.x[6],
&subnet->net.ipv6.address.x[7]) == 8)
{
subnet->type = SUBNET_IPV6;
subnet->net.ipv6.masklength = 128;
for(l = subnet->net.ipv6.masklength, i = 0; i < 8; l -= 16, i++)
{
subnet->net.ipv6.address.x[i] = htons(subnet->net.ipv6.address.x[i]);
if(l >= 16)
subnet->net.ipv6.mask.x[i] = 65535;
else if (l > 0)
subnet->net.ipv6.mask.x[i] = htons(65536 - (1 << l));
else
subnet->net.ipv6.mask.x[i] = 0;
}
return subnet;
}
if(sscanf(subnetstr, "%hx:%hx:%hx:%hx:%hx:%hx",
&x[0],
&x[1],
&x[2],
&x[3],
&x[4],
&x[5]) == 6)
{
subnet->type = SUBNET_MAC;
subnet->net.mac.address.x[0] = x[0];
subnet->net.mac.address.x[1] = x[1];
subnet->net.mac.address.x[2] = x[2];
subnet->net.mac.address.x[3] = x[3];
subnet->net.mac.address.x[4] = x[4];
subnet->net.mac.address.x[5] = x[5];
return subnet;
}
free(subnet);
return NULL;
}
char *net2str(subnet_t *subnet)
@ -246,7 +295,7 @@ cp
switch(subnet->type)
{
case SUBNET_MAC:
asprintf(&netstr, "%d,%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", subnet->type,
asprintf(&netstr, "%hx:%hx:%hx:%hx:%hx:%hx",
subnet->net.mac.address.x[0],
subnet->net.mac.address.x[1],
subnet->net.mac.address.x[2],
@ -255,26 +304,24 @@ cp
subnet->net.mac.address.x[5]);
break;
case SUBNET_IPV4:
asprintf(&netstr, "%d,%lx/%lx", subnet->type, subnet->net.ipv4.address, subnet->net.ipv4.mask);
asprintf(&netstr, "%hu.%hu.%hu.%hu/%d",
(unsigned short int)((subnet->net.ipv4.address >> 24) & 255),
(unsigned short int)((subnet->net.ipv4.address >> 16) & 255),
(unsigned short int)((subnet->net.ipv4.address >> 8) & 255),
(unsigned short int)(subnet->net.ipv4.address & 255),
subnet->net.ipv4.masklength);
break;
case SUBNET_IPV6:
asprintf(&netstr, "%d,%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx/%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx", subnet->type,
subnet->net.ipv6.address.x[0],
subnet->net.ipv6.address.x[1],
subnet->net.ipv6.address.x[2],
subnet->net.ipv6.address.x[3],
subnet->net.ipv6.address.x[4],
subnet->net.ipv6.address.x[5],
subnet->net.ipv6.address.x[6],
subnet->net.ipv6.address.x[7],
subnet->net.ipv6.mask.x[0],
subnet->net.ipv6.mask.x[1],
subnet->net.ipv6.mask.x[2],
subnet->net.ipv6.mask.x[3],
subnet->net.ipv6.mask.x[4],
subnet->net.ipv6.mask.x[5],
subnet->net.ipv6.mask.x[6],
subnet->net.ipv6.mask.x[7]);
asprintf(&netstr, "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx/%d",
ntohs(subnet->net.ipv6.address.x[0]),
ntohs(subnet->net.ipv6.address.x[1]),
ntohs(subnet->net.ipv6.address.x[2]),
ntohs(subnet->net.ipv6.address.x[3]),
ntohs(subnet->net.ipv6.address.x[4]),
ntohs(subnet->net.ipv6.address.x[5]),
ntohs(subnet->net.ipv6.address.x[6]),
ntohs(subnet->net.ipv6.address.x[7]),
subnet->net.ipv6.masklength);
break;
default:
asprintf(&netstr, _("unknown subnet type"));
@ -342,8 +389,8 @@ subnet_t *lookup_subnet_ipv6(ipv6_t *address)
int i;
cp
subnet.type = SUBNET_IPV6;
memcpy(&subnet.net.ipv6.address, address, sizeof(ipv6_t));
memset(&subnet.net.ipv6.mask, 0xFF, 16);
memcpy(subnet.net.ipv6.address.x, address, sizeof(ipv6_t));
memset(subnet.net.ipv6.mask.x, 0xFF, 16);
p = (subnet_t *)avl_search_closest_greater(subnet_tree, &subnet);
@ -366,7 +413,7 @@ cp
{
subnet = (subnet_t *)node->data;
netstr = net2str(subnet);
syslog(LOG_DEBUG, " %s owner %s", netstr, subnet->owner->name);
syslog(LOG_DEBUG, _(" %s owner %s"), netstr, subnet->owner->name);
free(netstr);
}
syslog(LOG_DEBUG, _("End of subnet list."));

View file

@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: subnet.h,v 1.1.2.14 2001/11/16 12:10:54 zarq Exp $
$Id: subnet.h,v 1.1.2.15 2002/02/10 21:57:54 guus Exp $
*/
#ifndef __TINC_SUBNET_H__
@ -28,7 +28,8 @@
enum
{
SUBNET_MAC = 0,
SUBNET_IP,
SUBNET_IPV4,
SUBNET_IPV6,
SUBNET_TYPES /* Guardian */
};
@ -37,11 +38,19 @@ typedef struct subnet_mac_t
mac_t address;
} subnet_mac_t;
typedef struct subnet_ip_t
typedef struct subnet_ipv4_t
{
struct addrinfo *address;
struct addrinfo *mask;
} subnet_ip_t;
ipv4_t address;
ipv4_t mask;
int masklength;
} subnet_ipv4_t;
typedef struct subnet_ipv6_t
{
ipv6_t address;
ipv6_t mask;
int masklength;
} subnet_ipv6_t;
#include "node.h"
@ -56,9 +65,9 @@ typedef struct subnet_t {
union net
{
subnet_mac_t mac;
subnet_ip_t ip;
subnet_ipv4_t ipv4;
subnet_ipv6_t ipv6;
} net;
} subnet_t;
extern subnet_t *new_subnet(void);
@ -73,7 +82,8 @@ extern char *net2str(subnet_t *);
extern subnet_t *str2net(char *);
extern subnet_t *lookup_subnet(struct node_t *, subnet_t *);
extern subnet_t *lookup_subnet_mac(mac_t *);
extern subnet_t *lookup_subnet_ip(struct addrinfo *);
extern subnet_t *lookup_subnet_ipv4(ipv4_t *);
extern subnet_t *lookup_subnet_ipv6(ipv6_t *);
extern void dump_subnets(void);
#endif /* __TINC_SUBNET_H__ */

View file

@ -1,7 +1,7 @@
/*
tincd.c -- the main file for tincd
Copyright (C) 1998-2001 Ivo Timmermans <itimmermans@bigfoot.com>
2000,2001 Guus Sliepen <guus@sliepen.warande.net>
Copyright (C) 1998-2002 Ivo Timmermans <itimmermans@bigfoot.com>
2000-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: tincd.c,v 1.10.4.56 2001/11/16 22:40:26 zarq Exp $
$Id: tincd.c,v 1.10.4.57 2002/02/10 21:57:54 guus Exp $
*/
#include "config.h"
@ -41,12 +41,14 @@
#include <openssl/rand.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/evp.h>
#include <utils.h>
#include <xalloc.h>
#include "conf.h"
#include "net.h"
#include "netutl.h"
#include "process.h"
#include "protocol.h"
#include "subnet.h"
@ -295,7 +297,7 @@ main(int argc, char **argv, char **envp)
if(show_version)
{
printf(_("%s version %s (built %s %s, protocol %d)\n"), PACKAGE, VERSION, __DATE__, __TIME__, PROT_CURRENT);
printf(_("Copyright (C) 1998-2001 Ivo Timmermans, Guus Sliepen and others.\n"
printf(_("Copyright (C) 1998-2002 Ivo Timmermans, Guus Sliepen and others.\n"
"See the AUTHORS file for a complete list.\n\n"
"tinc comes with ABSOLUTELY NO WARRANTY. This is free software,\n"
"and you are welcome to redistribute it under certain conditions;\n"
@ -327,6 +329,13 @@ main(int argc, char **argv, char **envp)
/* Slllluuuuuuurrrrp! */
cp
RAND_load_file("/dev/urandom", 1024);
#ifdef HAVE_SSLEAY_ADD_ALL_ALGORITHMS
SSLeay_add_all_algorithms();
#else
OpenSSL_add_all_algorithms();
#endif
cp
if(generate_keys)
{