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: These files are from other sources:
* lib/pidfile.h and lib/pidfile.c are by Martin Schulze, taken from * lib/pidfile.h and lib/pidfile.c are by Martin Schulze, taken from
the syslog 1.3 sources. 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 Also some of the macro files in the directory m4, and their
accompanying files in lib, were taken from GNU fileutils. accompanying files in lib, were taken from GNU fileutils.

View file

@ -2,7 +2,7 @@
AUTOMAKE_OPTIONS = gnu AUTOMAKE_OPTIONS = gnu
SUBDIRS = m4 intl lib src doc po redhat SUBDIRS = m4 intl lib src doc po
ACLOCAL_AMFLAGS = 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 * Updated documentation; the documentation now reflects the
configuration as it is. 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. 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>, Ivo Timmermans <itimmermans@bigfoot.com>,
Guus Sliepen <guus@sliepen.warande.net>, Guus Sliepen <guus@sliepen.warande.net>,
@ -18,12 +18,16 @@ your option) any later version. See the file COPYING for more details.
Security statement Security statement
------------------ ------------------
In august 2000, we discovered the existence of a security hole in all In August 2000, we discovered the existence of a security hole in all versions
versions of tinc up to and including 1.0pre2. This had to do with the of tinc up to and including 1.0pre2. This had to do with the way we exchanged
way we exchanged keys. Since then, we have been working on a new keys. Since then, we have been working on a new authentication scheme to make
authentication scheme to make tinc as secure as possible. The current tinc as secure as possible. The current version uses the OpenSSL library and
version uses the OpenSSL library and does authentication in much the uses strong authentication with RSA keys.
same way as the SSH protocol does.
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 Cryptography is a hard thing to get right. We cannot make any
guarantees. Time, review and feedback are the only things that can 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. 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 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 manual in doc/tinc.texi contains more detailed information on how to
install this library. install this library.
In order to compile tinc, you will also need autoconf, automake, GNU make, m4
and gettext.
Features 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 on subnet mask size. This means that it is possible to have
overlapping subnets on the VPN, as long as their subnet mask sizes overlapping subnets on the VPN, as long as their subnet mask sizes
differ. 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) * Matias Carrasco (for the Spanish translation of the manual)
* Jamie Briggs (for finding a lot of socket leaks) * Jamie Briggs (for finding a lot of socket leaks)
* Armijn Hemel (for being our very own PR manager) * 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! for their help, support and ideas. Thank you guys!

26
TODO
View file

@ -1,27 +1,5 @@
TODO LIST TODO LIST
Goals for 1.0 release: 1.0:
* Check Solaris port * A nice, secure and stable release
* 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

View file

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

View file

@ -1,6 +1,6 @@
dnl Process this file with autoconf to produce a configure script. 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) AC_INIT(src/tincd.c)
AM_INIT_AUTOMAKE(tinc, 1.0-cvs) AM_INIT_AUTOMAKE(tinc, 1.0-cvs)
@ -36,19 +36,19 @@ AC_CANONICAL_HOST
case $host_os in case $host_os in
*linux*) *linux*)
AC_DEFINE(HAVE_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*) *freebsd*)
AC_DEFINE(HAVE_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*) *solaris*)
AC_DEFINE(HAVE_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*) *openbsd*)
AC_DEFINE(HAVE_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 esac
@ -68,28 +68,12 @@ AC_TYPE_SIZE_T
AC_HEADER_TIME AC_HEADER_TIME
AC_STRUCT_TM 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. dnl Checks for library functions.
AC_FUNC_MEMCMP AC_FUNC_MEMCMP
AC_FUNC_ALLOCA AC_FUNC_ALLOCA
AC_TYPE_SIGNAL AC_TYPE_SIGNAL
AC_CHECK_FUNCS([ftime socket select strtol strerror flock unsetenv \ AC_CHECK_FUNCS([ftime socket select strtol strerror flock unsetenv \
asprintf putenv strdup fcloseall daemon strsignal get_current_dir_name \ asprintf putenv strdup fcloseall daemon strsignal get_current_dir_name])
getaddrinfo getnameinfo gai_strerror freeaddrinfo])
jm_FUNC_MALLOC jm_FUNC_MALLOC
jm_FUNC_REALLOC jm_FUNC_REALLOC
@ -127,5 +111,6 @@ intl/Makefile
lib/Makefile lib/Makefile
m4/Makefile m4/Makefile
po/Makefile.in po/Makefile.in
redhat/Makefile po/POTFILES
debian/Makefile) 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 This document describes how nodes in a VPN find and connect to eachother and
maintain a stable network. 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 Permission is granted to make and distribute verbatim copies of
this documentation provided the copyright notice and this 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 provided that the entire resulting derived work is distributed
under the terms of a permission notice identical to this one. 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 1. Problem
========== ==========

View file

@ -1,7 +1,7 @@
This is the network infrastructure documentation for tinc, a Virtual Private This is the network infrastructure documentation for tinc, a Virtual Private
Network daemon. 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 Permission is granted to make and distribute verbatim copies of
this documentation provided the copyright notice and this this documentation provided the copyright notice and this
@ -12,7 +12,7 @@ Network daemon.
provided that the entire resulting derived work is distributed provided that the entire resulting derived work is distributed
under the terms of a permission notice identical to this one. 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 1. Packet flow
============== ==============

View file

@ -1,7 +1,7 @@
This is the protocol documentation for tinc, a Virtual Private Network daemon. This is the protocol documentation for tinc, a Virtual Private Network daemon.
Copyright 2000,2001 Guus Sliepen <guus@sliepen.warande.net>, Copyright 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
2000,2001 Ivo Timmmermans <itimmermans@bigfoot.com> 2000-2002 Ivo Timmmermans <itimmermans@bigfoot.com>
Permission is granted to make and distribute verbatim copies of Permission is granted to make and distribute verbatim copies of
this documentation provided the copyright notice and this 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 provided that the entire resulting derived work is distributed
under the terms of a permission notice identical to this one. 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 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 Normal packets are sent without any state information, so the layout
is pretty basic. is pretty basic.
A data packet can only be sent if the encryption key is known to both A data packet can only be sent if the encryption key, cipher and digest are
parties, and the connection is activated. If the encryption key is not known to both parties, and the connection is activated. If the encryption key
known, a request is sent to the destination using the meta connection is not known, a request is sent to the destination using the meta connection to
to retreive it. retreive it.
0 1 2 3 0 1 2 3 4 5 6 7 ... 97 98 99 100
| LEN | DATA : \ | seqno | data | MAC |
: DATA . } encrypted \____________________________________/\_______________/
. : / | |
. encrypted using symmetric cipher digest
The sequence number prevents replay attacks, the message authentication code
prevents altered packets from being accepted.
3. Meta protocol 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 daemon and to read and write requests by hand, provided that one
understands the numeric codes sent. 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 succesful authentication, the server and the client will exchange all the
information about other tinc daemons and subnets they know of, so that both 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 sides (and all the other tinc daemons behind them) have their information
@ -67,19 +69,23 @@ synchronised.
daemon message daemon message
-------------------------------------------------------------------------- --------------------------------------------------------------------------
origin ADD_HOST daemon a329e18c:655 0 origin ADD_EDGE node1 12.23.34.45 655 node2 21.32.43.54 655 222 0
| | +--> options | | | \___________________/ | +-> options
| +---------> real address:port | | | | +----> weight
+-------------------> name of new tinc daemon | | | +----------------> see below
origin ADD_SUBNET daemon 1,0a010100/ffffff00 | | +--> UDP port
| | | +--> netmask | +----------> real address
| | +----------> vpn IPv4 network address +------------------> name of node on one side of the edge
| +----------------> subnet type (1=IPv4)
+--------------------> owner of this subnet 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 In case a connection between two daemons is closed or broken, DEL_EDGE messages
the same syntax are sent to inform the other daemons of the departure. 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 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 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 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 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 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 message
-------------------------------------------------------------------------- --------------------------------------------------------------------------
daemon REQ_KEY origin destination daemon REQ_KEY origin destination
| +--> name of the tinc daemon it wants the key from | +--> name of the tinc daemon it wants the key from
+----------> name of the daemon that wants the key +----------> name of the daemon that wants the key
daemon ANS_KEY origin destination e4ae0b0a82d6e0078179b5290c62c7d0
| | \______________________________/ daemon ANS_KEY origin destination 4ae0b0a82d6e0078 91 64 4
| | +--> 128 bits key | | \______________/ | | +--> MAC length
| | | | +-----> digest algorithm
| | | +--------> cipher algorithm
| | +--> 128 bits key
| +--> name of the daemon that wants the key | +--> name of the daemon that wants the key
+----------> name of the daemon that uses this key +----------> name of the daemon that uses this key
daemon KEY_CHANGED origin daemon KEY_CHANGED origin
+--> daemon that has changed it's packet key +--> 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. This is the security 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>,
2001 Wessel Dankers <wsl@nl.linux.org> 2001-2002 Wessel Dankers <wsl@nl.linux.org>
Permission is granted to make and distribute verbatim copies of Permission is granted to make and distribute verbatim copies of
this documentation provided the copyright notice and this 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 provided that the entire resulting derived work is distributed
under the terms of a permission notice identical to this one. 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 Proposed new authentication scheme
---------------------------------- ----------------------------------
@ -27,13 +27,11 @@ client <attempts connection>
server <accepts connection> server <accepts connection>
client ID client 9 0 client ID client 12
| | +-> options
| +---> version | +---> version
+-------> name of tinc daemon +-------> name of tinc daemon
server ID server 9 0 server ID server 12
| | +-> options
| +---> version | +---> version
+-------> name of tinc daemon +-------> name of tinc daemon
@ -64,6 +62,21 @@ client CHAL_REPLY 816a86
server CHAL_REPLY 928ffe server CHAL_REPLY 928ffe
+-> 160 bits SHA1 of H1 +-> 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. 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 connection is a totally random string, so that there is no known plaintext (for
an attacker) in the beginning of the encrypted stream. 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: Some things to be discussed:
- What should CHALLEN be? Same as RSAKEYLEN? 256 bits? More/less? - What should CHALLEN be? Same as RSAKEYLEN? 256 bits? More/less?

View file

@ -1,7 +1,4 @@
#!/bin/sh #!/bin/sh
# This file closes down the tap device. # 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. # This file sets up the tap device.
# It gives you the freedom to do anything you want with it. # It gives you the freedom to do anything you want with it.
# Use the correct name for the tap device: # Use the correct name for the tap device:
# For ethertap this is tap0, tap1, tap2 etcetera, # For the Linux tun/tap device $INTERFACE is set to the right name,
# but for the universal tun/tap device use $NETNAME. # 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!) # 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 # Give it the right ip and netmask. Remember, the subnet of the
# tap device must be larger than that of the individual Subnets # tap device must be larger than that of the individual Subnets
# as defined in the host configuration file! # 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 ConnectTo = beta
# The tap device tinc will use. Required. # The tap device tinc will use. Required.
# Default is /dev/tap0 # Default is /dev/tap0 for ethertap or FreeBSD,
TapDevice = /dev/tap1 # /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. # The file in which the private key for this host is stored. Required.
PrivateKeyFile = /etc/tinc/example/rsa_key.priv PrivateKeyFile = /etc/tinc/example/rsa_key.priv

View file

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

View file

@ -1,5 +1,5 @@
\input texinfo @c -*-texinfo-*- \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 @c %**start of header
@setfilename tinc.info @setfilename tinc.info
@settitle tinc Manual @settitle tinc Manual
@ -7,17 +7,18 @@
@c %**end of header @c %**end of header
@ifinfo @ifinfo
@dircategory Networking tools
@direntry @direntry
* tinc: (tinc). The tinc Manual. * tinc: (tinc). The tinc Manual.
@end direntry @end direntry
This is the info manual for tinc, a Virtual Private Network daemon. 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 <itimmermans@@bigfoot.com>, Guus Sliepen <guus@@sliepen.warande.net> and
Wessel Dankers <wsl@@nl.linux.org>. 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 Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are manual provided the copyright notice and this permission notice are
@ -38,11 +39,11 @@ permission notice identical to this one.
@page @page
@vskip 0pt plus 1filll @vskip 0pt plus 1filll
@cindex copyright @cindex copyright
Copyright @copyright{} 1998-2001 Ivo Timmermans Copyright @copyright{} 1998-2002 Ivo Timmermans
<itimmermans@@bigfoot.com>, Guus Sliepen <guus@@sliepen.warande.net> and <itimmermans@@bigfoot.com>, Guus Sliepen <guus@@sliepen.warande.net> and
Wessel Dankers <wsl@@nl.linux.org>. 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 Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are manual provided the copyright notice and this permission notice are
@ -176,16 +177,14 @@ available too.
@section Supported platforms @section Supported platforms
@cindex platforms @cindex platforms
tinc has been verified to work under Linux, FreeBSD and Solaris, with tinc has been verified to work under Linux, FreeBSD, OpenBSD and Solaris, with
various hardware architectures. These are the three platforms various hardware architectures. These are some of the platforms
that are supported by the universial TUN/TAP device driver, so if that are supported by the universal tun/tap device driver or other virtual network device drivers.
support for other operating systems is added to this driver, perhaps Without such a driver, tinc will most
tinc will run on them as well. Without this driver, tinc will most
likely compile and run, but it will not be able to send or receive data likely compile and run, but it will not be able to send or receive data
packets. packets.
@cindex release @cindex release
The official release only truly supports Linux.
For an up to date list of supported platforms, please check the list on For an up to date list of supported platforms, please check the list on
our website: our website:
@uref{http://tinc.nl.linux.org/platforms.html}. @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 processors that Linux runs on. It has already been verified to run on
alpha and sparc processors as well. 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 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. 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 ================================================================== @c ==================================================================
@subsection FreeBSD @subsection FreeBSD
@cindex 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 acquisition from the kernel. Therefore, tinc will work on the same platforms
as this driver. These are: FreeBSD 3.x, 4.x, 5.x. 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 ================================================================== @c ==================================================================
@subsection Solaris @subsection Solaris
@cindex 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 acquisition from the kernel. Therefore, tinc will work on the same platforms
as this driver. These are: Solaris, 2.1.x. 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.1.60 up to 2.4.0::
* Configuration of Linux kernels 2.4.0 and higher:: * Configuration of Linux kernels 2.4.0 and higher::
* Configuration of FreeBSD kernels:: * Configuration of FreeBSD kernels::
* Configuration of OpenBSD kernels::
* Configuration of Solaris kernels:: * Configuration of Solaris kernels::
@end menu @end menu
@ -329,18 +337,18 @@ Here are the options you have to turn on when configuring a new kernel:
Code maturity level options Code maturity level options
[*] Prompt for development and/or incomplete code/drivers [*] Prompt for development and/or incomplete code/drivers
Network device support Network device support
<M> Universal TUN/TAP device driver support <M> Universal tun/tap device driver support
@end example @end example
It's not necessary to compile this driver as a module, even if you are going to It's not necessary to compile this driver as a module, even if you are going to
run more than one instance of tinc. 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 `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 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}: to @file{/etc/modules.conf}:
@example @example
@ -349,24 +357,35 @@ alias char-major-10-200 tun
@c ================================================================== @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 @subsection Configuration of FreeBSD kernels
This section will contain information on how to configure your FreeBSD 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 kernel to support the universal tun/tap device. For 4.1 and higher
systems, this is included in the kernel configuration, for earlier versions, this is included in the default kernel configuration, for earlier
systems (4.0 and 3.x), you need to install the universal TUN/TAP driver systems (4.0 and earlier), you need to install the universal tun/tap driver
yourself. yourself.
Unfortunately somebody still has to write the text. Unfortunately somebody still has to write the text.
@c ================================================================== @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 @subsection Configuration of Solaris kernels
This section will contain information on how to configure your Solaris 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. this driver yourself.
Unfortunately somebody still has to write the text. 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 @node Installation, Configuration, Preparations, Top
@chapter Installation @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 precompiled packages for your system. These packages are equipped with
system startup scripts and sample configurations. 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 for yourself, you can use the source. The source is distributed under
the GNU General Public License (GPL). Download the source from the the GNU General Public License (GPL). Download the source from the
@uref{http://tinc.nl.linux.org/download.html, download page}, which has @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. 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): following device file (unless it already exist):
@example @example
@ -537,8 +556,8 @@ chown 0.0 /dev/tun
@end example @end example
If you use Linux, and you run the new 2.4 kernel using the devfs filesystem, 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 then the tun/tap device will probably be automatically generated as
@file{/dev/net/tun}. @file{/dev/misc/net/tun}.
Unlike the ethertap device, you do not need multiple device files if Unlike the ethertap device, you do not need multiple device files if
you are planning to run multiple tinc daemons. 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, If you have everything clearly pictured in your mind,
proceed in the following order: 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. Then generate the keypairs.
Finally, distribute the host configuration files. Finally, distribute the host configuration files.
These steps are described in the subsections below. These steps are described in the subsections below.
@ -717,8 +736,28 @@ required directives are given in @strong{bold}.
@subsection Main configuration variables @subsection Main configuration variables
@table @asis @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 @cindex ConnectTo
@item @strong{ConnectTo = <name>}
Specifies which host to connect to on startup. Multiple ConnectTo Specifies which host to connect to on startup. Multiple ConnectTo
variables may be specified, if connecting to the first one fails then 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 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 value for ConnectPort is given, tinc won't connect at all, and will
instead just listen for incoming connections. 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 @cindex Hostnames
@item Hostnames = <yes|no> (no)
This option selects whether IP addresses (both real and on the VPN) This option selects whether IP addresses (both real and on the VPN)
should be resolved. Since DNS lookups are blocking, it might affect should be resolved. Since DNS lookups are blocking, it might affect
tinc's efficiency, even stopping the daemon for a few seconds everytime 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 This does not affect resolving hostnames to IP addresses from the
configuration file. configuration file.
@item Interface = <device>
@cindex Interface @cindex Interface
If you have more than one network interface in your computer, tinc will @item Interface = <interface>
by default listen on all of them for incoming connections. It is Defines the name of the interface corresponding to the virtual network device.
possible to bind tinc to a single interface like eth0 or ppp0 with this Depending on the operating system and the type of device this may or may not actually set the name.
variable. Currently this option only affects the Linux tun/tap device.
@item InterfaceIP = <local address> @cindex Mode
@cindex InterfaceIP @item Mode = <router|switch|hub> (router)
If your computer has more than one IP address on a single interface (for This option selects the way packets are routed to other daemons.
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 @table @asis
a single IP address with this variable. It is still possible to listen @cindex router
on several interfaces at the same time though, if they share the same IP @item router
address. 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 @cindex KeyExpire
@item KeyExpire = <seconds> (3600)
This option controls the time the encryption keys used to encrypt the data 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 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 make it even harder for crackers, even though it is thought to be nearly
impossible to crack a single key. impossible to crack a single key.
@item @strong{Name = <name>}
@cindex Name @cindex Name
@item @strong{Name = <name>}
This is a symbolic name for this connection. It can be anything This is a symbolic name for this connection. It can be anything
@item PingTimeout = <seconds> (60)
@cindex PingTimeout @cindex PingTimeout
@item PingTimeout = <seconds> (60)
The number of seconds of inactivity that tinc will wait before sending a 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 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 same amount of seconds, the connection is terminated, and the others
will be notified of this. will be notified of this.
@item PrivateKey = <key> [obsolete]
@cindex PrivateKey @cindex PrivateKey
@item PrivateKey = <key> [obsolete]
This is the RSA private key for tinc. However, for safety reasons it is 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 advised to store private keys of any kind in separate files. This prevents
accidental eavesdropping if you are editting the configuration file. accidental eavesdropping if you are editting the configuration file.
@item @strong{PrivateKeyFile = <path>} [recommended]
@cindex PrivateKeyFile @cindex PrivateKeyFile
@item @strong{PrivateKeyFile = <path>} [recommended]
This is the full path name of the RSA private key file that was 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 generated by ``tincd --generate-keys''. It must be a full path, not a
relative directory. relative directory.
@item @strong{TapDevice = <device>} (/dev/tap0 or /dev/net/tun) Note that there must be exactly one of PrivateKey
@cindex TapDevice or PrivateKeyFile
The ethertap device to use. Note that you can only use one device per specified in the configuration file.
daemon. The info pages of the tinc package contain more information
about configuring an ethertap device for Linux.
@end table @end table
@ -799,33 +854,50 @@ about configuring an ethertap device for Linux.
@subsection Host configuration variables @subsection Host configuration variables
@table @asis @table @asis
@item @strong{Address = <IP address|hostname>} [recommended]
@cindex Address @cindex Address
@item @strong{Address = <IP address|hostname>} [recommended]
This variable is only required if you want to connect to this host. It 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, must resolve to the external IP address where the host can be reached,
not the one that is internal to the VPN. 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 @cindex IndirectData
@item IndirectData = <yes|no> (no) [experimental]
This option specifies whether other tinc daemons besides the one you This option specifies whether other tinc daemons besides the one you
specified with ConnectTo can make a direct connection to you. This is 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 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 make a connection from the outside to your tinc daemon. Otherwise, it
is best to leave this option out or set it to no. 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 @cindex Port
@item Port = <port> (655)
Connect to the upstream host (given with the ConnectTo directive) on Connect to the upstream host (given with the ConnectTo directive) on
port port. port may be given in decimal (default), octal (when preceded 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 by a single zero) o hexadecimal (prefixed with 0x). port is the port
number for both the UDP and the TCP (meta) connections. number for both the UDP and the TCP (meta) connections.
@item PublicKey = <key> [obsolete]
@cindex PublicKey @cindex PublicKey
@item PublicKey = <key> [obsolete]
This is the RSA public key for this host. This is the RSA public key for this host.
@item PublicKeyFile = <path> [obsolete]
@cindex PublicKeyFile @cindex PublicKeyFile
@item PublicKeyFile = <path> [obsolete]
This is the full path name of the RSA public key file that was generated 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 by ``tincd --generate-keys''. It must be a full path, not a relative
directory. 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 in each host configuration file, if you want to be able to establish a
connection with that host. connection with that host.
@item Subnet = <IP address/maskbits>
@cindex Subnet @cindex Subnet
This is the subnet range of all IP addresses that will be accepted by @item Subnet = <address[/masklength]>
the host that defines it. 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, Subnets can either be single MAC, IPv4 or IPv6 addresses,
not the real IP address of the host running tincd. 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 @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 example: netmask 255.255.255.0 would become /24, 255.255.252.0 becomes
/22. This conforms to standard CIDR notation as described in /22. This conforms to standard CIDR notation as described in
@uref{ftp://ftp.isi.edu/in-notes/rfc1519.txt, RFC1519} @uref{ftp://ftp.isi.edu/in-notes/rfc1519.txt, RFC1519}
@item TCPonly = <yes|no> (no) [experimental]
@cindex TCPonly @cindex TCPonly
@item TCPonly = <yes|no> (no) [experimental]
If this variable is set to yes, then the packets are tunnelled over a 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 TCP connection instead of a UDP connection. This is especially useful
for those who want to run a tinc daemon from behind a masquerading 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 @example
Name = @emph{yourname} Name = @emph{yourname}
TapDevice = @emph{/dev/tap0} Device = @emph{/dev/tap0}
PrivateKeyFile = /etc/tinc/@emph{netname}/rsa_key.priv PrivateKeyFile = /etc/tinc/@emph{netname}/rsa_key.priv
@end example @end example
@ -919,37 +998,39 @@ Just press enter to accept the defaults.
@section Network interfaces @section Network interfaces
Before tinc can start transmitting data over the tunnel, it must 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 First, decide which IP addresses you want to have associated with these
devices, and what network mask they must have. devices, and what network mask they must have.
tinc will open an ethertap device or TUN/TAP device, which will also tinc will open a virtual network device (@file{/dev/tun}, @file{/dev/tap0} or similar),
create a network interface called `tap0', or `tap1', and so on if you are using which will also create a network interface called something like `tun0', `tap0', or,
the ethertap driver, or a network interface with the same name as netname if you are using the Linux tun/tap driver, the network interface will by default have the same name as the netname.
if you are using the universal TUN/TAP driver.
@cindex tinc-up @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 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 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. @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 @example
#!/bin/sh #!/bin/sh
ifconfig $NETNAME hw ether fe:fd:00:00:00:00 ifconfig $INTERFACE hw ether fe:fd:0:0:0:0
ifconfig $NETNAME @emph{xx}.@emph{xx}.@emph{xx}.@emph{xx} netmask @emph{mask} ifconfig $INTERFACE 192.168.1.1 netmask 255.255.0.0
ifconfig $NETNAME -arp ifconfig $INTERFACE -arp
@end example @end example
@cindex MAC address @cindex MAC address
@cindex hardware address @cindex hardware address
The first line sets up the MAC address of the network interface. 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. Due to the nature of how Ethernet and tinc work, it has to be set to fe:fd:0:0:0:0
(tinc versions prior to 1.0pre3 required that the MAC address matched the IP address.) for tinc to work in it's normal mode.
You can use the environment variable $NETNAME to get the name of the interface. 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}, If you are using the ethertap driver however, you need to replace it with tap@emph{N},
corresponding to the device file name. corresponding to the device file name.
@ -964,7 +1045,8 @@ own subnet.
@cindex arp @cindex arp
The last line tells the kernel not to use ARP on that interface. 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 ================================================================== @c ==================================================================
@ -1010,7 +1092,7 @@ In @file{/etc/tinc/company/tinc-up}:
# Real interface of internal network: # Real interface of internal network:
# ifconfig eth0 10.1.54.1 netmask 255.255.0.0 broadcast 10.1.255.255 # 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 10.1.54.1 netmask 255.0.0.0
ifconfig tap0 -arp ifconfig tap0 -arp
@end example @end example
@ -1020,7 +1102,7 @@ and in @file{/etc/tinc/company/tinc.conf}:
@example @example
Name = BranchA Name = BranchA
PrivateKey = /etc/tinc/company/rsa_key.priv PrivateKey = /etc/tinc/company/rsa_key.priv
TapDevice = /dev/tap0 Device = /dev/tap0
@end example @end example
On all hosts, /etc/tinc/company/hosts/BranchA contains: 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: # Real interface of internal network:
# ifconfig eth0 10.2.43.8 netmask 255.255.0.0 broadcast 10.2.255.255 # 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 10.2.1.12 netmask 255.0.0.0
ifconfig tap0 -arp ifconfig tap0 -arp
@end example @end example
@ -1085,7 +1167,7 @@ In @file{/etc/tinc/company/tinc-up}:
# Real interface of internal network: # Real interface of internal network:
# ifconfig eth0 10.3.69.254 netmask 255.255.0.0 broadcast 10.3.255.255 # 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 10.3.69.254 netmask 255.0.0.0
ifconfig tap1 -arp ifconfig tap1 -arp
@end example @end example
@ -1095,7 +1177,7 @@ and in @file{/etc/tinc/company/tinc.conf}:
@example @example
Name = BranchC Name = BranchC
ConnectTo = BranchA ConnectTo = BranchA
TapDevice = /dev/tap1 Device = /dev/tap1
@end example @end example
C already has another daemon that runs on port 655, so they have to 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 @example
Name = BranchD Name = BranchD
ConnectTo = BranchC ConnectTo = BranchC
TapDevice = /dev/net/tun Device = /dev/misc/net/tun
PrivateKeyFile = /etc/tinc/company/rsa_key.priv PrivateKeyFile = /etc/tinc/company/rsa_key.priv
@end example @end example
D will be connecting to C, which has a tincd running for this network on 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. 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 will not be called `tun' or `tap0' or something like that, but will
have the same name as netname. have the same name as netname.
@ -1211,33 +1293,19 @@ generated automatically, so may be more up-to-date.
@cindex options @cindex options
@c from the manpage @c from the manpage
@table @samp @table @samp
@item --bypass-security
Disables encryption and authentication.
Only useful for debugging.
@item -c, --config=PATH @item -c, --config=PATH
Read configuration options from the directory PATH. The default is Read configuration options from the directory PATH. The default is
@file{/etc/tinc/netname/}. @file{/etc/tinc/netname/}.
@cindex debug level @cindex debug level
@item -d @item -d, --debug=LEVEL
Increase debug level. The higher it gets, the more gets Set debug level to LEVEL. The higher the debug level, the more gets
logged. Everything goes via syslog. 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] @item -K, --generate-keys[=BITS]
Generate public/private keypair of BITS length. If BITS is not specified, 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, 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 @item --help
Display a short reminder of these runtime options and terminate. 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 @item --version
Output version information and exit. 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. @item You forgot to compile `Netlink device emulation' in the kernel.
@end itemize @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 @itemize
@item You forgot to `modprobe tun'. @item You forgot to `modprobe tun'.
@ -1280,10 +1360,10 @@ only, so keep an eye on it!
@itemize @itemize
@item Something is not configured right. Packets are being sent out to the @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 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 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. cases be larger. Rethink your configuration.
Note that you will only see this message if you specified a debug Note that you will only see this message if you specified a debug
level of 5 or higher! 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! Jan 1 12:00:00 host tinc.net[1234]: Trying to look up 0.0.192.168 in connection list failed!
@end example @end example
@itemize @itemize
@item Add the `ifconfig $NETNAME -arp' to tinc-up. @item Add the `ifconfig $INTERFACE -arp' to tinc-up.
@end itemize @end itemize
@item Network address and subnet mask do not match! @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 @node The UDP tunnel, The meta-connection, The connection, The connection
@subsection The UDP tunnel @subsection The UDP tunnel
@cindex ethertap @cindex virtual network device
@cindex frame type @cindex frame type
The data itself is read from a character device file, the so-called 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, 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 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, 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. field.
So when tinc reads an Ethernet frame from the device, it determines its 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) type. When tinc is in it's default routing mode, it can handle IPv4 and IPv6
frames, because it needs IP headers for routing. packets. Depending on the Subnet lines, it will send the packets off to their destination.
Plans to support other protocols and switching instead of routing are being made. In the `switch' and `hub' mode, tinc will use broadcasts and MAC address discovery
(Some code for IPv6 routing and switching is already present but nonfunctional.) to deduce the destination of the packets.
When tinc knows Since the latter modes only depend on the link layer information,
which type of frame it has read, it can also read the source and any protocol that runs over Ethernet is supported (for instance IPX and Appletalk).
destination address from it.
Now it is time that the frame gets encrypted. Currently the only After the destination has been determined, a sequence number will be added to the packet.
encryption algorithm available is blowfish. The packet will then be encrypted and a message authentication
code will be appended.
@cindex encapsulating @cindex encapsulating
@cindex UDP @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 packet to the destination computer. We do this by sending the packet
over an UDP connection to the destination host. This is called over an UDP connection to the destination host. This is called
@emph{encapsulating}, the VPN packet (though now encrypted) is @emph{encapsulating}, the VPN packet (though now encrypted) is
encapsulated in another IP datagram. encapsulated in another IP datagram.
When the destination receives this packet, the same thing happens, only 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, in reverse. So it checks the message authentication code, decrypts the contents of the UDP datagram,
and it writes the decrypted information to its own ethertap device. 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 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 address must match that of the virtual network interface.
of tinc, ARP is not possible. tinc solves this by always overwriting the 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 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. 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. understands the numeric codes sent.
The authentication scheme is described in @ref{Authentication protocol}. After a 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 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 sides (and all the other tinc daemons behind them) have their information
synchronised. synchronised.
@cindex ADD_HOST @cindex ADD_EDGE
@cindex ADD_SUBNET @cindex ADD_SUBNET
@example @example
daemon message daemon message
-------------------------------------------------------------------------- --------------------------------------------------------------------------
origin ADD_HOST daemon a329e18c:655 0 origin ADD_EDGE node1 12.23.34.45 655 node2 21.32.43.54 655 222 0
| | +--> options | | | \___________________/ | +-> options
| +---------> real address:port | | | | +----> weight
+-------------------> name of new tinc daemon | | | +----------------> see below
origin ADD_SUBNET daemon 1,0a010100/ffffff00 | | +--> UDP port
| | | +--> netmask | +----------> real address
| | +----------> vpn IPv4 network address +------------------> name of node on one side of the edge
| +----------------> subnet type (1=IPv4)
+--------------------> owner of this subnet origin ADD_SUBNET node 192.168.1.0/24
| | +--> masklength
| +--------> IPv4 network address
+------------------> owner of this subnet
-------------------------------------------------------------------------- --------------------------------------------------------------------------
@end example @end example
@cindex DEL_HOST @cindex DEL_EDGE
@cindex DEL_SUBNET In case a connection between two daemons is closed or broken, DEL_EDGE messages
In case daemons leave the VPN, DEL_HOST and DEL_SUBNET messages with exactly are sent to inform the other daemons of that fact. Each daemon will calculate a
the same syntax are sent to inform the other daemons of the departure. 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 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 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 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 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 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 REQ_KEY
@cindex ANS_KEY @cindex ANS_KEY
@ -1495,11 +1581,15 @@ daemon message
daemon REQ_KEY origin destination daemon REQ_KEY origin destination
| +--> name of the tinc daemon it wants the key from | +--> name of the tinc daemon it wants the key from
+----------> name of the daemon that wants the key +----------> name of the daemon that wants the key
daemon ANS_KEY origin destination e4ae0b0a82d6e0078179b5290c62c7d0
| | \______________________________/ daemon ANS_KEY origin destination 4ae0b0a82d6e0078 91 64 4
| | +--> 128 bits key | | \______________/ | | +--> MAC length
| | | | +-----> digest algorithm
| | | +--------> cipher algorithm
| | +--> 128 bits key
| +--> name of the daemon that wants the key | +--> name of the daemon that wants the key
+----------> name of the daemon that uses this key +----------> name of the daemon that uses this key
daemon KEY_CHANGED origin daemon KEY_CHANGED origin
+--> daemon that has changed it's packet key +--> daemon that has changed it's packet key
-------------------------------------------------------------------------- --------------------------------------------------------------------------
@ -1518,12 +1608,8 @@ messages without any other traffic won't result in known plaintext.
@example @example
daemon message daemon message
-------------------------------------------------------------------------- --------------------------------------------------------------------------
origin PING 9e76 origin PING
\__/ dest. PONG
+--> 2 bytes of salt (random data)
dest. PONG 3b8d
\__/
+--> 2 bytes of salt (random data)
-------------------------------------------------------------------------- --------------------------------------------------------------------------
@end example @end example
@ -1546,9 +1632,8 @@ the tinc project after TINC.
But in order to be ``immune'' to eavesdropping, you'll have to encrypt 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 your data. Because tinc is a @emph{Secure} VPN (SVPN) daemon, it does
exactly that: encrypt. exactly that: encrypt.
tinc uses blowfish encryption in CBC mode and a small amount of salt tinc uses blowfish encryption in CBC mode, sequence numbers and message authentication codes
at the beginning of each packet to make sure eavesdroppers cannot get to make sure eavesdroppers cannot get and cannot change any information at all from the packets they can intercept.
any information at all from the packets they can intercept.
@menu @menu
* Authentication protocol:: * 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 improvements over the protocol used in 1.0pre2 and 1.0pre3. Explanation is
below. below.
@cindex ID
@cindex META_KEY
@cindex CHALLENGE
@cindex CHAL_REPLY
@cindex ACK
@example @example
daemon message daemon message
-------------------------------------------------------------------------- --------------------------------------------------------------------------
@ -1572,15 +1662,13 @@ client <attempts connection>
server <accepts connection> server <accepts connection>
client ID client 10 0 client ID client 12
| | +-> options | +---> version
| +---> version +-------> name of tinc daemon
+--------> name of tinc daemon
server ID server 10 0 server ID server 12
| | +-> options | +---> version
| +---> version +-------> name of tinc daemon
+--------> name of tinc daemon
client META_KEY 5f0823a93e35b69e...7086ec7866ce582b client META_KEY 5f0823a93e35b69e...7086ec7866ce582b
\_________________________________/ \_________________________________/
@ -1593,8 +1681,8 @@ server META_KEY 6ab9c1640388f8f0...45d1a07f8a672630
encrypted with client's public RSA key encrypted with client's public RSA key
From now on: From now on:
- the client will encrypt outgoing traffic using S1 - the client will symmetrically encrypt outgoing traffic using S1
- the server will encrypt outgoing traffic using S2 - the server will symmetrically encrypt outgoing traffic using S2
client CHALLENGE da02add1817c1920989ba6ae2a49cecbda0 client CHALLENGE da02add1817c1920989ba6ae2a49cecbda0
\_________________________________/ \_________________________________/
@ -1609,6 +1697,21 @@ client CHAL_REPLY 816a86
server CHAL_REPLY 928ffe server CHAL_REPLY 928ffe
+-> 160 bits SHA1 of H1 +-> 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 @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 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 parties, and the connection is activated. If the encryption key is not
known, a request is sent to the destination using the meta connection 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. key to arrive.
@cindex UDP @cindex UDP
The UDP packet containing the network packet from the VPN has the following layout: The UDP packet containing the network packet from the VPN has the following layout:
@example @example
... | IP header | UDP header | salt | VPN packet | UDP trailer ... | IP header | UDP header | seqno | VPN packet | MAC | UDP trailer
\___________________/ \___________________/\_____/
| | |
V V +---> digest algorithm
Encrypted with symmetric cipher Encrypted with symmetric cipher
@end example @end example
So, the entire UDP payload is encrypted using a symmetric cipher (blowfish in CBC mode). So, the entire VPN packet is encrypted using a symmetric cipher. A 32 bits
2 bytes of salt (random data) are added in front of the actual VPN packet, sequence number is added in front of the actual VPN packet, to act as a unique
so that two VPN packets with (almost) the same content do not seem to be IV for each packet and to prevent replay attacks. A message authentication code
the same for eavesdroppers. is added to the UDP packet to prevent alteration of packets. By default the
2 bytes of salt may not seem much, but you can encrypt 65536 identical packets first 4 bytes of the digest are used for this, but this can be changed using
now without an attacker being able to see that they were identical. the MACLength configuration variable.
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.
@c ================================================================== @c ==================================================================
@node About us, Concept Index, Technical information, Top @node About us, Concept Index, Technical information, Top

View file

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

View file

@ -31,6 +31,14 @@ AC_DEFUN(tinc_OPENSSL,
AC_CHECK_FUNCS(RAND_pseudo_bytes) 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_FUNC(dlopen,
[], [],
AC_CHECK_LIB(dl, dlopen, AC_CHECK_LIB(dl, dlopen,

View file

@ -11,7 +11,19 @@ src/meta.c
src/net.c src/net.c
src/netutl.c src/netutl.c
src/protocol.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/subnet.c
src/tincd.c src/tincd.c
src/process.c src/process.c
src/route.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 ## 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 sbin_PROGRAMS = tincd
tincd_SOURCES = conf.c connection.c device.c edge.c graph.c meta.c net.c node.c process.c \ EXTRA_DIST = linux/device.c freebsd/device.c openbsd/device.c solaris/device.c
protocol.c route.c subnet.c tincd.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 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 protocol.h route.h subnet.h
LIBS = @LIBS@ @INTLLIBS@ LIBS = @LIBS@ @INTLLIBS@

View file

@ -1,8 +1,8 @@
/* /*
conf.c -- configuration code conf.c -- configuration code
Copyright (C) 1998 Robert van der Meulen Copyright (C) 1998 Robert van der Meulen
1998-2001 Ivo Timmermans <itimmermans@bigfoot.com> 1998-2002 Ivo Timmermans <itimmermans@bigfoot.com>
2000,2001 Guus Sliepen <guus@sliepen.warande.net> 2000-2002 Guus Sliepen <guus@sliepen.warande.net>
2000 Cris van Pelt <tribbel@arise.dhs.org> 2000 Cris van Pelt <tribbel@arise.dhs.org>
This program is free software; you can redistribute it and/or modify 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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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" #include "config.h"
@ -42,19 +42,17 @@
#include <avl_tree.h> #include <avl_tree.h>
#include "conf.h" #include "conf.h"
#include "netutl.h" /* for str2address */
#include "system.h" #include "system.h"
avl_tree_t *config_tree; avl_tree_t *config_tree;
int debug_lvl = 0; 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 *confbase = NULL; /* directory in which all config files are */
char *netname = NULL; /* name of the vpn network */ 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 config_compare(config_t *a, config_t *b)
{ {
int result; int result;
@ -202,6 +200,41 @@ cp
return 1; 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) int get_config_subnet(config_t *cfg, subnet_t **result)
{ {
subnet_t *subnet; subnet_t *subnet;
@ -209,34 +242,27 @@ cp
if(!cfg) if(!cfg)
return 0; return 0;
#warning FIXME subnet = str2net(cfg->value);
/* ip = strtoip(cfg->value); */
/* if(!ip) */ if(!subnet)
/* { */ {
/* syslog(LOG_ERR, _("IP address expected for configuration variable %s in %s line %d"), */ syslog(LOG_ERR, _("Subnet expected for configuration variable %s in %s line %d"),
/* cfg->variable, cfg->file, cfg->line); */ cfg->variable, cfg->file, cfg->line);
/* return 0; */ return 0;
/* } */ }
/* Teach newbies what subnets are... */ /* Teach newbies what subnets are... */
/* if((ip->address & ip->mask) != ip->address) */ if(subnet->type == SUBNET_IPV4)
/* { */ if((subnet->net.ipv4.address & subnet->net.ipv4.mask) != subnet->net.ipv4.address)
/* syslog(LOG_ERR, _("Network address and subnet mask for configuration variable %s in %s line %d"), */ {
/* cfg->variable, cfg->file, cfg->line); */ syslog(LOG_ERR, _("Network address and mask length do not match for configuration variable %s in %s line %d"),
/* free(ip); */ cfg->variable, cfg->file, cfg->line);
/* return 0; */ free(subnet);
/* } */ return 0;
}
/* subnet = new_subnet(); */ *result = subnet;
/* subnet->type = SUBNET_IP; */
/* subnet->net.ip.address = ip->address; */
/* subnet->net.ip.mask = ip->mask; */
/* free(ip); */
/* *result = subnet; */
return 1; return 1;
} }

View file

@ -1,7 +1,7 @@
/* /*
conf.h -- header for conf.c conf.h -- header for conf.c
Copyright (C) 1998-2001 Ivo Timmermans <itimmermans@bigfoot.com> Copyright (C) 1998-2002 Ivo Timmermans <itimmermans@bigfoot.com>
2000,2001 Guus Sliepen <guus@sliepen.warande.net> 2000-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify 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 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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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__ #ifndef __TINC_CONF_H__
@ -37,9 +37,8 @@ typedef struct config_t {
extern avl_tree_t *config_tree; extern avl_tree_t *config_tree;
extern int debug_lvl; extern int debug_lvl;
extern int timeout; extern int pingtimeout;
extern int maxtimeout; extern int maxtimeout;
extern int sighup;
extern int bypass_security; extern int bypass_security;
extern char *confbase; extern char *confbase;
extern char *netname; 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 config_t *lookup_config_next(avl_tree_t *, config_t *);
extern int get_config_bool(config_t *, int *); extern int get_config_bool(config_t *, int *);
extern int get_config_int(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_string(config_t *, char **);
extern int get_config_address(config_t *, ipv4_t **);
struct subnet_t; /* Needed for next line. */ struct subnet_t; /* Needed for next line. */
extern int get_config_subnet(config_t *, struct subnet_t **); extern int get_config_subnet(config_t *, struct subnet_t **);

View file

@ -1,7 +1,7 @@
/* /*
connection.c -- connection list management connection.c -- connection list management
Copyright (C) 2000,2001 Guus Sliepen <guus@sliepen.warande.net>, Copyright (C) 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
2000,2001 Ivo Timmermans <itimmermans@bigfoot.com> 2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify 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 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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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" #include "config.h"
@ -31,6 +31,7 @@
#include <list.h> #include <list.h>
#include "net.h" /* Don't ask. */ #include "net.h" /* Don't ask. */
#include "netutl.h"
#include "config.h" #include "config.h"
#include "conf.h" #include "conf.h"
#include <utils.h> #include <utils.h>
@ -105,11 +106,12 @@ cp
cp cp
} }
connection_t *lookup_connection(struct addrinfo *address) connection_t *lookup_connection(ipv4_t address, port_t port)
{ {
connection_t c; connection_t c;
cp cp
c.address = address; c.address = address;
c.port = port;
return avl_search(connection_tree, &c); return avl_search(connection_tree, &c);
} }

View file

@ -1,7 +1,7 @@
/* /*
connection.h -- header for connection.c connection.h -- header for connection.c
Copyright (C) 2000,2001 Guus Sliepen <guus@sliepen.warande.net>, Copyright (C) 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
2000,2001 Ivo Timmermans <itimmermans@bigfoot.com> 2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify 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 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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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__ #ifndef __TINC_CONNECTION_H__
@ -46,30 +46,26 @@
#include "node.h" #include "node.h"
#include "edge.h" #include "edge.h"
#include <config.h>
#include <dropin.h>
#define OPTION_INDIRECT 0x0001 #define OPTION_INDIRECT 0x0001
#define OPTION_TCPONLY 0x0002 #define OPTION_TCPONLY 0x0002
typedef struct connection_status_t { typedef struct connection_status_t {
int pinged:1; /* sent ping */ int pinged:1; /* sent ping */
int active:1; /* 1 if active.. */ 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 termreq:1; /* the termination of this connection was requested */
int remove:1; /* Set to 1 if you want this connection removed */ int remove:1; /* Set to 1 if you want this connection removed */
int timeout:1; /* 1 if gotten timeout */ int timeout:1; /* 1 if gotten timeout */
int encryptout:1; /* 1 if we can encrypt outgoing traffic */ int encryptout:1; /* 1 if we can encrypt outgoing traffic */
int decryptin:1; /* 1 if we have to decrypt incoming 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 mst:1; /* 1 if this connection is part of a minimum spanning tree */
int unused:17; int unused:18;
} connection_status_t; } connection_status_t;
typedef struct connection_t { typedef struct connection_t {
char *name; /* name he claims to have */ char *name; /* name he claims to have */
struct addrinfo *address; /* his real (internet) ip */ ipv4_t address; /* his real (internet) ip */
char *port; /* port number of meta connection */ port_t port; /* port number of meta connection */
char *hostname; /* the hostname of its real ip */ char *hostname; /* the hostname of its real ip */
int protocol_version; /* used protocol */ int protocol_version; /* used protocol */
@ -78,9 +74,10 @@ typedef struct connection_t {
struct connection_status_t status; /* status info */ struct connection_status_t status; /* status info */
int estimated_weight; /* estimation for the weight of the edge for this connection */ 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 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 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 */ RSA *rsa_key; /* his public/private key */
EVP_CIPHER *incipher; /* Cipher he will use to send data to us */ 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 free_connection(connection_t *);
extern void connection_add(connection_t *); extern void connection_add(connection_t *);
extern void connection_del(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 void dump_connections(void);
extern int read_connection_config(connection_t *); extern int read_connection_config(connection_t *);

View file

@ -1,7 +1,7 @@
/* /*
net.h -- generic header for device.c net.h -- generic header for device.c
Copyright (C) 2001 Ivo Timmermans <zarq@iname.com> Copyright (C) 2001-2002 Ivo Timmermans <zarq@iname.com>
2001 Guus Sliepen <guus@sliepen.warande.net> 2001-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify 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 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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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__ #ifndef __TINC_DEVICE_H__

View file

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

View file

@ -1,7 +1,7 @@
/* /*
edge.h -- header for edge.c edge.h -- header for edge.c
Copyright (C) 2001 Guus Sliepen <guus@sliepen.warande.net>, Copyright (C) 2001-2002 Guus Sliepen <guus@sliepen.warande.net>,
2001 Ivo Timmermans <itimmermans@bigfoot.com> 2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify 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 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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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__ #ifndef __TINC_EDGE_H__
@ -28,18 +28,16 @@
#include "node.h" #include "node.h"
#include "connection.h" #include "connection.h"
/* I don't know if halfconnection_t is useful... */
typedef struct halfconnection_t { typedef struct halfconnection_t {
struct node_t *node; /* node associated with this end of the connection */ 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 */ ipv4_t address; /* real (internet) ip on this end of the meta connection */
char *hostname; /* the hostname of real ip */ port_t port; /* port number of this end of the meta connection */
} halfconnection_t; } halfconnection_t;
typedef struct edge_t { typedef struct edge_t {
struct node_t *from; struct halfconnection_t from;
struct node_t *to; struct halfconnection_t to;
long int options; /* options turned on for this edge */ long int options; /* options turned on for this edge */
int weight; /* weight of this edge */ int weight; /* weight of this edge */

View file

@ -1,7 +1,7 @@
/* /*
device.c -- Interaction with FreeBSD tap device device.c -- Interaction with FreeBSD tap device
Copyright (C) 2001 Ivo Timmermans <itimmermans@bigfoot.com>, Copyright (C) 2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
2001 Guus Sliepen <guus@sliepen.warande.net> 2001-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify 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 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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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" #define DEFAULT_DEVICE "/dev/tap0"
int device_fd = -1; int device_fd = -1;
int device_type; int device_type;
char *device_fname; char *device;
char *interface;
char *device_info; char *device_info;
int device_total_in = 0; int device_total_in = 0;
int device_total_out = 0; int device_total_out = 0;
* extern subnet_t mymac;
/*
open the local ethertap device open the local ethertap device
*/ */
int setup_device(void) int setup_device(void)
{ {
struct ifreq ifr;
cp cp
if(!get_config_string(lookup_config(config_tree, "Device"), &device_fname))) if(!get_config_string(lookup_config(config_tree, "Device"), &device))
device_fname = DEFAULT_DEVICE; device = DEFAULT_DEVICE;
if(!get_config_string(lookup_config(config_tree, "Interface"), &interface))
interface = netname;
cp 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; return -1;
} }
cp cp
device_fd = device_fd;
/* Set default MAC address for ethertap devices */ /* Set default MAC address for ethertap devices */
@ -62,11 +83,17 @@ cp
device_info = _("FreeBSD tap device"); 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 cp
return 0; return 0;
} }
void close_device(void)
{
cp
close(device_fd);
}
/* /*
read, encrypt and send data that is read, encrypt and send data that is
available through the ethertap device available through the ethertap device
@ -77,7 +104,7 @@ int read_packet(vpn_packet_t *packet)
cp cp
if((lenin = read(device_fd, packet->data, MTU)) <= 0) 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; return -1;
} }
@ -102,10 +129,19 @@ cp
if(write(device_fd, packet->data, packet->len) < 0) 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; return -1;
} }
device_total_out += packet->len; device_total_out += packet->len;
cp 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 graph.c -- graph algorithms
Copyright (C) 2001 Guus Sliepen <guus@sliepen.warande.net>, Copyright (C) 2001-2002 Guus Sliepen <guus@sliepen.warande.net>,
2001 Ivo Timmermans <itimmermans@bigfoot.com> 2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify 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 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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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: /* 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 For the SSSP algorithm Dijkstra's seems to be a nice choice. Currently a
simple breadth-first search is presented here. 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 <syslog.h>
#include "config.h" #include "config.h"
#include <string.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 <avl_tree.h>
#include <utils.h>
#include "netutl.h"
#include "node.h" #include "node.h"
#include "edge.h" #include "edge.h"
#include "connection.h" #include "connection.h"
@ -67,6 +77,11 @@ void mst_kruskal(void)
int safe_edges = 0; int safe_edges = 0;
int skipped; int skipped;
/* Do we have something to do at all? */
if(!edge_weight_tree->head)
return;
/* Clear visited status on nodes */ /* Clear visited status on nodes */
for(node = node_tree->head; node; node = node->next) for(node = node_tree->head; node; node = node->next)
@ -78,7 +93,7 @@ void mst_kruskal(void)
/* Starting point */ /* 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 */ /* Clear MST status on connections */
@ -95,14 +110,14 @@ void mst_kruskal(void)
next = node->next; next = node->next;
e = (edge_t *)node->data; 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; skipped = 1;
continue; continue;
} }
e->from->status.visited = 1; e->from.node->status.visited = 1;
e->to->status.visited = 1; e->to.node->status.visited = 1;
if(e->connection) if(e->connection)
e->connection->status.mst = 1; e->connection->status.mst = 1;
@ -120,11 +135,12 @@ void mst_kruskal(void)
Running time: O(E) Running time: O(E)
*/ */
void sssp_bfs(int prune) void sssp_bfs(void)
{ {
avl_node_t *node, *from, *next, *to; avl_node_t *node, *from, *next, *to;
edge_t *e; edge_t *e;
node_t *n, *check; node_t *n;
halfconnection_t to_hc, from_hc;
avl_tree_t *todo_tree; avl_tree_t *todo_tree;
todo_tree = avl_alloc_tree(NULL, NULL); todo_tree = avl_alloc_tree(NULL, NULL);
@ -150,46 +166,82 @@ void sssp_bfs(int prune)
while(todo_tree->head) 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; next = from->next;
n = (node_t *)from->data; 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; e = (edge_t *)to->data;
if(e->from == n) if(e->from.node == n) /* "from_hc" is the halfconnection with .node == from */
check = e->to; to_hc = e->to, from_hc = e->from;
else 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; to_hc.node->status.visited = 1;
check->nexthop = (n->nexthop == myself) ? check : n->nexthop; to_hc.node->nexthop = (n->nexthop == myself) ? to_hc.node : n->nexthop;
check->via = (e->options & OPTION_INDIRECT || n->via != n) ? n->via : check; 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 = avl_alloc_node();
node->data = check; node->data = to_hc.node;
avl_insert_before(todo_tree, from, 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); 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; if(!n->status.reachable)
n = (node_t *)node->data; {
if(debug_lvl >= DEBUG_TRAFFIC)
if(n->status.visited == 0) syslog(LOG_DEBUG, _("Node %s (%s) became reachable"), n->name, n->hostname);
node_del(n); 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 graph.h -- header for graph.c
Copyright (C) 2001 Guus Sliepen <guus@sliepen.warande.net>, Copyright (C) 2001-2002 Guus Sliepen <guus@sliepen.warande.net>,
2001 Ivo Timmermans <itimmermans@bigfoot.com> 2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify 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 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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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 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 device.c -- Interaction with Linux ethertap and tun/tap device
Copyright (C) 2001 Ivo Timmermans <itimmermans@bigfoot.com>, Copyright (C) 2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
2001 Guus Sliepen <guus@sliepen.warande.net> 2001-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify 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 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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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" #include "config.h"
@ -63,7 +63,7 @@ char *device_info;
int device_total_in = 0; int device_total_in = 0;
int device_total_out = 0; int device_total_out = 0;
subnet_t mymac; extern subnet_t mymac;
/* /*
open the local ethertap device open the local ethertap device
@ -158,9 +158,7 @@ cp
} }
else /* ethertap */ else /* ethertap */
{ {
struct iovec vector[2] = {{&packet->len, 2}, {packet->data, MTU}}; if((lenin = read(device_fd, packet->data - 2, MTU + 2)) <= 0)
if((lenin = readv(device_fd, vector, 2)) <= 0)
{ {
syslog(LOG_ERR, _("Error while reading from %s %s: %m"), device_info, device); syslog(LOG_ERR, _("Error while reading from %s %s: %m"), device_info, device);
return -1; return -1;
@ -197,9 +195,8 @@ cp
} }
else/* ethertap */ else/* ethertap */
{ {
struct iovec vector[2] = {{&packet->len, 2}, {packet->data, MTU}}; *(short int *)(packet->data - 2) = packet->len;
if(write(device_fd, packet->data - 2, packet->len + 2) < 0)
if(writev(device_fd, vector, 2) < 0)
{ {
syslog(LOG_ERR, _("Can't write to %s %s: %m"), device_info, device); syslog(LOG_ERR, _("Can't write to %s %s: %m"), device_info, device);
return -1; return -1;

View file

@ -1,7 +1,7 @@
/* /*
meta.c -- handle the meta communication meta.c -- handle the meta communication
Copyright (C) 2000,2001 Guus Sliepen <guus@sliepen.warande.net>, Copyright (C) 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
2000,2001 Ivo Timmermans <itimmermans@bigfoot.com> 2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify 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 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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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" #include "config.h"

View file

@ -1,7 +1,7 @@
/* /*
meta.h -- header for meta.c meta.h -- header for meta.c
Copyright (C) 2000,2001 Guus Sliepen <guus@sliepen.warande.net>, Copyright (C) 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
2000,2001 Ivo Timmermans <itimmermans@bigfoot.com> 2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify 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 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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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__ #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 net.h -- header for net.c
Copyright (C) 1998-2001 Ivo Timmermans <zarq@iname.com> Copyright (C) 1998-2002 Ivo Timmermans <zarq@iname.com>
2000,2001 Guus Sliepen <guus@sliepen.warande.net> 2000-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify 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 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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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__ #ifndef __TINC_NET_H__
@ -27,41 +27,35 @@
#include "config.h" #include "config.h"
#define MAXSIZE 1700 /* should be a bit more than the MTU for the tapdevice */ #define MTU 1514 /* 1500 bytes payload + 14 bytes ethernet header */
#define MTU 1600 #define MAXSIZE 1600 /* MTU + header (seqno) and trailer (CBC padding and HMAC) */
#define SALTLEN 2 /* to spice things up for the NSA... */
#define MAC_ADDR_S "%02x:%02x:%02x:%02x:%02x:%02x" #define MAXBUFSIZE 2048 /* Probably way too much, but it must fit every possible request. */
#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
typedef struct mac_t typedef struct mac_t
{ {
unsigned char x[6]; unsigned char x[6];
} mac_t; } 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 short length_t;
typedef struct vpn_packet_t { typedef struct vpn_packet_t {
length_t len; /* the actual number of bytes in the `data' field */ 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]; unsigned char data[MAXSIZE];
} vpn_packet_t; } vpn_packet_t;
@ -76,11 +70,16 @@ typedef struct packet_queue_t {
queue_element_t *tail; queue_element_t *tail;
} packet_queue_t; } packet_queue_t;
typedef struct outgoing_t {
char *name;
int timeout;
} outgoing_t;
extern int maxtimeout; extern int maxtimeout;
extern int seconds_till_retry; extern int seconds_till_retry;
extern char *request_name[256]; extern char *request_name[];
extern char *status_text[10]; extern char *status_text[];
#include "connection.h" /* Yes, very strange placement indeed, but otherwise the typedefs get all tangled up */ #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 receive_tcppacket(struct connection_t *, char *, int);
extern void broadcast_packet(struct node_t *, vpn_packet_t *); extern void broadcast_packet(struct node_t *, vpn_packet_t *);
extern int setup_network_connections(void); 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 close_network_connections(void);
extern void main_loop(void); extern void main_loop(void);
extern void terminate_connection(connection_t *, int); extern void terminate_connection(connection_t *, int);
extern void flush_queue(struct node_t *); extern void flush_queue(struct node_t *);
extern int read_rsa_public_key(struct connection_t *); extern int read_rsa_public_key(struct connection_t *);
extern RETSIGTYPE try_outgoing_connections(int);
#endif /* __TINC_NET_H__ */ #endif /* __TINC_NET_H__ */

View file

@ -1,7 +1,7 @@
/* /*
node.c -- node tree management node.c -- node tree management
Copyright (C) 2001 Guus Sliepen <guus@sliepen.warande.net>, Copyright (C) 2001-2002 Guus Sliepen <guus@sliepen.warande.net>,
2001 Ivo Timmermans <itimmermans@bigfoot.com> 2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify 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 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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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" #include "config.h"
@ -47,10 +47,13 @@ int node_udp_compare(node_t *a, node_t *b)
{ {
if(a->address < b->address) if(a->address < b->address)
return -1; return -1;
else if (a->address > b->address) if (a->address > b->address)
return 1; return 1;
else if (a->port < b->port)
return 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) void init_nodes(void)
@ -140,11 +143,13 @@ cp
return avl_search(node_tree, &n); 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; node_t n;
cp cp
n.name = NULL;
n.address = address; n.address = address;
n.port = port;
return avl_search(node_udp_tree, &n); return avl_search(node_udp_tree, &n);
} }
@ -158,9 +163,9 @@ cp
for(node = node_tree->head; node; node = node->next) for(node = node_tree->head; node; node = node->next)
{ {
n = (node_t *)node->data; n = (node_t *)node->data;
syslog(LOG_DEBUG, _(" %s at %s port %s options %ld status %04x nexthop %s via %s"), 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->options, 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->name, n->via->name); n->status, n->nexthop?n->nexthop->name:"-", n->via?n->via->name:"-");
} }
syslog(LOG_DEBUG, _("End of nodes.")); syslog(LOG_DEBUG, _("End of nodes."));

View file

@ -1,7 +1,7 @@
/* /*
node.h -- header for node.c node.h -- header for node.c
Copyright (C) 2001 Guus Sliepen <guus@sliepen.warande.net>, Copyright (C) 2001-2002 Guus Sliepen <guus@sliepen.warande.net>,
2001 Ivo Timmermans <itimmermans@bigfoot.com> 2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify 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 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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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__ #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 validkey:1; /* 1 if we currently have a valid key for him */
int waitingforkey:1; /* 1 if we already sent out a request */ 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 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; } node_status_t;
typedef struct node_t { typedef struct node_t {
char *name; /* name of this node */ char *name; /* name of this node */
long int options; /* options turned on for this node */ long int options; /* options turned on for this node */
struct addrinfo *address; /* his real (internet) ip to send UDP packets to */ ipv4_t address; /* his real (internet) ip to send UDP packets to */
char *port; /* string representation of the port number */ port_t port; /* port number of UDP connection */
char *hostname; /* the hostname of its real ip */ char *hostname; /* the hostname of its real ip */
struct node_status_t status; 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 */ char *key; /* Cipher key and iv */
int keylength; /* Cipher key and iv length*/ 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 */ list_t *queue; /* Queue for packets awaiting to be encrypted */
struct node_t *nexthop; /* nearest node from us to him */ 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 */ 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) */ 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; } node_t;
extern struct node_t *myself; extern struct node_t *myself;
extern avl_tree_t *node_tree; extern avl_tree_t *node_tree;
extern avl_tree_t *node_udp_tree;
extern void init_nodes(void); extern void init_nodes(void);
extern void exit_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_add(node_t *n);
extern void node_del(node_t *n); extern void node_del(node_t *n);
extern node_t *lookup_node(char *); 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); extern void dump_nodes(void);
#endif /* __TINC_NODE_H__ */ #endif /* __TINC_NODE_H__ */

View file

@ -1,7 +1,7 @@
/* /*
device.c -- Interaction with OpenBSD tun device device.c -- Interaction with OpenBSD tun device
Copyright (C) 2001 Ivo Timmermans <itimmermans@bigfoot.com>, Copyright (C) 2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
2001 Guus Sliepen <guus@sliepen.warande.net> 2001-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify 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 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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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 DEFAULT_DEVICE "/dev/tun0"
#define DEVICE_TYPE_ETHERTAP 0 #define DEVICE_TYPE_ETHERTAP 0
@ -27,24 +48,29 @@
int device_fd = -1; int device_fd = -1;
int device_type; int device_type;
char *device_fname; char *device;
char *interface;
char *device_info; char *device_info;
int device_total_in = 0; int device_total_in = 0;
int device_total_out = 0; int device_total_out = 0;
extern subnet_t mymac;
/* /*
open the local ethertap device open the local ethertap device
*/ */
int setup_device(void) int setup_device(void)
{ {
if(!get_config_string(lookup_config(config_tree, "Device"), &device_fname))) if(!get_config_string(lookup_config(config_tree, "Device"), &device))
device_fname = DEFAULT_DEVICE; device = DEFAULT_DEVICE;
if(!get_config_string(lookup_config(config_tree, "Interface"), &interface))
interface = netname;
cp 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; return -1;
} }
cp cp
@ -60,28 +86,35 @@ cp
device_info = _("OpenBSD tun device"); 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 cp
return 0; return 0;
} }
void close_device(void)
{
cp
close(device_fd);
cp
}
int read_packet(vpn_packet_t *packet) int read_packet(vpn_packet_t *packet)
{ {
int lenin; int lenin;
u_int32_t type; u_int32_t type;
cp
struct iovec vector[2] = {{&type, sizeof(type)}, {packet->data + 14, MTU - 14}}; struct iovec vector[2] = {{&type, sizeof(type)}, {packet->data + 14, MTU - 14}};
cp
if((lenin = readv(device_fd, vector, 2)) <= 0) 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; return -1;
} }
memcpy(vp->data, mymac.net.mac.address.x, 6); memcpy(packet->data, mymac.net.mac.address.x, 6);
memcpy(vp->data + 6, mymac.net.mac.address.x, 6); memcpy(packet->data + 6, mymac.net.mac.address.x, 6);
vp->data[12] = 0x08; packet->data[12] = 0x08;
vp->data[13] = 0x00; packet->data[13] = 0x00;
packet->len = lenin + 10; packet->len = lenin + 10;
@ -89,7 +122,7 @@ cp
if(debug_lvl >= DEBUG_TRAFFIC) 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; return 0;
@ -99,20 +132,32 @@ cp
int write_packet(vpn_packet_t *packet) int write_packet(vpn_packet_t *packet)
{ {
u_int32_t type = htonl(AF_INET); u_int32_t type = htonl(AF_INET);
struct iovec vector[2];
cp cp
if(debug_lvl >= DEBUG_TRAFFIC) if(debug_lvl >= DEBUG_TRAFFIC)
syslog(LOG_DEBUG, _("Writing packet of %d bytes to %s"), syslog(LOG_DEBUG, _("Writing packet of %d bytes to %s"),
packet->len, device_info); packet->len, device_info);
vector[0].iov_base = &type;
struct iovec vector[2] = {{&type, sizeof(type)}, {packet->data + 14, packet->len - 14}}; 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) 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; return -1;
} }
device_total_out += packet->len; device_total_out += packet->len;
cp 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 process.c -- process management functions
Copyright (C) 1999-2001 Ivo Timmermans <itimmermans@bigfoot.com>, Copyright (C) 1999-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
2000,2001 Guus Sliepen <guus@sliepen.warande.net> 2000-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify 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 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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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" #include "config.h"
@ -59,6 +59,10 @@ sigset_t emptysigset;
static int saved_debug_lvl = 0; static int saved_debug_lvl = 0;
extern int sighup;
extern int sigalrm;
extern int do_purge;
void memory_full(int size) void memory_full(int size)
{ {
syslog(LOG_ERR, _("Memory exhausted (couldn't allocate %d bytes), exiting."), 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_mask = emptysigset;
act.sa_flags = SA_SIGINFO; act.sa_flags = SA_SIGINFO;
act.sa_sigaction = sigsegv_square; act.sa_sigaction = sigsegv_square;
sigaction(SIGSEGV, &act, NULL);
close_network_connections(); close_network_connections();
sleep(5); sleep(5);
@ -351,7 +356,7 @@ sigsegv_handler(int a, siginfo_t *info, void *b)
else else
{ {
syslog(LOG_NOTICE, _("Not restarting.")); 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 RETSIGTYPE
sigusr1_handler(int a, siginfo_t *info, void *b) sigusr1_handler(int a, siginfo_t *info, void *b)
{ {
@ -397,6 +410,13 @@ sigusr2_handler(int a, siginfo_t *info, void *b)
dump_subnets(); dump_subnets();
} }
RETSIGTYPE
sigwinch_handler(int a, siginfo_t *info, void *b)
{
extern int do_purge;
do_purge = 1;
}
RETSIGTYPE RETSIGTYPE
unexpected_signal_handler(int a, siginfo_t *info, void *b) unexpected_signal_handler(int a, siginfo_t *info, void *b)
{ {
@ -427,7 +447,8 @@ struct {
{ SIGUSR1, sigusr1_handler }, { SIGUSR1, sigusr1_handler },
{ SIGUSR2, sigusr2_handler }, { SIGUSR2, sigusr2_handler },
{ SIGCHLD, ignore_signal_handler }, { SIGCHLD, ignore_signal_handler },
{ SIGALRM, ignore_signal_handler }, { SIGALRM, sigalrm_handler },
{ SIGWINCH, sigwinch_handler },
{ 0, NULL } { 0, NULL }
}; };
@ -447,7 +468,7 @@ setup_signals(void)
for(i = 0; i < NSIG; i++) for(i = 0; i < NSIG; i++)
{ {
if(!do_detach) if(!do_detach)
act.sa_sigaction = SIG_DFL; act.sa_sigaction = (void(*)(int, siginfo_t *, void *))SIG_DFL;
else else
act.sa_sigaction = unexpected_signal_handler; act.sa_sigaction = unexpected_signal_handler;
sigaction(i, &act, NULL); sigaction(i, &act, NULL);
@ -455,7 +476,7 @@ setup_signals(void)
/* If we didn't detach, allow coredumps */ /* If we didn't detach, allow coredumps */
if(!do_detach) 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 /* Then, for each known signal that we want to catch, assign a
handler to the signal, with error checking this time. */ handler to the signal, with error checking this time. */

View file

@ -1,7 +1,7 @@
/* /*
process.h -- header file for process.c process.h -- header file for process.c
Copyright (C) 1999-2001 Ivo Timmermans <itimmermans@bigfoot.com>, Copyright (C) 1999-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
2000,2001 Guus Sliepen <guus@sliepen.warande.net> 2000-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify 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 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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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__ #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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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__ #ifndef __TINC_PROTOCOL_H__
@ -31,7 +31,7 @@
incompatible version have different protocols. incompatible version have different protocols.
*/ */
#define PROT_CURRENT 11 #define PROT_CURRENT 12
/* Request numbers */ /* Request numbers */
@ -40,7 +40,7 @@ enum {
ID = 0, METAKEY, CHALLENGE, CHAL_REPLY, ACK, ID = 0, METAKEY, CHALLENGE, CHAL_REPLY, ACK,
STATUS, ERROR, TERMREQ, STATUS, ERROR, TERMREQ,
PING, PONG, PING, PONG,
ADD_NODE, DEL_NODE, // ADD_NODE, DEL_NODE,
ADD_SUBNET, DEL_SUBNET, ADD_SUBNET, DEL_SUBNET,
ADD_EDGE, DEL_EDGE, ADD_EDGE, DEL_EDGE,
KEY_CHANGED, REQ_KEY, ANS_KEY, KEY_CHANGED, REQ_KEY, ANS_KEY,
@ -53,33 +53,58 @@ enum {
#define MAX_STRING_SIZE 1024 #define MAX_STRING_SIZE 1024
#define MAX_STRING "%1024s" #define MAX_STRING "%1024s"
extern int (*request_handlers[])(connection_t*); /* Basic functions */
extern int send_id(connection_t*); extern int send_request(connection_t*, const char*, ...);
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 receive_request(connection_t *); extern int receive_request(connection_t *);
extern int check_id(char *); 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__ */ #endif /* __TINC_PROTOCOL_H__ */

View file

@ -1,7 +1,7 @@
/* /*
route.c -- routing route.c -- routing
Copyright (C) 2000,2001 Ivo Timmermans <itimmermans@bigfoot.com>, Copyright (C) 2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
2000,2001 Guus Sliepen <guus@sliepen.warande.net> 2000-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify 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 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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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" #include "config.h"
#ifdef HAVE_FREEBSD #if defined(HAVE_FREEBSD) || defined(HAVE_OPENBSD)
#include <sys/param.h> #include <sys/param.h>
#endif #endif
#include <sys/socket.h> #include <sys/socket.h>
#include <netinet/in.h> #include <netinet/in.h>
#ifdef HAVE_SOLARIS #if defined(HAVE_SOLARIS) || defined(HAVE_OPENBSD)
#include <net/if.h> #include <net/if.h>
#define ETHER_ADDR_LEN 6 #define ETHER_ADDR_LEN 6
#else #else
@ -66,7 +66,7 @@ cp
if(!subnet || subnet->owner!=myself) if(!subnet || subnet->owner!=myself)
{ {
if(debug_lvl >= DEBUG_TRAFFIC) 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]); address->x[0], address->x[1], address->x[2], address->x[3], address->x[4], address->x[5]);
subnet = new_subnet(); subnet = new_subnet();
@ -103,10 +103,26 @@ cp
return NULL; 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(!subnet)
{ {
if(debug_lvl >= DEBUG_TRAFFIC) 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; return NULL;
@ -115,21 +131,25 @@ cp
return subnet->owner; 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; subnet_t *subnet;
cp cp
#warning FIXME subnet = lookup_subnet_ipv6((ipv6_t *)&packet->data[38]);
memcpy(&dest, &packet->data[30], 0);
subnet = lookup_subnet_ip(&dest);
cp cp
if(!subnet) if(!subnet)
{ {
if(debug_lvl >= DEBUG_TRAFFIC) 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; return NULL;
@ -143,7 +163,7 @@ void route_arp(vpn_packet_t *packet)
struct ether_arp *arp; struct ether_arp *arp;
subnet_t *subnet; subnet_t *subnet;
unsigned char ipbuf[4]; unsigned char ipbuf[4];
struct addrinfo *dest; ipv4_t dest;
cp cp
/* First, snatch the source address from the ARP packet */ /* First, snatch the source address from the ARP packet */
@ -172,9 +192,9 @@ cp
} }
/* Check if the IP address exists on the VPN */ /* Check if the IP address exists on the VPN */
#warning FIXME
dest = ntohl(*((unsigned long*)(arp->arp_tpa))); dest = ntohl(*((unsigned long*)(arp->arp_tpa)));
subnet = lookup_subnet_ip(&dest); subnet = lookup_subnet_ipv4(&dest);
if(!subnet) if(!subnet)
{ {

View file

@ -1,7 +1,7 @@
/* /*
route.h -- header file for route.c route.h -- header file for route.c
Copyright (C) 2000,2001 Ivo Timmermans <zarq@iname.com> Copyright (C) 2000-2002 Ivo Timmermans <zarq@iname.com>
2000,2001 Guus Sliepen <guus@sliepen.warande.net> 2000-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify 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 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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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__ #ifndef __TINC_ROUTE_H__

View file

@ -1,7 +1,7 @@
/* /*
device.c -- Interaction with Solaris tun device device.c -- Interaction with Solaris tun device
Copyright (C) 2001 Ivo Timmermans <itimmermans@bigfoot.com>, Copyright (C) 2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
2001 Guus Sliepen <guus@sliepen.warande.net> 2001-2002 Guus Sliepen <guus@sliepen.warande.net>
This program is free software; you can redistribute it and/or modify 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 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 along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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) 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; return 0;

View file

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

View file

@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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__ #ifndef __TINC_SUBNET_H__
@ -28,7 +28,8 @@
enum enum
{ {
SUBNET_MAC = 0, SUBNET_MAC = 0,
SUBNET_IP, SUBNET_IPV4,
SUBNET_IPV6,
SUBNET_TYPES /* Guardian */ SUBNET_TYPES /* Guardian */
}; };
@ -37,11 +38,19 @@ typedef struct subnet_mac_t
mac_t address; mac_t address;
} subnet_mac_t; } subnet_mac_t;
typedef struct subnet_ip_t typedef struct subnet_ipv4_t
{ {
struct addrinfo *address; ipv4_t address;
struct addrinfo *mask; ipv4_t mask;
} subnet_ip_t; int masklength;
} subnet_ipv4_t;
typedef struct subnet_ipv6_t
{
ipv6_t address;
ipv6_t mask;
int masklength;
} subnet_ipv6_t;
#include "node.h" #include "node.h"
@ -56,9 +65,9 @@ typedef struct subnet_t {
union net union net
{ {
subnet_mac_t mac; subnet_mac_t mac;
subnet_ip_t ip; subnet_ipv4_t ipv4;
subnet_ipv6_t ipv6;
} net; } net;
} subnet_t; } subnet_t;
extern subnet_t *new_subnet(void); extern subnet_t *new_subnet(void);
@ -73,7 +82,8 @@ extern char *net2str(subnet_t *);
extern subnet_t *str2net(char *); extern subnet_t *str2net(char *);
extern subnet_t *lookup_subnet(struct node_t *, subnet_t *); extern subnet_t *lookup_subnet(struct node_t *, subnet_t *);
extern subnet_t *lookup_subnet_mac(mac_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); extern void dump_subnets(void);
#endif /* __TINC_SUBNET_H__ */ #endif /* __TINC_SUBNET_H__ */

View file

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