Merging of the entire pre5 branch.
This commit is contained in:
parent
c2752b961c
commit
f0aa9641e8
70 changed files with 2575 additions and 4056 deletions
1
AUTHORS
1
AUTHORS
|
@ -5,7 +5,6 @@ Ivo Timmermans <itimmermans@bigfoot.com>
|
|||
These files are from other sources:
|
||||
* lib/pidfile.h and lib/pidfile.c are by Martin Schulze, taken from
|
||||
the syslog 1.3 sources.
|
||||
* lib/dropin.c has various parts taken from OpenSSH.
|
||||
|
||||
Also some of the macro files in the directory m4, and their
|
||||
accompanying files in lib, were taken from GNU fileutils.
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
AUTOMAKE_OPTIONS = gnu
|
||||
|
||||
SUBDIRS = m4 intl lib src doc po redhat
|
||||
SUBDIRS = m4 intl lib src doc po
|
||||
|
||||
ACLOCAL_AMFLAGS =
|
||||
|
||||
|
|
23
NEWS
23
NEWS
|
@ -1,4 +1,25 @@
|
|||
version 1.0pre4 Jan 17 2000
|
||||
version 1.0pre5 Feb 9 2002
|
||||
|
||||
* Security enhancements:
|
||||
|
||||
* Added sequence number and optional message authentication code to
|
||||
the packets.
|
||||
|
||||
* Configurable encryption cipher and digest algorithms.
|
||||
|
||||
* More robust handling of dis- and reconnects.
|
||||
|
||||
* Added a "switch" and a "hub" mode to allow bridging setups.
|
||||
|
||||
* Preliminary support for routing of IPv6 packets.
|
||||
|
||||
* Supports Linux, FreeBSD, OpenBSD and Solaris.
|
||||
|
||||
|
||||
It looks like this might be the last release before 1.0.
|
||||
|
||||
|
||||
version 1.0pre4 Jan 17 2001
|
||||
|
||||
* Updated documentation; the documentation now reflects the
|
||||
configuration as it is.
|
||||
|
|
48
README
48
README
|
@ -1,7 +1,7 @@
|
|||
This is the README file for tinc version 1.0pre4. Installation
|
||||
This is the README file for tinc version 1.0pre5. Installation
|
||||
instructions may be found in the INSTALL file.
|
||||
|
||||
tinc is Copyright (C) 1998-2001 by:
|
||||
tinc is Copyright (C) 1998-2002 by:
|
||||
|
||||
Ivo Timmermans <itimmermans@bigfoot.com>,
|
||||
Guus Sliepen <guus@sliepen.warande.net>,
|
||||
|
@ -18,12 +18,16 @@ your option) any later version. See the file COPYING for more details.
|
|||
Security statement
|
||||
------------------
|
||||
|
||||
In august 2000, we discovered the existence of a security hole in all
|
||||
versions of tinc up to and including 1.0pre2. This had to do with the
|
||||
way we exchanged keys. Since then, we have been working on a new
|
||||
authentication scheme to make tinc as secure as possible. The current
|
||||
version uses the OpenSSL library and does authentication in much the
|
||||
same way as the SSH protocol does.
|
||||
In August 2000, we discovered the existence of a security hole in all versions
|
||||
of tinc up to and including 1.0pre2. This had to do with the way we exchanged
|
||||
keys. Since then, we have been working on a new authentication scheme to make
|
||||
tinc as secure as possible. The current version uses the OpenSSL library and
|
||||
uses strong authentication with RSA keys.
|
||||
|
||||
On the 29th of December 2001, Jerome Etienne posted a security analysis of tinc
|
||||
1.0pre4. Due to a lack of sequence numbers and a message authentication code
|
||||
for each packet, an attacker could possibly disrupt certain network services or
|
||||
launch a denial of service attack by replaying intercepted packets.
|
||||
|
||||
Cryptography is a hard thing to get right. We cannot make any
|
||||
guarantees. Time, review and feedback are the only things that can
|
||||
|
@ -31,6 +35,14 @@ prove the security of any cryptographic product. If you wish to review
|
|||
tinc or give us feedback, you are stronly encouraged to do so.
|
||||
|
||||
|
||||
Changes to configuration file format
|
||||
------------------------------------
|
||||
|
||||
Some configuration variables have different names now. Most notably "TapDevice"
|
||||
should be changed into "Device", and "Device" should be changed into
|
||||
"BindToDevice".
|
||||
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
||||
|
@ -41,6 +53,9 @@ this library is not installed on you system, configure will fail. The
|
|||
manual in doc/tinc.texi contains more detailed information on how to
|
||||
install this library.
|
||||
|
||||
In order to compile tinc, you will also need autoconf, automake, GNU make, m4
|
||||
and gettext.
|
||||
|
||||
|
||||
Features
|
||||
--------
|
||||
|
@ -68,3 +83,20 @@ This version supports multiple subnets at once. They are also sorted
|
|||
on subnet mask size. This means that it is possible to have
|
||||
overlapping subnets on the VPN, as long as their subnet mask sizes
|
||||
differ.
|
||||
|
||||
Since pre5, tinc can operate in several routing modes. The default mode,
|
||||
"router", works exactly like the older version, and uses Subnet lines to
|
||||
determine the destination of packets. The other two modes, "switch" and "hub",
|
||||
allow the tinc daemons to work together like a single network switch or hub.
|
||||
This is useful for bridging networks.
|
||||
|
||||
The algorithms used for encryption and generating message authentication codes
|
||||
can now be changed in the configuration files. All cipher and digest algorithms
|
||||
supported by OpenSSL can be used. Useful ciphers are "blowfish" (default),
|
||||
"bf-ofb", "des", "des3", etcetera. Useful digests are "sha1" (default), "md5",
|
||||
etcetera.
|
||||
|
||||
Preliminary support for routing IPv6 packets has been added. Just add Subnet
|
||||
lines with IPv6 addresses (without using :: abbreviations) and use ifconfig to
|
||||
give the virtual network interface corresponding IPv6 addresses.
|
||||
Autoconfiguration will not work in router mode.
|
||||
|
|
1
THANKS
1
THANKS
|
@ -16,6 +16,7 @@ We would like to thank
|
|||
* Matias Carrasco (for the Spanish translation of the manual)
|
||||
* Jamie Briggs (for finding a lot of socket leaks)
|
||||
* Armijn Hemel (for being our very own PR manager)
|
||||
* Jerome Etienne (for a thorough security analysis of tinc)
|
||||
|
||||
for their help, support and ideas. Thank you guys!
|
||||
|
||||
|
|
26
TODO
26
TODO
|
@ -1,27 +1,5 @@
|
|||
TODO LIST
|
||||
|
||||
Goals for 1.0 release:
|
||||
1.0:
|
||||
|
||||
* Check Solaris port
|
||||
* Check FreeBSD port again (done)
|
||||
* Check TCPonly and IndirectData
|
||||
|
||||
* Check different linux architectures (x86, alpha and sparc32 done)
|
||||
* Store private key in a separate file (done, 1 dec 2000)
|
||||
* Sanity checks on configuration directory (mostly done)
|
||||
* Use efficient tree algorithms instead of linked lists (done)
|
||||
* Reenable queues for delayed packets (done)
|
||||
* Merge documentation files (SECURITY, INSTALL, PROTOCOL) into tinc.texi (done)
|
||||
* Different authentication scheme (done)
|
||||
* Add randomness to packet headers and PING/PONG requests (done)
|
||||
|
||||
Goals for future releases:
|
||||
|
||||
* Compression
|
||||
* Routing by MAC/switching (allows for more than only IPv4) (done)
|
||||
* Broadcast/multicast (done)
|
||||
* Windowing, chaffing, scattering, background noise
|
||||
* ABC protocol (superscalabilty)
|
||||
* Proxy ARP (done)
|
||||
* Easy setup scripts (graphical?)
|
||||
* Threading
|
||||
* A nice, secure and stable release
|
||||
|
|
|
@ -36,7 +36,6 @@
|
|||
/* Define to 1 if you have the stpcpy function. */
|
||||
#undef HAVE_STPCPY
|
||||
|
||||
|
||||
/* For getopt */
|
||||
#if HAVE_STDLIB_H
|
||||
# define getopt system_getopt
|
||||
|
@ -68,5 +67,5 @@
|
|||
/* Define to 1 if checkpoint tracing is enabled */
|
||||
#undef ENABLE_TRACING
|
||||
|
||||
/* Define to 1 if you have struct addrinfo */
|
||||
#undef HAVE_STRUCT_ADDRINFO
|
||||
/* Define to enable use of old SSLeay_add_all_algorithms() function */
|
||||
#undef HAVE_SSLEAY_ADD_ALL_ALGORITHMS
|
||||
|
|
33
configure.in
33
configure.in
|
@ -1,6 +1,6 @@
|
|||
dnl Process this file with autoconf to produce a configure script.
|
||||
|
||||
dnl $Id: configure.in,v 1.13.2.38 2001/11/15 23:49:46 zarq Exp $
|
||||
dnl $Id: configure.in,v 1.13.2.39 2002/02/10 21:57:51 guus Exp $
|
||||
|
||||
AC_INIT(src/tincd.c)
|
||||
AM_INIT_AUTOMAKE(tinc, 1.0-cvs)
|
||||
|
@ -36,19 +36,19 @@ AC_CANONICAL_HOST
|
|||
case $host_os in
|
||||
*linux*)
|
||||
AC_DEFINE(HAVE_LINUX)
|
||||
[ ln -sf linux/device.c src/device.c ]
|
||||
[ rm -f src/device.c; ln -sf linux/device.c src/device.c ]
|
||||
;;
|
||||
*freebsd*)
|
||||
AC_DEFINE(HAVE_FREEBSD)
|
||||
[ ln -sf freebsd/device.c src/device.c ]
|
||||
[ rm -f src/device.c; ln -sf freebsd/device.c src/device.c ]
|
||||
;;
|
||||
*solaris*)
|
||||
AC_DEFINE(HAVE_SOLARIS)
|
||||
[ ln -sf solaris/device.c src/device.c ]
|
||||
[ rm -f src/device.c; ln -sf solaris/device.c src/device.c ]
|
||||
;;
|
||||
*openbsd*)
|
||||
AC_DEFINE(HAVE_OPENBSD)
|
||||
[ ln -sf openbsd/device.c src/device.c ]
|
||||
[ rm -f src/device.c; ln -sf openbsd/device.c src/device.c ]
|
||||
;;
|
||||
esac
|
||||
|
||||
|
@ -68,28 +68,12 @@ AC_TYPE_SIZE_T
|
|||
AC_HEADER_TIME
|
||||
AC_STRUCT_TM
|
||||
|
||||
AC_CACHE_CHECK([for struct addrinfo], ac_cv_have_struct_addrinfo, [
|
||||
AC_TRY_COMPILE(
|
||||
[
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netdb.h>
|
||||
],
|
||||
[ struct addrinfo s; s.ai_flags = 0; ],
|
||||
[ ac_cv_have_struct_addrinfo="yes" ],
|
||||
[ ac_cv_have_struct_addrinfo="no" ]
|
||||
)])
|
||||
if test "x$ac_cv_have_struct_addrinfo" = "xyes" ; then
|
||||
AC_DEFINE(HAVE_STRUCT_ADDRINFO)
|
||||
fi
|
||||
|
||||
dnl Checks for library functions.
|
||||
AC_FUNC_MEMCMP
|
||||
AC_FUNC_ALLOCA
|
||||
AC_TYPE_SIGNAL
|
||||
AC_CHECK_FUNCS([ftime socket select strtol strerror flock unsetenv \
|
||||
asprintf putenv strdup fcloseall daemon strsignal get_current_dir_name \
|
||||
getaddrinfo getnameinfo gai_strerror freeaddrinfo])
|
||||
asprintf putenv strdup fcloseall daemon strsignal get_current_dir_name])
|
||||
jm_FUNC_MALLOC
|
||||
jm_FUNC_REALLOC
|
||||
|
||||
|
@ -127,5 +111,6 @@ intl/Makefile
|
|||
lib/Makefile
|
||||
m4/Makefile
|
||||
po/Makefile.in
|
||||
redhat/Makefile
|
||||
debian/Makefile)
|
||||
po/POTFILES
|
||||
po/Makefile
|
||||
)
|
||||
|
|
2
debian/.cvsignore
vendored
2
debian/.cvsignore
vendored
|
@ -1,2 +0,0 @@
|
|||
Makefile Makefile.in tmp postinst.debhelper postrm.debhelper
|
||||
preinst.debhelper prerm.debhelper substvars files
|
3
debian/Makefile.am
vendored
3
debian/Makefile.am
vendored
|
@ -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
10
debian/README.Debian
vendored
|
@ -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
68
debian/changelog
vendored
|
@ -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
5
debian/conffiles
vendored
|
@ -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
20
debian/control
vendored
|
@ -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
63
debian/copyright
vendored
|
@ -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
2
debian/dirs
vendored
|
@ -1,2 +0,0 @@
|
|||
etc/tinc
|
||||
etc/tinc/example
|
10
debian/doc-base.tinc
vendored
10
debian/doc-base.tinc
vendored
|
@ -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
3
debian/docs
vendored
|
@ -1,3 +0,0 @@
|
|||
INSTALL
|
||||
NEWS
|
||||
README
|
1
debian/info
vendored
1
debian/info
vendored
|
@ -1 +0,0 @@
|
|||
doc/tinc.info
|
66
debian/init.d
vendored
66
debian/init.d
vendored
|
@ -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
|
32
debian/po-Makefile.in.in.diff
vendored
32
debian/po-Makefile.in.in.diff
vendored
|
@ -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
70
debian/postinst
vendored
|
@ -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
78
debian/rules
vendored
|
@ -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
13
debian/tinc.modules
vendored
|
@ -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
|
|
@ -1,7 +1,7 @@
|
|||
This document describes how nodes in a VPN find and connect to eachother and
|
||||
maintain a stable network.
|
||||
|
||||
Copyright 2001 Guus Sliepen <guus@sliepen.warande.net>
|
||||
Copyright 2001-2002 Guus Sliepen <guus@sliepen.warande.net>
|
||||
|
||||
Permission is granted to make and distribute verbatim copies of
|
||||
this documentation provided the copyright notice and this
|
||||
|
@ -12,7 +12,7 @@ maintain a stable network.
|
|||
provided that the entire resulting derived work is distributed
|
||||
under the terms of a permission notice identical to this one.
|
||||
|
||||
$Id: CONNECTIVITY,v 1.1.2.7 2001/07/24 08:51:36 guus Exp $
|
||||
$Id: CONNECTIVITY,v 1.1.2.8 2002/02/10 21:57:51 guus Exp $
|
||||
|
||||
1. Problem
|
||||
==========
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
This is the network infrastructure documentation for tinc, a Virtual Private
|
||||
Network daemon.
|
||||
|
||||
Copyright 2001 Guus Sliepen <guus@sliepen.warande.net>
|
||||
Copyright 2001-2002 Guus Sliepen <guus@sliepen.warande.net>
|
||||
|
||||
Permission is granted to make and distribute verbatim copies of
|
||||
this documentation provided the copyright notice and this
|
||||
|
@ -12,7 +12,7 @@ Network daemon.
|
|||
provided that the entire resulting derived work is distributed
|
||||
under the terms of a permission notice identical to this one.
|
||||
|
||||
$Id: NETWORKING,v 1.1.2.1 2001/03/04 14:00:24 guus Exp $
|
||||
$Id: NETWORKING,v 1.1.2.2 2002/02/10 21:57:51 guus Exp $
|
||||
|
||||
1. Packet flow
|
||||
==============
|
||||
|
|
66
doc/PROTOCOL
66
doc/PROTOCOL
|
@ -1,7 +1,7 @@
|
|||
This is the protocol documentation for tinc, a Virtual Private Network daemon.
|
||||
|
||||
Copyright 2000,2001 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2000,2001 Ivo Timmmermans <itimmermans@bigfoot.com>
|
||||
Copyright 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2000-2002 Ivo Timmmermans <itimmermans@bigfoot.com>
|
||||
|
||||
Permission is granted to make and distribute verbatim copies of
|
||||
this documentation provided the copyright notice and this
|
||||
|
@ -12,7 +12,7 @@ This is the protocol documentation for tinc, a Virtual Private Network daemon.
|
|||
provided that the entire resulting derived work is distributed
|
||||
under the terms of a permission notice identical to this one.
|
||||
|
||||
$Id: PROTOCOL,v 1.1.2.4 2001/01/07 17:08:02 guus Exp $
|
||||
$Id: PROTOCOL,v 1.1.2.5 2002/02/10 21:57:51 guus Exp $
|
||||
|
||||
|
||||
1. Protocols used in tinc
|
||||
|
@ -33,17 +33,19 @@ can be found in various UNIX flavours.
|
|||
Normal packets are sent without any state information, so the layout
|
||||
is pretty basic.
|
||||
|
||||
A data packet can only be sent if the encryption key is known to both
|
||||
parties, and the connection is activated. If the encryption key is not
|
||||
known, a request is sent to the destination using the meta connection
|
||||
to retreive it.
|
||||
A data packet can only be sent if the encryption key, cipher and digest are
|
||||
known to both parties, and the connection is activated. If the encryption key
|
||||
is not known, a request is sent to the destination using the meta connection to
|
||||
retreive it.
|
||||
|
||||
0 1 2 3
|
||||
| LEN | DATA : \
|
||||
: DATA . } encrypted
|
||||
. : /
|
||||
.
|
||||
0 1 2 3 4 5 6 7 ... 97 98 99 100
|
||||
| seqno | data | MAC |
|
||||
\____________________________________/\_______________/
|
||||
| |
|
||||
encrypted using symmetric cipher digest
|
||||
|
||||
The sequence number prevents replay attacks, the message authentication code
|
||||
prevents altered packets from being accepted.
|
||||
|
||||
3. Meta protocol
|
||||
----------------
|
||||
|
@ -59,7 +61,7 @@ possible to use tools such as telnet or netcat to connect to a tinc
|
|||
daemon and to read and write requests by hand, provided that one
|
||||
understands the numeric codes sent.
|
||||
|
||||
The authentication scheme is described in the SECURITY file. After a
|
||||
The authentication scheme is described in the SECURITY2 file. After a
|
||||
succesful authentication, the server and the client will exchange all the
|
||||
information about other tinc daemons and subnets they know of, so that both
|
||||
sides (and all the other tinc daemons behind them) have their information
|
||||
|
@ -67,19 +69,23 @@ synchronised.
|
|||
|
||||
daemon message
|
||||
--------------------------------------------------------------------------
|
||||
origin ADD_HOST daemon a329e18c:655 0
|
||||
| | +--> options
|
||||
| +---------> real address:port
|
||||
+-------------------> name of new tinc daemon
|
||||
origin ADD_SUBNET daemon 1,0a010100/ffffff00
|
||||
| | | +--> netmask
|
||||
| | +----------> vpn IPv4 network address
|
||||
| +----------------> subnet type (1=IPv4)
|
||||
+--------------------> owner of this subnet
|
||||
origin ADD_EDGE node1 12.23.34.45 655 node2 21.32.43.54 655 222 0
|
||||
| | | \___________________/ | +-> options
|
||||
| | | | +----> weight
|
||||
| | | +----------------> see below
|
||||
| | +--> UDP port
|
||||
| +----------> real address
|
||||
+------------------> name of node on one side of the edge
|
||||
|
||||
origin ADD_SUBNET node 192.168.1.0/24
|
||||
| | +--> masklength
|
||||
| +--------> IPv4 network address
|
||||
+------------------> owner of this subnet
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
In case daemons leave the VPN, DEL_HOST and DEL_SUBNET messages with exactly
|
||||
the same syntax are sent to inform the other daemons of the departure.
|
||||
In case a connection between two daemons is closed or broken, DEL_EDGE messages
|
||||
are sent to inform the other daemons of that fact. Each daemon will calculate a
|
||||
new route to the the daemons, or mark them unreachable if there isn't any.
|
||||
|
||||
The keys used to encrypt VPN packets are not sent out directly. This is
|
||||
because it would generate a lot of traffic on VPNs with many daemons, and
|
||||
|
@ -87,18 +93,22 @@ chances are that not every tinc daemon will ever send a packet to every
|
|||
other daemon. Instead, if a daemon needs a key it sends a request for it
|
||||
via the meta connection of the nearest hop in the direction of the
|
||||
destination. If any hop on the way has already learned the key, it will
|
||||
act as a proxy and forward it's copy back to the requestor.
|
||||
act as a proxy and forward its copy back to the requestor.
|
||||
|
||||
daemon message
|
||||
--------------------------------------------------------------------------
|
||||
daemon REQ_KEY origin destination
|
||||
| +--> name of the tinc daemon it wants the key from
|
||||
+----------> name of the daemon that wants the key
|
||||
daemon ANS_KEY origin destination e4ae0b0a82d6e0078179b5290c62c7d0
|
||||
| | \______________________________/
|
||||
| | +--> 128 bits key
|
||||
|
||||
daemon ANS_KEY origin destination 4ae0b0a82d6e0078 91 64 4
|
||||
| | \______________/ | | +--> MAC length
|
||||
| | | | +-----> digest algorithm
|
||||
| | | +--------> cipher algorithm
|
||||
| | +--> 128 bits key
|
||||
| +--> name of the daemon that wants the key
|
||||
+----------> name of the daemon that uses this key
|
||||
|
||||
daemon KEY_CHANGED origin
|
||||
+--> daemon that has changed it's packet key
|
||||
--------------------------------------------------------------------------
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
This is the security documentation for tinc, a Virtual Private Network daemon.
|
||||
|
||||
Copyright 2001 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2001 Wessel Dankers <wsl@nl.linux.org>
|
||||
Copyright 2001-2002 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2001-2002 Wessel Dankers <wsl@nl.linux.org>
|
||||
|
||||
Permission is granted to make and distribute verbatim copies of
|
||||
this documentation provided the copyright notice and this
|
||||
|
@ -12,7 +12,7 @@ This is the security documentation for tinc, a Virtual Private Network daemon.
|
|||
provided that the entire resulting derived work is distributed
|
||||
under the terms of a permission notice identical to this one.
|
||||
|
||||
$Id: SECURITY2,v 1.1.2.1 2001/02/13 09:54:29 guus Exp $
|
||||
$Id: SECURITY2,v 1.1.2.2 2002/02/10 21:57:51 guus Exp $
|
||||
|
||||
Proposed new authentication scheme
|
||||
----------------------------------
|
||||
|
@ -27,13 +27,11 @@ client <attempts connection>
|
|||
|
||||
server <accepts connection>
|
||||
|
||||
client ID client 9 0
|
||||
| | +-> options
|
||||
client ID client 12
|
||||
| +---> version
|
||||
+-------> name of tinc daemon
|
||||
|
||||
server ID server 9 0
|
||||
| | +-> options
|
||||
server ID server 12
|
||||
| +---> version
|
||||
+-------> name of tinc daemon
|
||||
|
||||
|
@ -64,6 +62,21 @@ client CHAL_REPLY 816a86
|
|||
|
||||
server CHAL_REPLY 928ffe
|
||||
+-> 160 bits SHA1 of H1
|
||||
|
||||
After the correct challenge replies are recieved, both ends have proved
|
||||
their identity. Further information is exchanged.
|
||||
|
||||
client ACK 655 12.23.34.45 123 0
|
||||
| | | +-> options
|
||||
| | +----> estimated weight
|
||||
| +------------> IP address of server as seen by client
|
||||
+--------------------> UDP port of client
|
||||
|
||||
server ACK 655 21.32.43.54 321 0
|
||||
| | | +-> options
|
||||
| | +----> estimated weight
|
||||
| +------------> IP address of client as seen by server
|
||||
+--------------------> UDP port of server
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
This new scheme has several improvements, both in efficiency and security.
|
||||
|
@ -107,9 +120,6 @@ Fourth: the first thing that is send via the symmetric cipher encrypted
|
|||
connection is a totally random string, so that there is no known plaintext (for
|
||||
an attacker) in the beginning of the encrypted stream.
|
||||
|
||||
|
||||
An explicit ACK is no longer needed, the CHAL_REPLY serves as an ACK.
|
||||
|
||||
Some things to be discussed:
|
||||
|
||||
- What should CHALLEN be? Same as RSAKEYLEN? 256 bits? More/less?
|
||||
|
|
|
@ -1,7 +1,4 @@
|
|||
#!/bin/sh
|
||||
# This file closes down the tap device.
|
||||
# Note that if you use the universal tun/tap driver, you don't
|
||||
# need to do anything; once tinc quits the tap device is already
|
||||
# removed by the kernel.
|
||||
|
||||
ifconfig tap1 down
|
||||
ifconfig $INTERFACE down
|
||||
|
|
|
@ -2,13 +2,14 @@
|
|||
# This file sets up the tap device.
|
||||
# It gives you the freedom to do anything you want with it.
|
||||
# Use the correct name for the tap device:
|
||||
# For ethertap this is tap0, tap1, tap2 etcetera,
|
||||
# but for the universal tun/tap device use $NETNAME.
|
||||
# For the Linux tun/tap device $INTERFACE is set to the right name,
|
||||
# but for ethertap and FreeBSD this is tap0, tap1, tap2 etcetera,
|
||||
# for Solaris and OpenBSD it is tun0, tun1, etcetera.
|
||||
|
||||
# Set hardware ethernet address (required!)
|
||||
ifconfig tap1 hw ether fe:fd:0:0:0:0
|
||||
ifconfig $INTERFACE hw ether fe:fd:0:0:0:0
|
||||
|
||||
# Give it the right ip and netmask. Remember, the subnet of the
|
||||
# tap device must be larger than that of the individual Subnets
|
||||
# as defined in the host configuration file!
|
||||
ifconfig tap1 192.168.1.1 netmask 255.255.0.0 -arp
|
||||
ifconfig $INTERFACE 192.168.1.1 netmask 255.255.0.0 -arp
|
||||
|
|
|
@ -16,8 +16,10 @@ Name = alpha
|
|||
ConnectTo = beta
|
||||
|
||||
# The tap device tinc will use. Required.
|
||||
# Default is /dev/tap0
|
||||
TapDevice = /dev/tap1
|
||||
# Default is /dev/tap0 for ethertap or FreeBSD,
|
||||
# /dev/tun0 for Solaris and OpenBSD,
|
||||
# and /dev/misc/net/tun for Linux tun/tap device.
|
||||
Device = /dev/misc/net/tun
|
||||
|
||||
# The file in which the private key for this host is stored. Required.
|
||||
PrivateKeyFile = /etc/tinc/example/rsa_key.priv
|
||||
|
|
528
doc/tinc.conf.5
528
doc/tinc.conf.5
|
@ -1,246 +1,322 @@
|
|||
.TH TINC 5 "Jan 2001" "tinc version 1.0pre4" "FSF"
|
||||
.SH NAME
|
||||
tinc.conf \- tinc daemon configuration
|
||||
.SH "DESCRIPTION"
|
||||
The files in the \fI/etc/tinc\fR directory contain runtime and
|
||||
security information for the \fBtincd\fR(8) daemon.
|
||||
.PP
|
||||
.SH "NETWORKS"
|
||||
It is perfectly ok for you to run more than one tinc daemon. However,
|
||||
in its default form, you will soon notice that you can't use two
|
||||
different configuration files without the \fI-c\fR option.
|
||||
|
||||
We have thought of another way of dealing with this: network
|
||||
names. This means that you call \fBtincd\fR with the \fI-n\fR argument,
|
||||
which will assign a name to this daemon.
|
||||
|
||||
The effect of this is that the daemon will set its configuration
|
||||
``root'' to \fI/etc/tinc/\fBnetname\fI/\fR, where \fBnetname\fR is your argument
|
||||
to the \fI-n\fR option. You'll notice that it appears in syslog as
|
||||
``tincd.\fBnetname\fR''.
|
||||
|
||||
However, it is not strictly necessary that you call tinc with the -n
|
||||
option. In this case, the network name would just be empty, and it
|
||||
will be used as such. tinc now looks for files in \fI/etc/tinc/\fR,
|
||||
instead of \fI/etc/tinc/\fBnetname\fI/\fR; the configuration file should be
|
||||
\fI/etc/tinc/tinc.conf\fR, and the passphrases are now expected to be
|
||||
in \fI/etc/tinc/passphrases/\fR.
|
||||
|
||||
But it is highly recommended that you use this feature of tinc,
|
||||
because it will be so much clearer whom your daemon talks to. Hence,
|
||||
we will assume that you use it.
|
||||
.PP
|
||||
.SH "NAMES"
|
||||
Each tinc daemon should have a name that is unique in the network which
|
||||
it will be part of. The name will be used by other tinc daemons for
|
||||
identification. The name has to be declared in the
|
||||
\fI/etc/tinc/\fBnetname\fI/tinc.conf\fR file.
|
||||
|
||||
To make things easy, choose something that will give unique and easy
|
||||
to rememebr names to your tinc daemon(s).
|
||||
.Dd 2002-02-06
|
||||
.Dt TINC.CONF 5
|
||||
.\" Manual page created by:
|
||||
.\" Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
.\" Guus Sliepen <guus@sliepen.warande.net>
|
||||
.Sh NAME
|
||||
.Nm tinc.conf
|
||||
.Nd tinc daemon configuration
|
||||
.Sh DESCRIPTION
|
||||
The files in the
|
||||
.Pa /etc/tinc/
|
||||
directory contain runtime and security information for the tinc daemon.
|
||||
.Sh NETWORKS
|
||||
It is perfectly ok for you to run more than one tinc daemon.
|
||||
However, in its default form,
|
||||
you will soon notice that you can't use two different configuration files without the
|
||||
.Fl c
|
||||
option.
|
||||
.Pp
|
||||
We have thought of another way of dealing with this: network names.
|
||||
This means that you call
|
||||
.Nm
|
||||
with the
|
||||
.Fl n
|
||||
option, which will assign a name to this daemon.
|
||||
.Pp
|
||||
The effect of this is that the daemon will set its configuration root to
|
||||
.Pa /etc/tinc/ Ns Ar NETNAME Ns Pa / ,
|
||||
where
|
||||
.Ar NETNAME
|
||||
is your argument to the
|
||||
.Fl n
|
||||
option.
|
||||
You'll notice that messages appear in syslog as coming from
|
||||
.Nm tincd. Ns Ar NETNAME .
|
||||
.Pp
|
||||
However, it is not strictly necessary that you call tinc with the
|
||||
.Fl n
|
||||
option.
|
||||
In this case, the network name would just be empty,
|
||||
and it will be used as such.
|
||||
.Nm tinc
|
||||
now looks for files in
|
||||
.Pa /etc/tinc/ ,
|
||||
instead of
|
||||
.Pa /etc/tinc/ Ns Ar NETNAME Ns Pa / ;
|
||||
the configuration file should be
|
||||
.Pa /etc/tinc/tinc.conf ,
|
||||
and the host configuration files are now expected to be in
|
||||
.Pa /etc/tinc/hosts/ .
|
||||
.Pp
|
||||
But it is highly recommended that you use this feature of
|
||||
.Nm tinc ,
|
||||
because it will be so much clearer whom your daemon talks to.
|
||||
Hence, we will assume that you use it.
|
||||
.Sh NAMES
|
||||
Each tinc daemon should have a name that is unique in the network which it will be part of.
|
||||
The name will be used by other tinc daemons for identification.
|
||||
The name has to be declared in the
|
||||
.Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /tinc.conf
|
||||
file.
|
||||
.Pp
|
||||
To make things easy,
|
||||
choose something that will give unique and easy to remember names to your tinc daemon(s).
|
||||
You could try things like hostnames, owner surnames or location names.
|
||||
.PP
|
||||
.SH "PUBLIC/PRIVATE KEYS"
|
||||
You should use \fBtincd --generate-keys\fR to generate public/private
|
||||
keypairs. It will generate two keys. The private
|
||||
key should be stored in a separate file \fI/etc/tinc/\fBnetname\fI/rsa_key.priv\fR
|
||||
\-\- where \fBnetname\fR stands for the network (See under \fBNETWORKS\fR)
|
||||
above. The public key should be stored in
|
||||
the host configuration file \fI/etc/tinc/\fBnetname\fI/hosts/\fBname\fR \-\- where \fBname\fR stands
|
||||
for the name of the local tinc daemon (See \fBNAMES\fR).
|
||||
.PP
|
||||
.SH "SERVER CONFIGURATION"
|
||||
.Sh PUBLIC/PRIVATE KEYS
|
||||
You should use
|
||||
.Ic tincd -K
|
||||
to generate public/private keypairs.
|
||||
It will generate two keys.
|
||||
The private key should be stored in a separate file
|
||||
.Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /rsa_key.priv
|
||||
\-\- where
|
||||
.Ar NETNAME
|
||||
stands for the network (see
|
||||
.Sx NETWORKS )
|
||||
above.
|
||||
The public key should be stored in the host configuration file
|
||||
.Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /hosts/ Ns Va NAME
|
||||
\-\- where
|
||||
.Va NAME
|
||||
stands for the name of the local tinc daemon (see
|
||||
.Sx NAMES ) .
|
||||
.Sh SERVER CONFIGURATION
|
||||
The server configuration of the daemon is done in the file
|
||||
\fI/etc/tinc/\fBnetname\fI/tinc.conf\fR.
|
||||
|
||||
This file consists of comments (lines started with a \fB#\fR) or
|
||||
assignments in the form of
|
||||
.PP
|
||||
.Vb 1
|
||||
\& \fIVariable \fB= \fIValue\fR.
|
||||
.Ve
|
||||
.PP
|
||||
.Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /tinc.conf .
|
||||
This file consists of comments (lines started with a
|
||||
.Li # )
|
||||
or assignments in the form of:
|
||||
.Pp
|
||||
.Va Variable Li = Ar Value .
|
||||
.Pp
|
||||
The variable names are case insensitive, and any spaces, tabs,
|
||||
newlines and carriage returns are ignored. \fINote\fR: it is not
|
||||
required that you put in the \fB=\fR sign, but doing so improves
|
||||
readability. If you leave it out, remember to replace it with at least
|
||||
one space character.
|
||||
.PP
|
||||
Here are all valid variables, listed in alphabetical order. The default
|
||||
value is given between parentheses.
|
||||
.TP
|
||||
\fBConnectTo\fR = <\fIname\fR>
|
||||
Specifies which host to connect to on startup. Multiple \fBConnectTo\fR variables
|
||||
may be specified, if connecting to the first one fails then tinc will try
|
||||
the next one, and so on. The names should be known to this tinc daemon
|
||||
(i.e., there should be a host configuration file for the name on the ConnectTo
|
||||
newlines and carriage returns are ignored.
|
||||
Note: it is not required that you put in the
|
||||
.Li =
|
||||
sign, but doing so improves readability.
|
||||
If you leave it out, remember to replace it with at least one space character.
|
||||
.Pp
|
||||
Here are all valid variables, listed in alphabetical order.
|
||||
The default value is given between parentheses.
|
||||
.Bl -tag -width indent
|
||||
.It Va BindToInterface Li = Ar interface Bq experimental
|
||||
If your computer has more than one network interface,
|
||||
.Nm tinc
|
||||
will by default listen on all of them for incoming connections.
|
||||
It is possible to bind only to a single interface with this variable.
|
||||
.Pp
|
||||
This option may not work on all platforms.
|
||||
.It Va BindToIP Li = Ar address Bq experimental
|
||||
If your computer has more than one IP address on a single interface
|
||||
(for example if you are running virtual hosts),
|
||||
.Nm tinc
|
||||
will by default listen on all of them for incoming connections.
|
||||
It is possible to bind only to a single IP address with this variable.
|
||||
It is still possible to listen on several interfaces at the same time though,
|
||||
if they share the same IP address.
|
||||
.Pp
|
||||
This option may not work on all platforms.
|
||||
.It Va ConnectTo Li = Ar name
|
||||
Specifies which other tinc daemon to connect to on startup.
|
||||
Multiple
|
||||
.Va ConnectTo
|
||||
variables may be specified;
|
||||
if connecting to the first one fails then tinc will try the next one, and so on.
|
||||
The names should be known to this tinc daemon
|
||||
(i.e., there should be a host configuration file for the name on the
|
||||
.Va ConnectTo
|
||||
line).
|
||||
|
||||
If you don't specify a host with \fBConnectTo\fR, tinc won't try to connect to other daemons at all,
|
||||
.Pp
|
||||
If you don't specify a host with
|
||||
.Va ConnectTo ,
|
||||
.Nm tinc
|
||||
won't try to connect to other daemons at all,
|
||||
and will instead just listen for incoming connections.
|
||||
.TP
|
||||
\fBHostnames\fR = <\fIyes|no\fR> (no)
|
||||
.It Va Device Li = Ar device Po /dev/tap0 or /dev/misc/net/tun Pc
|
||||
The virtual network device to use.
|
||||
.Nm tinc
|
||||
will automatically detect what kind of device it is.
|
||||
Note that you can only use one device per daemon.
|
||||
The info pages of the tinc package contain more information
|
||||
about configuring the virtual network device.
|
||||
.It Va Hostnames Li = yes | no Pq no
|
||||
This option selects whether IP addresses (both real and on the VPN) should
|
||||
be resolved. Since DNS lookups are blocking, it might affect tinc's
|
||||
efficiency, even stopping the daemon for a few seconds everytime it does
|
||||
efficiency, even stopping the daemon for a few seconds every time it does
|
||||
a lookup if your DNS server is not responding.
|
||||
|
||||
.Pp
|
||||
This does not affect resolving hostnames to IP addresses from the
|
||||
host configuration files.
|
||||
.TP
|
||||
\fBInterface\fR = <\fIdevice\fR>
|
||||
If you have more than one network interface in your computer, tinc will
|
||||
by default listen on all of them for incoming connections. It is
|
||||
possible to bind tinc to a single interface like eth0 or ppp0 with this
|
||||
variable.
|
||||
.TP
|
||||
\fBInterfaceIP\fR = <\fIlocal address\fR>
|
||||
If your computer has more than one IP address on a single interface (for
|
||||
example if you are running virtual hosts), tinc will by default listen
|
||||
on all of them for incoming connections. It is possible to bind tinc to
|
||||
a single IP address with this variable. It is still possible to listen
|
||||
on several interfaces at the same time though, if they share the same IP
|
||||
address.
|
||||
.TP
|
||||
\fBKeyExpire\fR = <\fIseconds\fR> (3600)
|
||||
This option controls the time the encryption keys used to encrypt the data
|
||||
are valid. It is common practice to change keys at regular intervals to
|
||||
make it even harder for crackers, even though it is thought to be nearly
|
||||
impossible to crack a single key.
|
||||
.TP
|
||||
\fBName\fR = <\fIname\fR> [required]
|
||||
This is the name which identifies this tinc daemon. It must be unique for
|
||||
the virtual private network this daemon will connect to.
|
||||
.TP
|
||||
\fBPingTimeout\fR = <\fIseconds\fR> (60)
|
||||
The number of seconds of inactivity that tinc will wait before sending a
|
||||
probe to the other end. If that other end doesn't answer within that
|
||||
same amount of seconds, the connection is terminated, and the others
|
||||
will be notified of this.
|
||||
.TP
|
||||
\fBPrivateKey\fR = <\fIkey\fR> [obsolete]
|
||||
The private RSA key of this tinc daemon. It will allow this tinc daemon to
|
||||
authenticate itself to other daemons.
|
||||
.TP
|
||||
\fBPrivateKeyFile\fR = <\fIfilename\fR> [recommended]
|
||||
.It Va Interface Li = Ar interface
|
||||
Defines the name of the interface corresponding to the virtual network device.
|
||||
Depending on the operating system and the type of device this may or may not actually set the name.
|
||||
Currently this option only affects the Linux tun/tap device.
|
||||
.It Va KeyExpire Li = Ar period Pq 3600
|
||||
This option controls the period the encryption keys used to encrypt the data are valid.
|
||||
It is common practice to change keys at regular intervals to make it even harder for crackers,
|
||||
even though it is thought to be nearly impossible to crack a single key.
|
||||
.It Va MaxTimeout Li = Ar period Pq 900
|
||||
This is the maximum delay before trying to reconnect to other tinc daemons.
|
||||
.It Va Mode Li = router | switch | hub Pq router
|
||||
This option selects the way packets are routed to other daemons.
|
||||
.Bl -tag -width indent
|
||||
.It router
|
||||
In this mode
|
||||
.Va Subnet
|
||||
variables in the host configuration files will be used to form a routing table.
|
||||
Only unicast packets of routable protocols (IPv4 and IPv6) are supported in this mode.
|
||||
.It switch
|
||||
In this mode the MAC addresses of the packets on the VPN will be used to
|
||||
dynamically create a routing table just like a network switch does.
|
||||
Unicast, multicast and broadcast packets of every Ethernet protocol are supported in this mode
|
||||
at the cost of frequent broadcast ARP requests and routing table updates.
|
||||
.It hub
|
||||
In this mode every packet will be broadcast to the other daemons.
|
||||
.El
|
||||
.It Va Name Li = Ar name Bq required
|
||||
This is the name which identifies this tinc daemon.
|
||||
It must be unique for the virtual private network this daemon will connect to.
|
||||
.It Va PingTimeout Li = Ar period Pq 60
|
||||
The number of seconds of inactivity that
|
||||
.Nm tinc
|
||||
will wait before sending a probe to the other end.
|
||||
If that other end doesn't answer within that same amount of time,
|
||||
the connection is terminated,
|
||||
and the others will be notified of this.
|
||||
.It Va PrivateKey Li = Ar key Bq obsolete
|
||||
The private RSA key of this tinc daemon.
|
||||
It will allow this tinc daemon to authenticate itself to other daemons.
|
||||
.It Va PrivateKeyFile Li = Ar filename Bq recommended
|
||||
The file in which the private RSA key of this tinc daemon resides.
|
||||
|
||||
Note that there must be exactly one of \fBPrivateKey\fR or \fBPrivateKeyFile\fR
|
||||
Note that there must be exactly one of
|
||||
.Va PrivateKey
|
||||
or
|
||||
.Va PrivateKeyFile
|
||||
specified in the configuration file.
|
||||
.TP
|
||||
\fBTapDevice\fR = <\fIdevice\fR> (/dev/tap0 or /dev/net/tun)
|
||||
The ethertap or tun/tap device to use. tinc will automatically detect what
|
||||
kind of tapdevice it is.
|
||||
Note that you can only use one device per
|
||||
daemon. The info pages of the tinc package contain more information
|
||||
about configuring an ethertap device for Linux.
|
||||
.PP
|
||||
.SH "HOST CONFIGURATION FILES"
|
||||
The host configuration files contain all information needed to establish a
|
||||
connection to those hosts. A host configuration file is also required for the
|
||||
local tinc daemon, it will use it to read in it's listen port, public key and
|
||||
subnets.
|
||||
|
||||
The idea is that these files are ``portable''. You can safely mail your own host
|
||||
configuration file to someone else. That other person can then copy it to his
|
||||
own hosts directory, and now his tinc daemon will be able to connect to your
|
||||
tinc daemon. Since host configuration files only contain public keys, no secrets
|
||||
are revealed by sending out this information.
|
||||
.PP
|
||||
.TP
|
||||
\fBAddress\fR = <\fIIP address\fR> [recommended]
|
||||
The real address or hostname of this tinc daemon.
|
||||
.TP
|
||||
\fBIndirectData\fR = <\fIyes\fR|\fIno\fR> (no) [experimental]
|
||||
This option specifies whether other tinc daemons besides the one you
|
||||
specified with ConnectTo can make a direct connection to you. This is
|
||||
especially useful if you are behind a firewall and it is impossible to
|
||||
make a connection from the outside to your tinc daemon. Otherwise, it
|
||||
is best to leave this option out or set it to no.
|
||||
.TP
|
||||
\fBPort\fR = <\fIport number\fR> (655)
|
||||
The port on which this tinc daemon is listening for incoming connections.
|
||||
.TP
|
||||
\fBPublicKey\fR = <\fIkey\fR> [obsolete]
|
||||
The public RSA key of this tinc daemon. It will be used to cryptographically
|
||||
verify it's identity and to set up a secure connection.
|
||||
.TP
|
||||
\fBPublicKeyFile\fR = <\fIfilename\fR> [obsolete]
|
||||
.El
|
||||
.Sh HOST CONFIGURATION FILES
|
||||
The host configuration files contain all information needed
|
||||
to establish a connection to those hosts.
|
||||
A host configuration file is also required for the local tinc daemon,
|
||||
it will use it to read in it's listen port, public key and subnets.
|
||||
.Pp
|
||||
The idea is that these files are portable.
|
||||
You can safely mail your own host configuration file to someone else.
|
||||
That other person can then copy it to his own hosts directory,
|
||||
and now his tinc daemon will be able to connect to your tinc daemon.
|
||||
Since host configuration files only contain public keys,
|
||||
no secrets are revealed by sending out this information.
|
||||
.Bl -tag -width indent
|
||||
.It Va Address Li = Ar address Bq recommended
|
||||
The IP address or hostname of this tinc daemon on the real network.
|
||||
.It Va Cipher Li = Ar cipher Pq blowfish
|
||||
The symmetric cipher algorithm used to encrypt UDP packets.
|
||||
Any cipher supported by OpenSSL is recognised.
|
||||
Furthermore, specifying
|
||||
.Qq none
|
||||
will turn off packet encryption.
|
||||
.It Va Digest Li = Ar digest Pq sha1
|
||||
The digest algorithm used to authenticate UDP packets.
|
||||
Any digest supported by OpenSSL is recognised.
|
||||
Furthermore, specifying
|
||||
.Qq none
|
||||
will turn off packet authentication.
|
||||
.It Va IndirectData Li = yes | no Po no Pc Bq experimental
|
||||
This option specifies whether other tinc daemons besides the one you specified with
|
||||
.Va ConnectTo
|
||||
can make a direct connection to you.
|
||||
This is especially useful if you are behind a firewall
|
||||
and it is impossible to make a connection from the outside to your tinc daemon.
|
||||
Otherwise, it is best to leave this option out or set it to no.
|
||||
.It Va MACLength Li = Ar length Pq 4
|
||||
The length of the message authentication code used to authenticate UDP packets.
|
||||
Can be anything from
|
||||
.Qq 0
|
||||
up to the length of the digest produced by the digest algorithm.
|
||||
.It Va Port Li = Ar port Pq 655
|
||||
The port number on which this tinc daemon is listening for incoming connections.
|
||||
.It Va PublicKey Li = Ar key Bq obsolete
|
||||
The public RSA key of this tinc daemon.
|
||||
It will be used to cryptographically verify it's identity and to set up a secure connection.
|
||||
.It Va PublicKeyFile Li = Ar filename Bq obsolete
|
||||
The file in which the public RSA key of this tinc daemon resides.
|
||||
|
||||
From version 1.0pre4 on tinc will store the public key directly into the
|
||||
host configuration file in PEM format, the above two options then are not
|
||||
necessary. Either the PEM format is used, or exactly
|
||||
one of the above two options must be specified
|
||||
in each host configuration file, if you want to be able to establish a
|
||||
connection with that host.
|
||||
.TP
|
||||
\fBSubnet\fR = <\fIaddress/masklength\fR>
|
||||
The subnet which this tinc daemon will serve. tinc tries to look up which other
|
||||
daemon it should send a packet to by searching the appropiate subnet. If the
|
||||
packet matches a subnet, it will be sent to the daemon who has this subnet in his
|
||||
host configuration file. Multiple subnet lines can be specified.
|
||||
|
||||
At the moment, this directive is only used in the host configuration file of
|
||||
the local tinc daemon itself. In upcoming versions of tinc, it will be possible to
|
||||
restrict other hosts in which subnets they server.
|
||||
|
||||
The subnets must be in a form like \fI192.168.1.0/24\fR, where 192.168.1.0 is the
|
||||
network address and 24 is the number of bits set in the netmask. Note that subnets
|
||||
like \fI192.168.1.1/24\fR are invalid! Read a networking howto/FAQ/guide if you
|
||||
don't understand this.
|
||||
.TP
|
||||
\fBTCPonly\fR = <\fIyes\fR|\fIno\fR> (no) [experimental]
|
||||
If this variable is set to yes, then the packets are tunnelled over a
|
||||
TCP connection instead of a UDP connection. This is especially useful
|
||||
for those who want to run a tinc daemon from behind a masquerading
|
||||
firewall, or if UDP packet routing is disabled somehow. This is
|
||||
experimental code, try this at your own risk. It may not work at all.
|
||||
.Pp
|
||||
From version 1.0pre4 on
|
||||
.Nm tinc
|
||||
will store the public key directly into the host configuration file in PEM format,
|
||||
the above two options then are not necessary.
|
||||
Either the PEM format is used, or exactly one of the above two options must be specified
|
||||
in each host configuration file,
|
||||
if you want to be able to establish a connection with that host.
|
||||
.It Va Subnet Li = Ar address Ns Op Li / Ns Ar masklength
|
||||
The subnet which this tinc daemon will serve.
|
||||
.Nm tinc
|
||||
tries to look up which other daemon it should send a packet to by searching the appropriate subnet.
|
||||
If the packet matches a subnet,
|
||||
it will be sent to the daemon who has this subnet in his host configuration file.
|
||||
Multiple subnet lines can be specified.
|
||||
.Pp
|
||||
Subnets can either be single MAC, IPv4 or IPv6 addresses,
|
||||
in which case a subnet consisting of only that single address is assumed,
|
||||
or they can be a IPv4 or IPv6 network address with a masklength.
|
||||
For example, IPv4 subnets must be in a form like 192.168.1.0/24,
|
||||
where 192.168.1.0 is the network address and 24 is the number of bits set in the netmask.
|
||||
Note that subnets like 192.168.1.1/24 are invalid!
|
||||
Read a networking HOWTO/FAQ/guide if you don't understand this.
|
||||
.It Va TCPOnly Li = yes | no Po no Pc Bq experimental
|
||||
If this variable is set to yes,
|
||||
then the packets are tunnelled over the TCP connection instead of a UDP connection.
|
||||
This is especially useful for those who want to run a tinc daemon
|
||||
from behind a masquerading firewall,
|
||||
or if UDP packet routing is disabled somehow.
|
||||
This is experimental code, try this at your own risk.
|
||||
It may not work at all.
|
||||
Setting this options also implicitly sets IndirectData.
|
||||
.SH "FILES"
|
||||
.TP
|
||||
\fI/etc/tinc/\fR
|
||||
.El
|
||||
.Sh FILES
|
||||
.Bl -tag -width indent
|
||||
.It Pa /etc/tinc/
|
||||
The top directory for configuration files.
|
||||
.TP
|
||||
\fI/etc/tinc/\fBnetname\fI/tinc.conf\fR
|
||||
.It Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /tinc.conf
|
||||
The default name of the server configuration file for net
|
||||
\fBnetname\fR.
|
||||
.TP
|
||||
\fI/etc/tinc/\fBnetname\fI/hosts/\fR
|
||||
.Ar NETNAME .
|
||||
.It Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /hosts/
|
||||
Host configuration files are kept in this directory.
|
||||
.TP
|
||||
\fI/etc/tinc/\fBnetname\fI/tinc-up\fR
|
||||
If an executable file with this name exists, it will be executed
|
||||
right after the tinc daemon has connected to the tap device. It can
|
||||
be used to ifconfig the network interface.
|
||||
|
||||
If the tapdevice is a tun/tap device, the evironment variable
|
||||
\fB$IFNAME\fR will be set to the name of the network interface.
|
||||
.TP
|
||||
\fI/etc/tinc/\fBnetname\fI/tinc-down\fR
|
||||
If an executable file with this name exists, it will be executed
|
||||
right before the tinc daemon is going to close it's connection to the
|
||||
tap device.
|
||||
.PP
|
||||
.SH "SEE ALSO"
|
||||
\fBtincd\fR(8)
|
||||
.TP
|
||||
\fBhttp://tinc.nl.linux.org/\fR
|
||||
.TP
|
||||
\fBhttp://www.linuxdoc.org/LDP/nag2/\fR
|
||||
.PP
|
||||
.It Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /tinc-up
|
||||
If an executable file with this name exists,
|
||||
it will be executed right after the tinc daemon has connected to the virtual network device.
|
||||
It can be used to set up the corresponding network interface.
|
||||
.Pp
|
||||
The environment variable
|
||||
.Ev NETNAME
|
||||
will be passed to the executable.
|
||||
If specified with the
|
||||
.Va Interface
|
||||
configuration variable,
|
||||
or if the virtual network device is a Linux tun/tap device,
|
||||
the environment variable
|
||||
.Ev INTERFACE
|
||||
will be set to the name of the network interface.
|
||||
.It Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /tinc-down
|
||||
If an executable file with this name exists,
|
||||
it will be executed right before the tinc daemon is going to close
|
||||
its connection to the virtual network device.
|
||||
The same environment variables will be passed as mentioned above.
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr tincd 8 ,
|
||||
.Pa http://tinc.nl.linux.org/ ,
|
||||
.Pa http://www.linuxdoc.org/LDP/nag2/ .
|
||||
.Pp
|
||||
The full documentation for
|
||||
.B tinc
|
||||
is maintained as a Texinfo manual. If the
|
||||
.B info
|
||||
and
|
||||
.B tinc
|
||||
programs are properly installed at your site, the command
|
||||
.IP
|
||||
.B info tinc
|
||||
.PP
|
||||
.Nm tinc
|
||||
is maintained as a Texinfo manual.
|
||||
If the info and tinc programs are properly installed at your site, the command
|
||||
.Ic info tinc
|
||||
should give you access to the complete manual.
|
||||
.PP
|
||||
tinc comes with ABSOLUTELY NO WARRANTY. This is free software,
|
||||
and you are welcome to redistribute it under certain conditions;
|
||||
.Pp
|
||||
.Nm tinc
|
||||
comes with ABSOLUTELY NO WARRANTY.
|
||||
This is free software, and you are welcome to redistribute it under certain conditions;
|
||||
see the file COPYING for details.
|
||||
|
|
470
doc/tinc.texi
470
doc/tinc.texi
|
@ -1,5 +1,5 @@
|
|||
\input texinfo @c -*-texinfo-*-
|
||||
@c $Id: tinc.texi,v 1.8.4.18 2001/05/25 12:45:37 guus Exp $
|
||||
@c $Id: tinc.texi,v 1.8.4.19 2002/02/10 21:57:51 guus Exp $
|
||||
@c %**start of header
|
||||
@setfilename tinc.info
|
||||
@settitle tinc Manual
|
||||
|
@ -7,17 +7,18 @@
|
|||
@c %**end of header
|
||||
|
||||
@ifinfo
|
||||
@dircategory Networking tools
|
||||
@direntry
|
||||
* tinc: (tinc). The tinc Manual.
|
||||
@end direntry
|
||||
|
||||
This is the info manual for tinc, a Virtual Private Network daemon.
|
||||
|
||||
Copyright @copyright{} 1998-2001 Ivo Timmermans
|
||||
Copyright @copyright{} 1998-2002 Ivo Timmermans
|
||||
<itimmermans@@bigfoot.com>, Guus Sliepen <guus@@sliepen.warande.net> and
|
||||
Wessel Dankers <wsl@@nl.linux.org>.
|
||||
|
||||
$Id: tinc.texi,v 1.8.4.18 2001/05/25 12:45:37 guus Exp $
|
||||
$Id: tinc.texi,v 1.8.4.19 2002/02/10 21:57:51 guus Exp $
|
||||
|
||||
Permission is granted to make and distribute verbatim copies of this
|
||||
manual provided the copyright notice and this permission notice are
|
||||
|
@ -38,11 +39,11 @@ permission notice identical to this one.
|
|||
@page
|
||||
@vskip 0pt plus 1filll
|
||||
@cindex copyright
|
||||
Copyright @copyright{} 1998-2001 Ivo Timmermans
|
||||
Copyright @copyright{} 1998-2002 Ivo Timmermans
|
||||
<itimmermans@@bigfoot.com>, Guus Sliepen <guus@@sliepen.warande.net> and
|
||||
Wessel Dankers <wsl@@nl.linux.org>.
|
||||
|
||||
$Id: tinc.texi,v 1.8.4.18 2001/05/25 12:45:37 guus Exp $
|
||||
$Id: tinc.texi,v 1.8.4.19 2002/02/10 21:57:51 guus Exp $
|
||||
|
||||
Permission is granted to make and distribute verbatim copies of this
|
||||
manual provided the copyright notice and this permission notice are
|
||||
|
@ -176,16 +177,14 @@ available too.
|
|||
@section Supported platforms
|
||||
|
||||
@cindex platforms
|
||||
tinc has been verified to work under Linux, FreeBSD and Solaris, with
|
||||
various hardware architectures. These are the three platforms
|
||||
that are supported by the universial TUN/TAP device driver, so if
|
||||
support for other operating systems is added to this driver, perhaps
|
||||
tinc will run on them as well. Without this driver, tinc will most
|
||||
tinc has been verified to work under Linux, FreeBSD, OpenBSD and Solaris, with
|
||||
various hardware architectures. These are some of the platforms
|
||||
that are supported by the universal tun/tap device driver or other virtual network device drivers.
|
||||
Without such a driver, tinc will most
|
||||
likely compile and run, but it will not be able to send or receive data
|
||||
packets.
|
||||
|
||||
@cindex release
|
||||
The official release only truly supports Linux.
|
||||
For an up to date list of supported platforms, please check the list on
|
||||
our website:
|
||||
@uref{http://tinc.nl.linux.org/platforms.html}.
|
||||
|
@ -202,24 +201,32 @@ and arbitrary word length. So in theory it should run on other
|
|||
processors that Linux runs on. It has already been verified to run on
|
||||
alpha and sparc processors as well.
|
||||
|
||||
tinc uses the ethertap device or the universal TUN/TAP driver. The former is provided in the standard kernel
|
||||
from version 2.1.60 up to 2.3.x, but has been replaced in favour of the TUN/TAP driver in kernel versions 2.4.0 and later.
|
||||
tinc uses the ethertap device or the universal tun/tap driver. The former is provided in the standard kernel
|
||||
from version 2.1.60 up to 2.3.x, but has been replaced in favour of the tun/tap driver in kernel versions 2.4.0 and later.
|
||||
|
||||
|
||||
@c ==================================================================
|
||||
@subsection FreeBSD
|
||||
|
||||
@cindex FreeBSD
|
||||
tinc on FreeBSD relies on the universial TUN/TAP driver for its data
|
||||
tinc on FreeBSD relies on the universal tun/tap driver for its data
|
||||
acquisition from the kernel. Therefore, tinc will work on the same platforms
|
||||
as this driver. These are: FreeBSD 3.x, 4.x, 5.x.
|
||||
|
||||
|
||||
@c ==================================================================
|
||||
@subsection OpenBSD
|
||||
|
||||
@cindex OpenBSD
|
||||
tinc on OpenBSD relies on the tun driver for its data
|
||||
acquisition from the kernel. It has been verified to work under at least OpenBSD 2.9.
|
||||
|
||||
|
||||
@c ==================================================================
|
||||
@subsection Solaris
|
||||
|
||||
@cindex Solaris
|
||||
tinc on Solaris relies on the universial TUN/TAP driver for its data
|
||||
tinc on Solaris relies on the universal tun/tap driver for its data
|
||||
acquisition from the kernel. Therefore, tinc will work on the same platforms
|
||||
as this driver. These are: Solaris, 2.1.x.
|
||||
|
||||
|
@ -278,6 +285,7 @@ you should read the @uref{http://howto.linuxberg.com/LDP/HOWTO/Kernel-HOWTO.html
|
|||
* Configuration of Linux kernels 2.1.60 up to 2.4.0::
|
||||
* Configuration of Linux kernels 2.4.0 and higher::
|
||||
* Configuration of FreeBSD kernels::
|
||||
* Configuration of OpenBSD kernels::
|
||||
* Configuration of Solaris kernels::
|
||||
@end menu
|
||||
|
||||
|
@ -329,18 +337,18 @@ Here are the options you have to turn on when configuring a new kernel:
|
|||
Code maturity level options
|
||||
[*] Prompt for development and/or incomplete code/drivers
|
||||
Network device support
|
||||
<M> Universal TUN/TAP device driver support
|
||||
<M> Universal tun/tap device driver support
|
||||
@end example
|
||||
|
||||
It's not necessary to compile this driver as a module, even if you are going to
|
||||
run more than one instance of tinc.
|
||||
|
||||
If you have an early 2.4 kernel, you can choose both the TUN/TAP driver and the
|
||||
If you have an early 2.4 kernel, you can choose both the tun/tap driver and the
|
||||
`Ethertap network tap' device. This latter is marked obsolete, and chances are
|
||||
that it won't even function correctly anymore. Make sure you select the
|
||||
universal TUN/TAP driver.
|
||||
universal tun/tap driver.
|
||||
|
||||
If you decide to build the TUN/TAP driver as a kernel module, add these lines
|
||||
If you decide to build the tun/tap driver as a kernel module, add these lines
|
||||
to @file{/etc/modules.conf}:
|
||||
|
||||
@example
|
||||
|
@ -349,24 +357,35 @@ alias char-major-10-200 tun
|
|||
|
||||
|
||||
@c ==================================================================
|
||||
@node Configuration of FreeBSD kernels, Configuration of Solaris kernels, Configuration of Linux kernels 2.4.0 and higher, Configuring the kernel
|
||||
@node Configuration of FreeBSD kernels, Configuration of OpenBSD kernels, Configuration of Linux kernels 2.4.0 and higher, Configuring the kernel
|
||||
@subsection Configuration of FreeBSD kernels
|
||||
|
||||
This section will contain information on how to configure your FreeBSD
|
||||
kernel to support the universal TUN/TAP device. For 5.0 and 4.1
|
||||
systems, this is included in the kernel configuration, for earlier
|
||||
systems (4.0 and 3.x), you need to install the universal TUN/TAP driver
|
||||
kernel to support the universal tun/tap device. For 4.1 and higher
|
||||
versions, this is included in the default kernel configuration, for earlier
|
||||
systems (4.0 and earlier), you need to install the universal tun/tap driver
|
||||
yourself.
|
||||
|
||||
Unfortunately somebody still has to write the text.
|
||||
|
||||
|
||||
@c ==================================================================
|
||||
@node Configuration of Solaris kernels, , Configuration of FreeBSD kernels, Configuring the kernel
|
||||
@node Configuration of OpenBSD kernels, Configuration of Solaris kernels, Configuration of FreeBSD kernels, Configuring the kernel
|
||||
@subsection Configuration of OpenBSD kernels
|
||||
|
||||
This section will contain information on how to configure your OpenBSD
|
||||
kernel to support the tun device. For 2.9 and 3.0 systems,
|
||||
this is included in the default kernel configuration.
|
||||
|
||||
Unfortunately somebody still has to write the text.
|
||||
|
||||
|
||||
@c ==================================================================
|
||||
@node Configuration of Solaris kernels, , Configuration of OpenBSD kernels, Configuring the kernel
|
||||
@subsection Configuration of Solaris kernels
|
||||
|
||||
This section will contain information on how to configure your Solaris
|
||||
kernel to support the universal TUN/TAP device. You need to install
|
||||
kernel to support the universal tun/tap device. You need to install
|
||||
this driver yourself.
|
||||
|
||||
Unfortunately somebody still has to write the text.
|
||||
|
@ -451,11 +470,11 @@ all other requirements of the GPL are met.
|
|||
@node Installation, Configuration, Preparations, Top
|
||||
@chapter Installation
|
||||
|
||||
If you use Redhat or Debian, you may want to install one of the
|
||||
If you use Debian, you may want to install one of the
|
||||
precompiled packages for your system. These packages are equipped with
|
||||
system startup scripts and sample configurations.
|
||||
|
||||
If you don't run either of these systems, or you want to compile tinc
|
||||
If you cannot use one of the precompiled packages, or you want to compile tinc
|
||||
for yourself, you can use the source. The source is distributed under
|
||||
the GNU General Public License (GPL). Download the source from the
|
||||
@uref{http://tinc.nl.linux.org/download.html, download page}, which has
|
||||
|
@ -528,7 +547,7 @@ chown 0.0 /dev/tap@emph{N}
|
|||
|
||||
There is a maximum of 16 ethertap devices.
|
||||
|
||||
If you use the universal TUN/TAP driver, you have to create the
|
||||
If you use the universal tun/tap driver, you have to create the
|
||||
following device file (unless it already exist):
|
||||
|
||||
@example
|
||||
|
@ -537,8 +556,8 @@ chown 0.0 /dev/tun
|
|||
@end example
|
||||
|
||||
If you use Linux, and you run the new 2.4 kernel using the devfs filesystem,
|
||||
then the TUN/TAP device will probably be automatically generated as
|
||||
@file{/dev/net/tun}.
|
||||
then the tun/tap device will probably be automatically generated as
|
||||
@file{/dev/misc/net/tun}.
|
||||
|
||||
Unlike the ethertap device, you do not need multiple device files if
|
||||
you are planning to run multiple tinc daemons.
|
||||
|
@ -617,7 +636,7 @@ A good resource on networking is the
|
|||
|
||||
If you have everything clearly pictured in your mind,
|
||||
proceed in the following order:
|
||||
First, generate the configuration files (tinc.conf, your host configuration file, tinc-up and perhaps tinc-down).
|
||||
First, generate the configuration files (@file{tinc.conf}, your host configuration file, @file{tinc-up} and perhaps @file{tinc-down}).
|
||||
Then generate the keypairs.
|
||||
Finally, distribute the host configuration files.
|
||||
These steps are described in the subsections below.
|
||||
|
@ -717,8 +736,28 @@ required directives are given in @strong{bold}.
|
|||
@subsection Main configuration variables
|
||||
|
||||
@table @asis
|
||||
@item @strong{ConnectTo = <name>}
|
||||
@cindex BindToInterface
|
||||
@item BindToInterface = <interface>
|
||||
If you have more than one network interface in your computer, tinc will
|
||||
by default listen on all of them for incoming connections. It is
|
||||
possible to bind tinc to a single interface like eth0 or ppp0 with this
|
||||
variable.
|
||||
|
||||
This option may not work on all platforms.
|
||||
|
||||
@cindex BindToIP
|
||||
@item BindToIP = <address>
|
||||
If your computer has more than one IP address on a single interface (for
|
||||
example if you are running virtual hosts), tinc will by default listen
|
||||
on all of them for incoming connections. It is possible to bind tinc to
|
||||
a single IP address with this variable. It is still possible to listen
|
||||
on several interfaces at the same time though, if they share the same IP
|
||||
address.
|
||||
|
||||
This option may not work on all platforms.
|
||||
|
||||
@cindex ConnectTo
|
||||
@item @strong{ConnectTo = <name>}
|
||||
Specifies which host to connect to on startup. Multiple ConnectTo
|
||||
variables may be specified, if connecting to the first one fails then
|
||||
tinc will try the next one, and so on. It is possible to specify
|
||||
|
@ -729,8 +768,13 @@ If you don't specify a host with ConnectTo, regardless of whether a
|
|||
value for ConnectPort is given, tinc won't connect at all, and will
|
||||
instead just listen for incoming connections.
|
||||
|
||||
@item Hostnames = <yes|no> (no)
|
||||
@cindex Device
|
||||
@item @strong{Device = <device>} (/dev/tap0 or /dev/misc/net/tun)
|
||||
The virtual network device to use. Note that you can only use one device per
|
||||
daemon. See also @ref{Device files}.
|
||||
|
||||
@cindex Hostnames
|
||||
@item Hostnames = <yes|no> (no)
|
||||
This option selects whether IP addresses (both real and on the VPN)
|
||||
should be resolved. Since DNS lookups are blocking, it might affect
|
||||
tinc's efficiency, even stopping the daemon for a few seconds everytime
|
||||
|
@ -739,57 +783,68 @@ it does a lookup if your DNS server is not responding.
|
|||
This does not affect resolving hostnames to IP addresses from the
|
||||
configuration file.
|
||||
|
||||
@item Interface = <device>
|
||||
@cindex Interface
|
||||
If you have more than one network interface in your computer, tinc will
|
||||
by default listen on all of them for incoming connections. It is
|
||||
possible to bind tinc to a single interface like eth0 or ppp0 with this
|
||||
variable.
|
||||
@item Interface = <interface>
|
||||
Defines the name of the interface corresponding to the virtual network device.
|
||||
Depending on the operating system and the type of device this may or may not actually set the name.
|
||||
Currently this option only affects the Linux tun/tap device.
|
||||
|
||||
@item InterfaceIP = <local address>
|
||||
@cindex InterfaceIP
|
||||
If your computer has more than one IP address on a single interface (for
|
||||
example if you are running virtual hosts), tinc will by default listen
|
||||
on all of them for incoming connections. It is possible to bind tinc to
|
||||
a single IP address with this variable. It is still possible to listen
|
||||
on several interfaces at the same time though, if they share the same IP
|
||||
address.
|
||||
@cindex Mode
|
||||
@item Mode = <router|switch|hub> (router)
|
||||
This option selects the way packets are routed to other daemons.
|
||||
|
||||
@table @asis
|
||||
@cindex router
|
||||
@item router
|
||||
In this mode Subnet
|
||||
variables in the host configuration files will be used to form a routing table.
|
||||
Only unicast packets of routable protocols (IPv4 and IPv6) are supported in this mode.
|
||||
|
||||
@cindex switch
|
||||
@item switch
|
||||
In this mode the MAC addresses of the packets on the VPN will be used to
|
||||
dynamically create a routing table just like a network switch does.
|
||||
Unicast, multicast and broadcast packets of every ethernet protocol are supported in this mode
|
||||
at the cost of frequent broadcast ARP requests and routing table updates.
|
||||
|
||||
@cindex hub
|
||||
@item hub
|
||||
In this mode every packet will be broadcast to the other daemons.
|
||||
@end table
|
||||
|
||||
@item KeyExpire = <seconds> (3600)
|
||||
@cindex KeyExpire
|
||||
@item KeyExpire = <seconds> (3600)
|
||||
This option controls the time the encryption keys used to encrypt the data
|
||||
are valid. It is common practice to change keys at regular intervals to
|
||||
make it even harder for crackers, even though it is thought to be nearly
|
||||
impossible to crack a single key.
|
||||
|
||||
@item @strong{Name = <name>}
|
||||
@cindex Name
|
||||
@item @strong{Name = <name>}
|
||||
This is a symbolic name for this connection. It can be anything
|
||||
|
||||
@item PingTimeout = <seconds> (60)
|
||||
@cindex PingTimeout
|
||||
@item PingTimeout = <seconds> (60)
|
||||
The number of seconds of inactivity that tinc will wait before sending a
|
||||
probe to the other end. If that other end doesn't answer within that
|
||||
same amount of seconds, the connection is terminated, and the others
|
||||
will be notified of this.
|
||||
|
||||
@item PrivateKey = <key> [obsolete]
|
||||
@cindex PrivateKey
|
||||
@item PrivateKey = <key> [obsolete]
|
||||
This is the RSA private key for tinc. However, for safety reasons it is
|
||||
advised to store private keys of any kind in separate files. This prevents
|
||||
accidental eavesdropping if you are editting the configuration file.
|
||||
|
||||
@item @strong{PrivateKeyFile = <path>} [recommended]
|
||||
@cindex PrivateKeyFile
|
||||
@item @strong{PrivateKeyFile = <path>} [recommended]
|
||||
This is the full path name of the RSA private key file that was
|
||||
generated by ``tincd --generate-keys''. It must be a full path, not a
|
||||
relative directory.
|
||||
|
||||
@item @strong{TapDevice = <device>} (/dev/tap0 or /dev/net/tun)
|
||||
@cindex TapDevice
|
||||
The ethertap device to use. Note that you can only use one device per
|
||||
daemon. The info pages of the tinc package contain more information
|
||||
about configuring an ethertap device for Linux.
|
||||
Note that there must be exactly one of PrivateKey
|
||||
or PrivateKeyFile
|
||||
specified in the configuration file.
|
||||
|
||||
@end table
|
||||
|
||||
|
@ -799,33 +854,50 @@ about configuring an ethertap device for Linux.
|
|||
@subsection Host configuration variables
|
||||
|
||||
@table @asis
|
||||
@item @strong{Address = <IP address|hostname>} [recommended]
|
||||
@cindex Address
|
||||
@item @strong{Address = <IP address|hostname>} [recommended]
|
||||
This variable is only required if you want to connect to this host. It
|
||||
must resolve to the external IP address where the host can be reached,
|
||||
not the one that is internal to the VPN.
|
||||
|
||||
@item IndirectData = <yes|no> (no) [experimental]
|
||||
@cindex Cipher
|
||||
@item Cipher = <cipher> (blowfish)
|
||||
The symmetric cipher algorithm used to encrypt UDP packets.
|
||||
Any cipher supported by OpenSSL is recognized.
|
||||
|
||||
@cindex Digest
|
||||
@item Digest = <digest> (sha1)
|
||||
The digest algorithm used to authenticate UDP packets.
|
||||
Any digest supported by OpenSSL is recognized.
|
||||
Furthermore, specifying "none" will turn off packet authentication.
|
||||
|
||||
@cindex IndirectData
|
||||
@item IndirectData = <yes|no> (no) [experimental]
|
||||
This option specifies whether other tinc daemons besides the one you
|
||||
specified with ConnectTo can make a direct connection to you. This is
|
||||
especially useful if you are behind a firewall and it is impossible to
|
||||
make a connection from the outside to your tinc daemon. Otherwise, it
|
||||
is best to leave this option out or set it to no.
|
||||
|
||||
@item Port = <port> (655)
|
||||
@cindex MACLength
|
||||
@item MACLength = <length> (4)
|
||||
The length of the message authentication code used to authenticate UDP packets.
|
||||
Can be anything from 0
|
||||
up to the length of the digest produced by the digest algorithm.
|
||||
|
||||
@cindex Port
|
||||
@item Port = <port> (655)
|
||||
Connect to the upstream host (given with the ConnectTo directive) on
|
||||
port port. port may be given in decimal (default), octal (when preceded
|
||||
by a single zero) o hexadecimal (prefixed with 0x). port is the port
|
||||
number for both the UDP and the TCP (meta) connections.
|
||||
|
||||
@item PublicKey = <key> [obsolete]
|
||||
@cindex PublicKey
|
||||
@item PublicKey = <key> [obsolete]
|
||||
This is the RSA public key for this host.
|
||||
|
||||
@item PublicKeyFile = <path> [obsolete]
|
||||
@cindex PublicKeyFile
|
||||
@item PublicKeyFile = <path> [obsolete]
|
||||
This is the full path name of the RSA public key file that was generated
|
||||
by ``tincd --generate-keys''. It must be a full path, not a relative
|
||||
directory.
|
||||
|
@ -838,22 +910,29 @@ necessary. Either the PEM format is used, or exactly
|
|||
in each host configuration file, if you want to be able to establish a
|
||||
connection with that host.
|
||||
|
||||
@item Subnet = <IP address/maskbits>
|
||||
@cindex Subnet
|
||||
This is the subnet range of all IP addresses that will be accepted by
|
||||
the host that defines it.
|
||||
@item Subnet = <address[/masklength]>
|
||||
The subnet which this tinc daemon will serve.
|
||||
tinc tries to look up which other daemon it should send a packet to by searching the appropiate subnet.
|
||||
If the packet matches a subnet,
|
||||
it will be sent to the daemon who has this subnet in his host configuration file.
|
||||
Multiple subnet lines can be specified for each daemon.
|
||||
|
||||
The range must be contained in the IP address range of the tap device,
|
||||
not the real IP address of the host running tincd.
|
||||
Subnets can either be single MAC, IPv4 or IPv6 addresses,
|
||||
in which case a subnet consisting of only that single address is assumed,
|
||||
or they can be a IPv4 or IPv6 network address with a masklength.
|
||||
For example, IPv4 subnets must be in a form like 192.168.1.0/24,
|
||||
where 192.168.1.0 is the network address and 24 is the number of bits set in the netmask.
|
||||
Note that subnets like 192.168.1.1/24 are invalid!
|
||||
|
||||
@cindex CIDR notation
|
||||
maskbits is the number of bits set to 1 in the netmask part; for
|
||||
masklength is the number of bits set to 1 in the netmask part; for
|
||||
example: netmask 255.255.255.0 would become /24, 255.255.252.0 becomes
|
||||
/22. This conforms to standard CIDR notation as described in
|
||||
@uref{ftp://ftp.isi.edu/in-notes/rfc1519.txt, RFC1519}
|
||||
|
||||
@item TCPonly = <yes|no> (no) [experimental]
|
||||
@cindex TCPonly
|
||||
@item TCPonly = <yes|no> (no) [experimental]
|
||||
If this variable is set to yes, then the packets are tunnelled over a
|
||||
TCP connection instead of a UDP connection. This is especially useful
|
||||
for those who want to run a tinc daemon from behind a masquerading
|
||||
|
@ -874,7 +953,7 @@ Adapt the following example to create a basic configuration file:
|
|||
|
||||
@example
|
||||
Name = @emph{yourname}
|
||||
TapDevice = @emph{/dev/tap0}
|
||||
Device = @emph{/dev/tap0}
|
||||
PrivateKeyFile = /etc/tinc/@emph{netname}/rsa_key.priv
|
||||
@end example
|
||||
|
||||
|
@ -919,37 +998,39 @@ Just press enter to accept the defaults.
|
|||
@section Network interfaces
|
||||
|
||||
Before tinc can start transmitting data over the tunnel, it must
|
||||
set up the ethertap network devices.
|
||||
set up the virtual network interface.
|
||||
|
||||
First, decide which IP addresses you want to have associated with these
|
||||
devices, and what network mask they must have.
|
||||
|
||||
tinc will open an ethertap device or TUN/TAP device, which will also
|
||||
create a network interface called `tap0', or `tap1', and so on if you are using
|
||||
the ethertap driver, or a network interface with the same name as netname
|
||||
if you are using the universal TUN/TAP driver.
|
||||
tinc will open a virtual network device (@file{/dev/tun}, @file{/dev/tap0} or similar),
|
||||
which will also create a network interface called something like `tun0', `tap0', or,
|
||||
if you are using the Linux tun/tap driver, the network interface will by default have the same name as the netname.
|
||||
|
||||
@cindex tinc-up
|
||||
You can configure that device by putting ordinary ifconfig, route, and other commands
|
||||
You can configure the network interface by putting ordinary ifconfig, route, and other commands
|
||||
to a script named @file{/etc/tinc/netname/tinc-up}. When tinc starts, this script
|
||||
will be executed. When tinc exits, it will execute the script named
|
||||
@file{/etc/tinc/netname/tinc-down}, but normally you don't need to create that script.
|
||||
|
||||
An example @file{tinc-up} script when using the TUN/TAP driver:
|
||||
An example @file{tinc-up} script:
|
||||
|
||||
@example
|
||||
#!/bin/sh
|
||||
ifconfig $NETNAME hw ether fe:fd:00:00:00:00
|
||||
ifconfig $NETNAME @emph{xx}.@emph{xx}.@emph{xx}.@emph{xx} netmask @emph{mask}
|
||||
ifconfig $NETNAME -arp
|
||||
ifconfig $INTERFACE hw ether fe:fd:0:0:0:0
|
||||
ifconfig $INTERFACE 192.168.1.1 netmask 255.255.0.0
|
||||
ifconfig $INTERFACE -arp
|
||||
@end example
|
||||
|
||||
@cindex MAC address
|
||||
@cindex hardware address
|
||||
The first line sets up the MAC address of the network interface.
|
||||
Due to the nature of how Ethernet and tinc work, it has to be set to fe:fd:00:00:00:00.
|
||||
(tinc versions prior to 1.0pre3 required that the MAC address matched the IP address.)
|
||||
You can use the environment variable $NETNAME to get the name of the interface.
|
||||
Due to the nature of how Ethernet and tinc work, it has to be set to fe:fd:0:0:0:0
|
||||
for tinc to work in it's normal mode.
|
||||
If you configured tinc to work in `switch' or `hub' mode, the hardware address should instead
|
||||
be set to a unique address instead of fe:fd:0:0:0:0.
|
||||
|
||||
You can use the environment variable $INTERFACE to get the name of the interface.
|
||||
If you are using the ethertap driver however, you need to replace it with tap@emph{N},
|
||||
corresponding to the device file name.
|
||||
|
||||
|
@ -964,7 +1045,8 @@ own subnet.
|
|||
|
||||
@cindex arp
|
||||
The last line tells the kernel not to use ARP on that interface.
|
||||
Again this has to do with how Ethernet and tinc work. Don't forget to add this line.
|
||||
Again this has to do with how Ethernet and tinc work.
|
||||
Use this option only if you are running tinc under Linux and are using tinc's normal routing mode.
|
||||
|
||||
|
||||
@c ==================================================================
|
||||
|
@ -1010,7 +1092,7 @@ In @file{/etc/tinc/company/tinc-up}:
|
|||
# Real interface of internal network:
|
||||
# ifconfig eth0 10.1.54.1 netmask 255.255.0.0 broadcast 10.1.255.255
|
||||
|
||||
ifconfig tap0 hw ether fe:fd:00:00:00:00
|
||||
ifconfig tap0 hw ether fe:fd:0:0:0:0
|
||||
ifconfig tap0 10.1.54.1 netmask 255.0.0.0
|
||||
ifconfig tap0 -arp
|
||||
@end example
|
||||
|
@ -1020,7 +1102,7 @@ and in @file{/etc/tinc/company/tinc.conf}:
|
|||
@example
|
||||
Name = BranchA
|
||||
PrivateKey = /etc/tinc/company/rsa_key.priv
|
||||
TapDevice = /dev/tap0
|
||||
Device = /dev/tap0
|
||||
@end example
|
||||
|
||||
On all hosts, /etc/tinc/company/hosts/BranchA contains:
|
||||
|
@ -1048,7 +1130,7 @@ In @file{/etc/tinc/company/tinc-up}:
|
|||
# Real interface of internal network:
|
||||
# ifconfig eth0 10.2.43.8 netmask 255.255.0.0 broadcast 10.2.255.255
|
||||
|
||||
ifconfig tap0 hw ether fe:fd:00:00:00:00
|
||||
ifconfig tap0 hw ether fe:fd:0:0:0:0
|
||||
ifconfig tap0 10.2.1.12 netmask 255.0.0.0
|
||||
ifconfig tap0 -arp
|
||||
@end example
|
||||
|
@ -1085,7 +1167,7 @@ In @file{/etc/tinc/company/tinc-up}:
|
|||
# Real interface of internal network:
|
||||
# ifconfig eth0 10.3.69.254 netmask 255.255.0.0 broadcast 10.3.255.255
|
||||
|
||||
ifconfig tap1 hw ether fe:fd:00:00:00:00
|
||||
ifconfig tap1 hw ether fe:fd:0:0:0:0
|
||||
ifconfig tap1 10.3.69.254 netmask 255.0.0.0
|
||||
ifconfig tap1 -arp
|
||||
@end example
|
||||
|
@ -1095,7 +1177,7 @@ and in @file{/etc/tinc/company/tinc.conf}:
|
|||
@example
|
||||
Name = BranchC
|
||||
ConnectTo = BranchA
|
||||
TapDevice = /dev/tap1
|
||||
Device = /dev/tap1
|
||||
@end example
|
||||
|
||||
C already has another daemon that runs on port 655, so they have to
|
||||
|
@ -1133,13 +1215,13 @@ and in @file{/etc/tinc/company/tinc.conf}:
|
|||
@example
|
||||
Name = BranchD
|
||||
ConnectTo = BranchC
|
||||
TapDevice = /dev/net/tun
|
||||
Device = /dev/misc/net/tun
|
||||
PrivateKeyFile = /etc/tinc/company/rsa_key.priv
|
||||
@end example
|
||||
|
||||
D will be connecting to C, which has a tincd running for this network on
|
||||
port 2000. It knows the port number from the host configuration file.
|
||||
Also note that since D uses the TUN/TAP driver, the network interface
|
||||
Also note that since D uses the tun/tap driver, the network interface
|
||||
will not be called `tun' or `tap0' or something like that, but will
|
||||
have the same name as netname.
|
||||
|
||||
|
@ -1211,33 +1293,19 @@ generated automatically, so may be more up-to-date.
|
|||
@cindex options
|
||||
@c from the manpage
|
||||
@table @samp
|
||||
@item --bypass-security
|
||||
Disables encryption and authentication.
|
||||
Only useful for debugging.
|
||||
|
||||
@item -c, --config=PATH
|
||||
Read configuration options from the directory PATH. The default is
|
||||
@file{/etc/tinc/netname/}.
|
||||
|
||||
@cindex debug level
|
||||
@item -d
|
||||
Increase debug level. The higher it gets, the more gets
|
||||
@item -d, --debug=LEVEL
|
||||
Set debug level to LEVEL. The higher the debug level, the more gets
|
||||
logged. Everything goes via syslog.
|
||||
|
||||
0 is the default, only some basic information connection attempts get
|
||||
logged. Setting it to 1 will log a bit more, still not very
|
||||
disturbing. With two -d's tincd will log protocol information, which can
|
||||
get pretty noisy. Three or more -d's will output every single packet
|
||||
that goes out or comes in, which probably generates more data than the
|
||||
packets themselves.
|
||||
|
||||
@item -k, --kill
|
||||
Attempt to kill a running tincd and exit. A TERM signal (15) gets sent
|
||||
to the daemon that his its PID in /var/run/tinc.pid.
|
||||
|
||||
Because it kills only one tinc daemon, you should use -n here if you
|
||||
started it that way. It will then read the PID from
|
||||
@file{/var/run/tinc.NETNAME.pid}.
|
||||
|
||||
@item -n, --net=NETNAME
|
||||
Connect to net NETNAME. @xref{Multiple networks}.
|
||||
|
||||
@item -K, --generate-keys[=BITS]
|
||||
Generate public/private keypair of BITS length. If BITS is not specified,
|
||||
1024 is the default. tinc will ask where you want to store the files,
|
||||
|
@ -1247,6 +1315,18 @@ in combination with -K). After that, tinc will quit.
|
|||
@item --help
|
||||
Display a short reminder of these runtime options and terminate.
|
||||
|
||||
@item -k, --kill
|
||||
Attempt to kill a running tincd and exit. A TERM signal (15) gets sent
|
||||
to the daemon that his its PID in @file{/var/run/tinc.NETNAME.pid}.
|
||||
Use it in conjunction with the -n option to make sure you kill the right tinc daemon.
|
||||
|
||||
@item -n, --net=NETNAME
|
||||
Connect to net NETNAME. @xref{Multiple networks}.
|
||||
|
||||
@item -D, --no-detach
|
||||
Don't fork and detach.
|
||||
This will also disable the automatic restart mechanism for fatal errors.
|
||||
|
||||
@item --version
|
||||
Output version information and exit.
|
||||
|
||||
|
@ -1269,7 +1349,7 @@ only, so keep an eye on it!
|
|||
@item You forgot to compile `Netlink device emulation' in the kernel.
|
||||
@end itemize
|
||||
|
||||
@item Can't write to /dev/net/tun: No such device
|
||||
@item Can't write to /dev/misc/net/tun: No such device
|
||||
|
||||
@itemize
|
||||
@item You forgot to `modprobe tun'.
|
||||
|
@ -1280,10 +1360,10 @@ only, so keep an eye on it!
|
|||
|
||||
@itemize
|
||||
@item Something is not configured right. Packets are being sent out to the
|
||||
tap device, but according to the Subnet directives in your host configuration
|
||||
virtual network device, but according to the Subnet directives in your host configuration
|
||||
file, those packets should go to your own host. Most common mistake is that
|
||||
you have a Subnet line in your host configuration file with a netmask which is
|
||||
just as large as the netmask of the tap device. The latter should in almost all
|
||||
just as large as the netmask of the virtual network interface. The latter should in almost all
|
||||
cases be larger. Rethink your configuration.
|
||||
Note that you will only see this message if you specified a debug
|
||||
level of 5 or higher!
|
||||
|
@ -1300,7 +1380,7 @@ Jan 1 12:00:00 host tinc.net[1234]: Read packet of length 46 from tap device
|
|||
Jan 1 12:00:00 host tinc.net[1234]: Trying to look up 0.0.192.168 in connection list failed!
|
||||
@end example
|
||||
@itemize
|
||||
@item Add the `ifconfig $NETNAME -arp' to tinc-up.
|
||||
@item Add the `ifconfig $INTERFACE -arp' to tinc-up.
|
||||
@end itemize
|
||||
|
||||
@item Network address and subnet mask do not match!
|
||||
|
@ -1360,10 +1440,10 @@ computer over the existing Internet infrastructure.
|
|||
@node The UDP tunnel, The meta-connection, The connection, The connection
|
||||
@subsection The UDP tunnel
|
||||
|
||||
@cindex ethertap
|
||||
@cindex virtual network device
|
||||
@cindex frame type
|
||||
The data itself is read from a character device file, the so-called
|
||||
@emph{ethertap} device. This device is associated with a network
|
||||
@emph{virtual network device}. This device is associated with a network
|
||||
interface. Any data sent to this interface can be read from the device,
|
||||
and any data written to the device gets sent from the interface. Data to
|
||||
and from the device is formatted as if it were a normal Ethernet card,
|
||||
|
@ -1371,32 +1451,35 @@ so a frame is preceded by two MAC addresses and a @emph{frame type}
|
|||
field.
|
||||
|
||||
So when tinc reads an Ethernet frame from the device, it determines its
|
||||
type. Right now, tinc can only handle Internet Protocol version 4 (IPv4)
|
||||
frames, because it needs IP headers for routing.
|
||||
Plans to support other protocols and switching instead of routing are being made.
|
||||
(Some code for IPv6 routing and switching is already present but nonfunctional.)
|
||||
When tinc knows
|
||||
which type of frame it has read, it can also read the source and
|
||||
destination address from it.
|
||||
type. When tinc is in it's default routing mode, it can handle IPv4 and IPv6
|
||||
packets. Depending on the Subnet lines, it will send the packets off to their destination.
|
||||
In the `switch' and `hub' mode, tinc will use broadcasts and MAC address discovery
|
||||
to deduce the destination of the packets.
|
||||
Since the latter modes only depend on the link layer information,
|
||||
any protocol that runs over Ethernet is supported (for instance IPX and Appletalk).
|
||||
|
||||
Now it is time that the frame gets encrypted. Currently the only
|
||||
encryption algorithm available is blowfish.
|
||||
After the destination has been determined, a sequence number will be added to the packet.
|
||||
The packet will then be encrypted and a message authentication
|
||||
code will be appended.
|
||||
|
||||
@cindex encapsulating
|
||||
@cindex UDP
|
||||
When the encryption is ready, time has come to actually transport the
|
||||
When that is done, time has come to actually transport the
|
||||
packet to the destination computer. We do this by sending the packet
|
||||
over an UDP connection to the destination host. This is called
|
||||
@emph{encapsulating}, the VPN packet (though now encrypted) is
|
||||
encapsulated in another IP datagram.
|
||||
|
||||
When the destination receives this packet, the same thing happens, only
|
||||
in reverse. So it does a decrypt on the contents of the UDP datagram,
|
||||
and it writes the decrypted information to its own ethertap device.
|
||||
in reverse. So it checks the message authentication code, decrypts the contents of the UDP datagram,
|
||||
checks the sequence number
|
||||
and writes the decrypted information to its own virtual network device.
|
||||
|
||||
To let the kernel on the receiving end accept the packet, the destination MAC
|
||||
address must match that of the tap interface. Because of the routing nature
|
||||
of tinc, ARP is not possible. tinc solves this by always overwriting the
|
||||
address must match that of the virtual network interface.
|
||||
If tinc is in it's default routing mode, ARP does not work, so the correct destination MAC cannot be set
|
||||
by the sending daemons.
|
||||
tinc solves this by always overwriting the
|
||||
destination MAC address with fe:fd:0:0:0:0. That is also the reason why you must
|
||||
set the MAC address of your tap interface to that address.
|
||||
|
||||
|
@ -1451,32 +1534,35 @@ daemon and to read and write requests by hand, provided that one
|
|||
understands the numeric codes sent.
|
||||
|
||||
The authentication scheme is described in @ref{Authentication protocol}. After a
|
||||
succesful authentication, the server and the client will exchange all the
|
||||
successful authentication, the server and the client will exchange all the
|
||||
information about other tinc daemons and subnets they know of, so that both
|
||||
sides (and all the other tinc daemons behind them) have their information
|
||||
synchronised.
|
||||
|
||||
@cindex ADD_HOST
|
||||
@cindex ADD_EDGE
|
||||
@cindex ADD_SUBNET
|
||||
@example
|
||||
daemon message
|
||||
--------------------------------------------------------------------------
|
||||
origin ADD_HOST daemon a329e18c:655 0
|
||||
| | +--> options
|
||||
| +---------> real address:port
|
||||
+-------------------> name of new tinc daemon
|
||||
origin ADD_SUBNET daemon 1,0a010100/ffffff00
|
||||
| | | +--> netmask
|
||||
| | +----------> vpn IPv4 network address
|
||||
| +----------------> subnet type (1=IPv4)
|
||||
+--------------------> owner of this subnet
|
||||
origin ADD_EDGE node1 12.23.34.45 655 node2 21.32.43.54 655 222 0
|
||||
| | | \___________________/ | +-> options
|
||||
| | | | +----> weight
|
||||
| | | +----------------> see below
|
||||
| | +--> UDP port
|
||||
| +----------> real address
|
||||
+------------------> name of node on one side of the edge
|
||||
|
||||
origin ADD_SUBNET node 192.168.1.0/24
|
||||
| | +--> masklength
|
||||
| +--------> IPv4 network address
|
||||
+------------------> owner of this subnet
|
||||
--------------------------------------------------------------------------
|
||||
@end example
|
||||
|
||||
@cindex DEL_HOST
|
||||
@cindex DEL_SUBNET
|
||||
In case daemons leave the VPN, DEL_HOST and DEL_SUBNET messages with exactly
|
||||
the same syntax are sent to inform the other daemons of the departure.
|
||||
@cindex DEL_EDGE
|
||||
In case a connection between two daemons is closed or broken, DEL_EDGE messages
|
||||
are sent to inform the other daemons of that fact. Each daemon will calculate a
|
||||
new route to the the daemons, or mark them unreachable if there isn't any.
|
||||
|
||||
The keys used to encrypt VPN packets are not sent out directly. This is
|
||||
because it would generate a lot of traffic on VPNs with many daemons, and
|
||||
|
@ -1484,7 +1570,7 @@ chances are that not every tinc daemon will ever send a packet to every
|
|||
other daemon. Instead, if a daemon needs a key it sends a request for it
|
||||
via the meta connection of the nearest hop in the direction of the
|
||||
destination. If any hop on the way has already learned the key, it will
|
||||
act as a proxy and forward it's copy back to the requestor.
|
||||
act as a proxy and forward its copy back to the requester.
|
||||
|
||||
@cindex REQ_KEY
|
||||
@cindex ANS_KEY
|
||||
|
@ -1495,11 +1581,15 @@ daemon message
|
|||
daemon REQ_KEY origin destination
|
||||
| +--> name of the tinc daemon it wants the key from
|
||||
+----------> name of the daemon that wants the key
|
||||
daemon ANS_KEY origin destination e4ae0b0a82d6e0078179b5290c62c7d0
|
||||
| | \______________________________/
|
||||
| | +--> 128 bits key
|
||||
|
||||
daemon ANS_KEY origin destination 4ae0b0a82d6e0078 91 64 4
|
||||
| | \______________/ | | +--> MAC length
|
||||
| | | | +-----> digest algorithm
|
||||
| | | +--------> cipher algorithm
|
||||
| | +--> 128 bits key
|
||||
| +--> name of the daemon that wants the key
|
||||
+----------> name of the daemon that uses this key
|
||||
|
||||
daemon KEY_CHANGED origin
|
||||
+--> daemon that has changed it's packet key
|
||||
--------------------------------------------------------------------------
|
||||
|
@ -1518,12 +1608,8 @@ messages without any other traffic won't result in known plaintext.
|
|||
@example
|
||||
daemon message
|
||||
--------------------------------------------------------------------------
|
||||
origin PING 9e76
|
||||
\__/
|
||||
+--> 2 bytes of salt (random data)
|
||||
dest. PONG 3b8d
|
||||
\__/
|
||||
+--> 2 bytes of salt (random data)
|
||||
origin PING
|
||||
dest. PONG
|
||||
--------------------------------------------------------------------------
|
||||
@end example
|
||||
|
||||
|
@ -1546,9 +1632,8 @@ the tinc project after TINC.
|
|||
But in order to be ``immune'' to eavesdropping, you'll have to encrypt
|
||||
your data. Because tinc is a @emph{Secure} VPN (SVPN) daemon, it does
|
||||
exactly that: encrypt.
|
||||
tinc uses blowfish encryption in CBC mode and a small amount of salt
|
||||
at the beginning of each packet to make sure eavesdroppers cannot get
|
||||
any information at all from the packets they can intercept.
|
||||
tinc uses blowfish encryption in CBC mode, sequence numbers and message authentication codes
|
||||
to make sure eavesdroppers cannot get and cannot change any information at all from the packets they can intercept.
|
||||
|
||||
@menu
|
||||
* Authentication protocol::
|
||||
|
@ -1565,6 +1650,11 @@ A new scheme for authentication in tinc has been devised, which offers some
|
|||
improvements over the protocol used in 1.0pre2 and 1.0pre3. Explanation is
|
||||
below.
|
||||
|
||||
@cindex ID
|
||||
@cindex META_KEY
|
||||
@cindex CHALLENGE
|
||||
@cindex CHAL_REPLY
|
||||
@cindex ACK
|
||||
@example
|
||||
daemon message
|
||||
--------------------------------------------------------------------------
|
||||
|
@ -1572,15 +1662,13 @@ client <attempts connection>
|
|||
|
||||
server <accepts connection>
|
||||
|
||||
client ID client 10 0
|
||||
| | +-> options
|
||||
| +---> version
|
||||
+--------> name of tinc daemon
|
||||
client ID client 12
|
||||
| +---> version
|
||||
+-------> name of tinc daemon
|
||||
|
||||
server ID server 10 0
|
||||
| | +-> options
|
||||
| +---> version
|
||||
+--------> name of tinc daemon
|
||||
server ID server 12
|
||||
| +---> version
|
||||
+-------> name of tinc daemon
|
||||
|
||||
client META_KEY 5f0823a93e35b69e...7086ec7866ce582b
|
||||
\_________________________________/
|
||||
|
@ -1593,8 +1681,8 @@ server META_KEY 6ab9c1640388f8f0...45d1a07f8a672630
|
|||
encrypted with client's public RSA key
|
||||
|
||||
From now on:
|
||||
- the client will encrypt outgoing traffic using S1
|
||||
- the server will encrypt outgoing traffic using S2
|
||||
- the client will symmetrically encrypt outgoing traffic using S1
|
||||
- the server will symmetrically encrypt outgoing traffic using S2
|
||||
|
||||
client CHALLENGE da02add1817c1920989ba6ae2a49cecbda0
|
||||
\_________________________________/
|
||||
|
@ -1609,6 +1697,21 @@ client CHAL_REPLY 816a86
|
|||
|
||||
server CHAL_REPLY 928ffe
|
||||
+-> 160 bits SHA1 of H1
|
||||
|
||||
After the correct challenge replies are received, both ends have proved
|
||||
their identity. Further information is exchanged.
|
||||
|
||||
client ACK 655 12.23.34.45 123 0
|
||||
| | | +-> options
|
||||
| | +----> estimated weight
|
||||
| +------------> IP address of server as seen by client
|
||||
+--------------------> UDP port of client
|
||||
|
||||
server ACK 655 21.32.43.54 321 0
|
||||
| | | +-> options
|
||||
| | +----> estimated weight
|
||||
| +------------> IP address of client as seen by server
|
||||
+--------------------> UDP port of server
|
||||
--------------------------------------------------------------------------
|
||||
@end example
|
||||
|
||||
|
@ -1662,35 +1765,26 @@ an attacker) in the beginning of the encrypted stream.
|
|||
A data packet can only be sent if the encryption key is known to both
|
||||
parties, and the connection is activated. If the encryption key is not
|
||||
known, a request is sent to the destination using the meta connection
|
||||
to retreive it. The packet is stored in a queue while waiting for the
|
||||
to retrieve it. The packet is stored in a queue while waiting for the
|
||||
key to arrive.
|
||||
|
||||
@cindex UDP
|
||||
The UDP packet containing the network packet from the VPN has the following layout:
|
||||
|
||||
@example
|
||||
... | IP header | UDP header | salt | VPN packet | UDP trailer
|
||||
\___________________/
|
||||
|
|
||||
V
|
||||
... | IP header | UDP header | seqno | VPN packet | MAC | UDP trailer
|
||||
\___________________/\_____/
|
||||
| |
|
||||
V +---> digest algorithm
|
||||
Encrypted with symmetric cipher
|
||||
@end example
|
||||
|
||||
So, the entire UDP payload is encrypted using a symmetric cipher (blowfish in CBC mode).
|
||||
2 bytes of salt (random data) are added in front of the actual VPN packet,
|
||||
so that two VPN packets with (almost) the same content do not seem to be
|
||||
the same for eavesdroppers.
|
||||
2 bytes of salt may not seem much, but you can encrypt 65536 identical packets
|
||||
now without an attacker being able to see that they were identical.
|
||||
Given a MTU of 1500 this means 96 Megabyte of data.
|
||||
|
||||
There is no @emph{extra} provision against replay attacks or alteration of packets.
|
||||
However, the VPN packets, normally UDP or TCP packets themselves, contain
|
||||
checksums and sequence numbers.
|
||||
Since those checksums and sequence numbers are encrypted,
|
||||
they automatically become @emph{cryptographically secure}.
|
||||
The kernel will handle any checksum errors and duplicate packets.
|
||||
|
||||
So, the entire VPN packet is encrypted using a symmetric cipher. A 32 bits
|
||||
sequence number is added in front of the actual VPN packet, to act as a unique
|
||||
IV for each packet and to prevent replay attacks. A message authentication code
|
||||
is added to the UDP packet to prevent alteration of packets. By default the
|
||||
first 4 bytes of the digest are used for this, but this can be changed using
|
||||
the MACLength configuration variable.
|
||||
|
||||
@c ==================================================================
|
||||
@node About us, Concept Index, Technical information, Top
|
||||
|
|
287
doc/tincd.8
287
doc/tincd.8
|
@ -1,153 +1,170 @@
|
|||
.TH TINCD 8 "Jan 2001" "tinc version 1.0pre4" "FSF"
|
||||
.SH NAME
|
||||
tincd \- tinc VPN daemon
|
||||
.SH SYNOPSIS
|
||||
.B tincd
|
||||
[\fIoption\fR]...
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
|
||||
This is the daemon of tinc, a secure virtual private
|
||||
network (VPN) project. When started, tincd will read
|
||||
it's configuration file to determine what virtual subnets
|
||||
it has to serve and to what other tinc daemons it should connect.
|
||||
It will connect to the ethertap or tun/tap device and set up a socket
|
||||
for incoming connections.
|
||||
Optionally a script will be executed to further configure the tap device.
|
||||
If that succeeds, it will detach from the controlling terminal and
|
||||
continue in the background, accepting and setting up connections to other
|
||||
tinc daemons that are part of the virtual private network.
|
||||
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
\fB\-c\fR, \fB\-\-config\fR=\fIDIR\fR
|
||||
Read configuration options from DIR.
|
||||
.TP
|
||||
\fB\-D\fR, \fB\-\-no\-detach\fR
|
||||
Don't fork and detach. This will also disable the automatic
|
||||
restart mechanism for fatal errors.
|
||||
.TP
|
||||
\fB\-d\fR
|
||||
Increase debug level (see below).
|
||||
.TP
|
||||
\fB\-k\fR, \fB\-\-kill\fR
|
||||
Attempt to kill a running tincd and exit.
|
||||
.TP
|
||||
\fB\-n\fR, \fB\-\-net\fR=\fInetname\fR
|
||||
Connect to net `netname'.
|
||||
.TP
|
||||
\fB\-K\fR, \fB\-\-generate-keys\fR[=\fIBITS]\fR
|
||||
Generate public/private RSA keypair and exit. If BITS is omitted,
|
||||
the default length will be 1024 bits.
|
||||
.TP
|
||||
\fB\-\-help\fR
|
||||
.Dd 2002-02-07
|
||||
.Dt TINCD 8
|
||||
.\" Manual page created by:
|
||||
.\" Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
.\" Guus Sliepen <guus@sliepen.warande.net>
|
||||
.Sh NAME
|
||||
.Nm tincd
|
||||
.Nd tinc VPN daemon
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl cdDkKn
|
||||
.Op Fl -bypass-security
|
||||
.Op Fl -config Ns = Ns Ar DIR
|
||||
.Op Fl -debug Ns = Ns Ar LEVEL
|
||||
.Op Fl -generate-keys Ns Op = Ns Ar BITS
|
||||
.Op Fl -help
|
||||
.Op Fl -kill Ns = Ns Ar SIGNAL
|
||||
.Op Fl -net Ns = Ns Ar NETNAME
|
||||
.Op Fl -no-detach
|
||||
.Op Fl -version
|
||||
.Sh DESCRIPTION
|
||||
This is the daemon of tinc, a secure virtual private network (VPN) project.
|
||||
When started,
|
||||
.Nm
|
||||
will read it's configuration file to determine what virtual subnets it has to serve
|
||||
and to what other tinc daemons it should connect.
|
||||
It will connect to the ethertap or tun/tap device
|
||||
and set up a socket for incoming connections.
|
||||
Optionally a script will be executed to further configure the virtual device.
|
||||
If that succeeds,
|
||||
it will detach from the controlling terminal and continue in the background,
|
||||
accepting and setting up connections to other tinc daemons
|
||||
that are part of the virtual private network.
|
||||
.Sh OPTIONS
|
||||
.Bl -tag -width indent
|
||||
.It Fl -bypass-security
|
||||
Disables encryption and authentication.
|
||||
Only useful for debugging.
|
||||
.It Fl c, -config Ns = Ns Ar DIR
|
||||
Read configuration options from
|
||||
.Ar DIR .
|
||||
.It Fl d, -debug Ns Op = Ns Ar LEVEL
|
||||
Increase debug level or set it to
|
||||
.Ar LEVEL
|
||||
(see below).
|
||||
.It Fl K, -generate-keys Ns Op = Ns Ar BITS
|
||||
Generate public/private RSA keypair and exit.
|
||||
If
|
||||
.Ar BITS
|
||||
is omitted, the default length will be 1024 bits.
|
||||
.It Fl -help
|
||||
Display short list of options.
|
||||
.TP
|
||||
\fB\-\-version\fR
|
||||
.It Fl k, -kill Ns Op = Ns Ar SIGNAL
|
||||
Attempt to kill a running
|
||||
.Nm
|
||||
(optionally with the specified
|
||||
.Ar SIGNAL
|
||||
instead of SIGQUIT) and exit.
|
||||
.It Fl n, -net Ns = Ns Ar NETNAME
|
||||
Connect to net
|
||||
.Ar NETNAME .
|
||||
.It Fl D, -no-detach
|
||||
Don't fork and detach.
|
||||
This will also disable the automatic restart mechanism for fatal errors.
|
||||
.It Fl -version
|
||||
Output version information and exit.
|
||||
.PP
|
||||
.SH "SIGNALS"
|
||||
.TP
|
||||
\fBHUP\fR
|
||||
.El
|
||||
.Sh SIGNALS
|
||||
.Bl -tag -width indent
|
||||
.It ALRM
|
||||
Forces
|
||||
.Nm
|
||||
to try to connect to all uplinks immediately.
|
||||
Usually
|
||||
.Nm
|
||||
attempts to do this itself,
|
||||
but increases the time it waits between the attempts each time it failed,
|
||||
and if
|
||||
.Nm
|
||||
didn't succeed to connect to an uplink the first time after it started,
|
||||
it defaults to the maximum time of 15 minutes.
|
||||
.It HUP
|
||||
Closes all connections, rereads the configuration file and restarts the daemon.
|
||||
.TP
|
||||
\fBINT\fR
|
||||
Closes all connections and quits.
|
||||
.TP
|
||||
\fBUSR1\fR
|
||||
.It INT
|
||||
Temporarily increases debug level to 5.
|
||||
Send this signal again to revert to the original level.
|
||||
.It USR1
|
||||
Dumps the connection list to syslog.
|
||||
.TP
|
||||
\fBUSR2\fR
|
||||
Dumps the subnet list to syslog.
|
||||
.TP
|
||||
\fBALRM\fR
|
||||
Forces tincd to try to connect to an uplink immediately. Usually tincd attempts
|
||||
to do this itself, but increases the time it waits between the attempts each time
|
||||
it failed, and if tincd didn't succeed to connect to an uplink the first time after
|
||||
it started, it defaults to the maximum time of 15 minutes.
|
||||
.PP
|
||||
.SH "DEBUG LEVELS"
|
||||
The tinc daemon can send a lot of messages to the syslog. The more \fB\-d\fR options are
|
||||
given to tincd, the more messages it will log. Each level inherits all messages of the
|
||||
previous level:
|
||||
.TP
|
||||
\fIno debug options\fR
|
||||
This will log a message indicating tincd has started along with a version number.
|
||||
.It USR2
|
||||
Dumps virtual network device statistics, all known nodes, edges and subnets to syslog.
|
||||
.It WINCH
|
||||
Purges all information remembered about unreachable nodes.
|
||||
.El
|
||||
.Sh DEBUG LEVELS
|
||||
The tinc daemon can send a lot of messages to the syslog.
|
||||
The higher the debug level,
|
||||
the more messages it will log.
|
||||
Each level inherits all messages of the previous level:
|
||||
.Bl -tag -width indent
|
||||
.It 0
|
||||
This will log a message indicating
|
||||
.Nm
|
||||
has started along with a version number.
|
||||
It will also any serious error.
|
||||
.TP
|
||||
\fB\-d\fR
|
||||
.It 1
|
||||
This will log all connections that are made with other tinc daemons.
|
||||
.TP
|
||||
\fB\-dd\fR
|
||||
.It 2
|
||||
This will log status and error messages from other tinc daemons.
|
||||
.TP
|
||||
\fB\-ddd\fR
|
||||
.It 3
|
||||
This will log all requests that are exchanged with other tinc daemons. These include
|
||||
authentication, key exchange and connection list updates.
|
||||
.TP
|
||||
\fB\-dddd\fR
|
||||
.It 4
|
||||
This will log a copy of everything received on the meta socket.
|
||||
.TP
|
||||
\fB\-ddddd\fR
|
||||
.It 5
|
||||
This will log all network traffic over the virtual private network.
|
||||
.PP
|
||||
.SH "FILES"
|
||||
.TP
|
||||
\fI/etc/tinc/\fBnetname\fI/tinc.conf\fR
|
||||
The configuration file for tincd.
|
||||
.TP
|
||||
\fI/etc/tinc/\fBnetname\fI/tinc-up\fR
|
||||
Script which is executed as soon as a tap device has been allocated.
|
||||
.El
|
||||
.Sh FILES
|
||||
.Bl -tag -width indent
|
||||
.It Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /tinc.conf
|
||||
The configuration file for
|
||||
.Nm .
|
||||
.It Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /tinc-up
|
||||
Script which is executed as soon as the virtual network device has been allocated.
|
||||
Purpose is to further configure that device.
|
||||
.TP
|
||||
\fI/etc/tinc/\fBnetname\fI/tinc-down\fR
|
||||
Script which is executed when tinc quits.
|
||||
Purpose is to shut down the tap device.
|
||||
.TP
|
||||
\fI/etc/tinc/\fBnetname\fI/hosts/*\fR
|
||||
.It Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /tinc-down
|
||||
Script which is executed when
|
||||
.Nm
|
||||
exits.
|
||||
Purpose is to cleanly shut down the virtual network device before it will be deallocated.
|
||||
.It Pa /etc/tinc/ Ns Ar NETNAME Ns Pa /hosts/*
|
||||
The directory containing the host configuration files
|
||||
used to authenticate other tinc daemons.
|
||||
.TP
|
||||
\fI/var/run/tinc.\fBnetname\fI.pid\fR
|
||||
The PID of the currently running tincd is stored in this file.
|
||||
.PP
|
||||
.SH "BUGS"
|
||||
The TCPonly and IndirectData options may not work correctly.
|
||||
.PP
|
||||
\fBThe cryptography in tinc is not well tested yet. Use it at your own risk!\fR
|
||||
.PP
|
||||
If you find any bugs, report them to tinc@nl.linux.org.
|
||||
.PP
|
||||
.SH "TODO"
|
||||
A lot, especially security auditting.
|
||||
.PP
|
||||
.SH "SEE ALSO"
|
||||
\fBtinc.conf\fR(5)
|
||||
.TP
|
||||
\fBhttp://tinc.nl.linux.org/\fR
|
||||
.TP
|
||||
\fBhttp://www.cabal.org/\fR
|
||||
.PP
|
||||
The full documentation for
|
||||
.B tinc
|
||||
is maintained as a Texinfo manual. If the
|
||||
.B info
|
||||
.It Pa /var/run/tinc. Ns Ar NETNAME Ns Pa .pid
|
||||
The PID of the currently running
|
||||
.Nm
|
||||
is stored in this file.
|
||||
.El
|
||||
.Sh BUGS
|
||||
The
|
||||
.Va BindToInterface ,
|
||||
.Va BindToIP ,
|
||||
.Va IndirectData
|
||||
and
|
||||
.B tinc
|
||||
programs are properly installed at your site, the command
|
||||
.IP
|
||||
.B info tinc
|
||||
.PP
|
||||
.Va TCPOnly
|
||||
options may not work correctly.
|
||||
.Pp
|
||||
.Sy The cryptography in tinc is not well tested yet. Use it at your own risk!
|
||||
.Pp
|
||||
If you find any bugs, report them to tinc@nl.linux.org.
|
||||
.Sh TODO
|
||||
A lot, especially security auditing.
|
||||
.Sh SEE ALSO
|
||||
.Xr tinc.conf 5 ,
|
||||
.Pa http://tinc.nl.linux.org/ ,
|
||||
.Pa http://www.cabal.org/ .
|
||||
.Pp
|
||||
The full documentation for tinc is maintained as a Texinfo manual.
|
||||
If the info and tinc programs are properly installed at your site,
|
||||
the command
|
||||
.Ic info tinc
|
||||
should give you access to the complete manual.
|
||||
.PP
|
||||
tinc comes with ABSOLUTELY NO WARRANTY. This is free software,
|
||||
and you are welcome to redistribute it under certain conditions;
|
||||
.Pp
|
||||
tinc comes with ABSOLUTELY NO WARRANTY.
|
||||
This is free software, and you are welcome to redistribute it under certain conditions;
|
||||
see the file COPYING for details.
|
||||
.SH "AUTHORS"
|
||||
.na
|
||||
.nf
|
||||
Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
Guus Sliepen <guus@sliepen.warande.net>
|
||||
|
||||
.Sh AUTHORS
|
||||
.An "Ivo Timmermans" Aq itimmermans@bigfoot.com
|
||||
.An "Guus Sliepen" Aq guus@sliepen.warande.net
|
||||
.Pp
|
||||
And thanks to many others for their contributions to tinc!
|
||||
.PP
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
library for inclusion into tinc (http://tinc.nl.linux.org/) by
|
||||
Guus Sliepen <guus@sliepen.warande.net>.
|
||||
|
||||
$Id: avl_tree.c,v 1.1.2.7 2001/02/27 16:50:29 guus Exp $
|
||||
$Id: avl_tree.c,v 1.1.2.8 2002/02/10 21:57:51 guus Exp $
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
@ -597,6 +597,15 @@ void avl_unlink_node(avl_tree_t *tree, avl_node_t *node)
|
|||
}
|
||||
|
||||
avl_rebalance(tree, balnode);
|
||||
|
||||
node->next = node->prev = node->parent = node->left = node->right = NULL;
|
||||
|
||||
#ifdef AVL_COUNT
|
||||
node->count = 0;
|
||||
#endif
|
||||
#ifdef AVL_DEPTH
|
||||
node->depth = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
void avl_delete_node(avl_tree_t *tree, avl_node_t *node)
|
||||
|
|
187
lib/dropin.c
187
lib/dropin.c
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: dropin.c,v 1.1.2.7 2001/11/16 17:36:56 zarq Exp $
|
||||
$Id: dropin.c,v 1.1.2.8 2002/02/10 21:57:51 guus Exp $
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
@ -169,188 +169,3 @@ int asprintf(char **buf, const char *fmt, ...)
|
|||
return status;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* fake library for ssh
|
||||
*
|
||||
* This file is included in getaddrinfo.c and getnameinfo.c.
|
||||
* See getaddrinfo.c and getnameinfo.c.
|
||||
*/
|
||||
|
||||
/* $Id: dropin.c,v 1.1.2.7 2001/11/16 17:36:56 zarq Exp $ */
|
||||
|
||||
/* for old netdb.h */
|
||||
#ifndef EAI_NODATA
|
||||
#define EAI_NODATA 1
|
||||
#define EAI_MEMORY 2
|
||||
#endif
|
||||
|
||||
/*
|
||||
* fake library for ssh
|
||||
*
|
||||
* This file includes getaddrinfo(), freeaddrinfo() and gai_strerror().
|
||||
* These funtions are defined in rfc2133.
|
||||
*
|
||||
* But these functions are not implemented correctly. The minimum subset
|
||||
* is implemented for ssh use only. For exapmle, this routine assumes
|
||||
* that ai_family is AF_INET. Don't use it for another purpose.
|
||||
*/
|
||||
|
||||
#ifndef HAVE_GAI_STRERROR
|
||||
char *gai_strerror(int ecode)
|
||||
{
|
||||
switch (ecode) {
|
||||
case EAI_NODATA:
|
||||
return "no address associated with hostname.";
|
||||
case EAI_MEMORY:
|
||||
return "memory allocation failure.";
|
||||
default:
|
||||
return "unknown error.";
|
||||
}
|
||||
}
|
||||
#endif /* !HAVE_GAI_STRERROR */
|
||||
|
||||
#ifndef HAVE_FREEADDRINFO
|
||||
void freeaddrinfo(struct addrinfo *ai)
|
||||
{
|
||||
struct addrinfo *next;
|
||||
|
||||
do {
|
||||
next = ai->ai_next;
|
||||
free(ai);
|
||||
} while (NULL != (ai = next));
|
||||
}
|
||||
#endif /* !HAVE_FREEADDRINFO */
|
||||
|
||||
#ifndef HAVE_GETADDRINFO
|
||||
static struct addrinfo *malloc_ai(int port, u_long addr)
|
||||
{
|
||||
struct addrinfo *ai;
|
||||
|
||||
ai = malloc(sizeof(struct addrinfo) + sizeof(struct sockaddr_in));
|
||||
if (ai == NULL)
|
||||
return(NULL);
|
||||
|
||||
memset(ai, 0, sizeof(struct addrinfo) + sizeof(struct sockaddr_in));
|
||||
|
||||
ai->ai_addr = (struct sockaddr *)(ai + 1);
|
||||
/* XXX -- ssh doesn't use sa_len */
|
||||
ai->ai_addrlen = sizeof(struct sockaddr_in);
|
||||
ai->ai_addr->sa_family = ai->ai_family = AF_INET;
|
||||
|
||||
((struct sockaddr_in *)(ai)->ai_addr)->sin_port = port;
|
||||
((struct sockaddr_in *)(ai)->ai_addr)->sin_addr.s_addr = addr;
|
||||
|
||||
return(ai);
|
||||
}
|
||||
|
||||
int getaddrinfo(const char *hostname, const char *servname,
|
||||
const struct addrinfo *hints, struct addrinfo **res)
|
||||
{
|
||||
struct addrinfo *cur, *prev = NULL;
|
||||
struct hostent *hp;
|
||||
struct in_addr in;
|
||||
int i, port;
|
||||
|
||||
if (servname)
|
||||
port = htons(atoi(servname));
|
||||
else
|
||||
port = 0;
|
||||
|
||||
if (hints && hints->ai_flags & AI_PASSIVE) {
|
||||
if (NULL != (*res = malloc_ai(port, htonl(0x00000000))))
|
||||
return 0;
|
||||
else
|
||||
return EAI_MEMORY;
|
||||
}
|
||||
|
||||
if (!hostname) {
|
||||
if (NULL != (*res = malloc_ai(port, htonl(0x7f000001))))
|
||||
return 0;
|
||||
else
|
||||
return EAI_MEMORY;
|
||||
}
|
||||
|
||||
if (inet_aton(hostname, &in)) {
|
||||
if (NULL != (*res = malloc_ai(port, in.s_addr)))
|
||||
return 0;
|
||||
else
|
||||
return EAI_MEMORY;
|
||||
}
|
||||
|
||||
hp = gethostbyname(hostname);
|
||||
if (hp && hp->h_name && hp->h_name[0] && hp->h_addr_list[0]) {
|
||||
for (i = 0; hp->h_addr_list[i]; i++) {
|
||||
cur = malloc_ai(port, ((struct in_addr *)hp->h_addr_list[i])->s_addr);
|
||||
if (cur == NULL) {
|
||||
if (*res)
|
||||
freeaddrinfo(*res);
|
||||
return EAI_MEMORY;
|
||||
}
|
||||
|
||||
if (prev)
|
||||
prev->ai_next = cur;
|
||||
else
|
||||
*res = cur;
|
||||
|
||||
prev = cur;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
return EAI_NODATA;
|
||||
}
|
||||
#endif /* !HAVE_GETADDRINFO */
|
||||
|
||||
|
||||
/*
|
||||
* fake library for ssh
|
||||
*
|
||||
* This file includes getnameinfo().
|
||||
* These funtions are defined in rfc2133.
|
||||
*
|
||||
* But these functions are not implemented correctly. The minimum subset
|
||||
* is implemented for ssh use only. For exapmle, this routine assumes
|
||||
* that ai_family is AF_INET. Don't use it for another purpose.
|
||||
*/
|
||||
|
||||
#ifndef HAVE_GETNAMEINFO
|
||||
int getnameinfo(const struct sockaddr *sa, size_t salen, char *host,
|
||||
size_t hostlen, char *serv, size_t servlen, int flags)
|
||||
{
|
||||
struct sockaddr_in *sin = (struct sockaddr_in *)sa;
|
||||
struct hostent *hp;
|
||||
char tmpserv[16];
|
||||
|
||||
if (serv) {
|
||||
snprintf(tmpserv, sizeof(tmpserv), "%d", ntohs(sin->sin_port));
|
||||
if (strlen(tmpserv) >= servlen)
|
||||
return EAI_MEMORY;
|
||||
else
|
||||
strcpy(serv, tmpserv);
|
||||
}
|
||||
|
||||
if (host) {
|
||||
if (flags & NI_NUMERICHOST) {
|
||||
if (strlen(inet_ntoa(sin->sin_addr)) >= hostlen)
|
||||
return EAI_MEMORY;
|
||||
|
||||
strcpy(host, inet_ntoa(sin->sin_addr));
|
||||
return 0;
|
||||
} else {
|
||||
hp = gethostbyaddr((char *)&sin->sin_addr,
|
||||
sizeof(struct in_addr), AF_INET);
|
||||
if (hp == NULL)
|
||||
return EAI_NODATA;
|
||||
|
||||
if (strlen(hp->h_name) >= hostlen)
|
||||
return EAI_MEMORY;
|
||||
|
||||
strcpy(host, hp->h_name);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif /* !HAVE_GETNAMEINFO */
|
||||
|
|
51
lib/dropin.h
51
lib/dropin.h
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: dropin.h,v 1.1.2.5 2001/11/16 17:37:08 zarq Exp $
|
||||
$Id: dropin.h,v 1.1.2.6 2002/02/10 21:57:51 guus Exp $
|
||||
*/
|
||||
|
||||
#ifndef __DROPIN_H__
|
||||
|
@ -35,53 +35,4 @@ extern char* get_current_dir_name(void);
|
|||
extern int asprintf(char **, const char *, ...);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_STRUCT_ADDRINFO
|
||||
struct addrinfo {
|
||||
int ai_flags; /* AI_PASSIVE, AI_CANONNAME */
|
||||
int ai_family; /* PF_xxx */
|
||||
int ai_socktype; /* SOCK_xxx */
|
||||
int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
|
||||
size_t ai_addrlen; /* length of ai_addr */
|
||||
char *ai_canonname; /* canonical name for hostname */
|
||||
struct sockaddr *ai_addr; /* binary address */
|
||||
struct addrinfo *ai_next; /* next structure in linked list */
|
||||
};
|
||||
#endif /* !HAVE_STRUCT_ADDRINFO */
|
||||
|
||||
#ifndef HAVE_GETADDRINFO
|
||||
int getaddrinfo(const char *hostname, const char *servname,
|
||||
const struct addrinfo *hints, struct addrinfo **res);
|
||||
#endif /* !HAVE_GETADDRINFO */
|
||||
|
||||
#ifndef HAVE_GAI_STRERROR
|
||||
char *gai_strerror(int ecode);
|
||||
#endif /* !HAVE_GAI_STRERROR */
|
||||
|
||||
#ifndef HAVE_FREEADDRINFO
|
||||
void freeaddrinfo(struct addrinfo *ai);
|
||||
#endif /* !HAVE_FREEADDRINFO */
|
||||
|
||||
#ifndef HAVE_GETNAMEINFO
|
||||
int getnameinfo(const struct sockaddr *sa, size_t salen, char *host,
|
||||
size_t hostlen, char *serv, size_t servlen, int flags);
|
||||
#endif /* !HAVE_GETNAMEINFO */
|
||||
|
||||
#ifndef NI_MAXSERV
|
||||
# define NI_MAXSERV 32
|
||||
#endif /* !NI_MAXSERV */
|
||||
#ifndef NI_MAXHOST
|
||||
# define NI_MAXHOST 1025
|
||||
#endif /* !NI_MAXHOST */
|
||||
|
||||
#ifndef AI_PASSIVE
|
||||
# define AI_PASSIVE 1
|
||||
# define AI_CANONNAME 2
|
||||
#endif
|
||||
|
||||
#ifndef NI_NUMERICHOST
|
||||
# define NI_NUMERICHOST 2
|
||||
# define NI_NAMEREQD 4
|
||||
# define NI_NUMERICSERV 8
|
||||
#endif
|
||||
|
||||
#endif /* __DROPIN_H__ */
|
||||
|
|
|
@ -31,6 +31,14 @@ AC_DEFUN(tinc_OPENSSL,
|
|||
|
||||
AC_CHECK_FUNCS(RAND_pseudo_bytes)
|
||||
|
||||
AC_CHECK_FUNC(OpenSSL_add_all_algorithms,
|
||||
[],
|
||||
AC_CHECK_FUNC(SSLeay_add_all_algorithms,
|
||||
[AC_DEFINE(HAVE_SSLEAY_ADD_ALL_ALGORITHMS)],
|
||||
[AC_MSG_ERROR("Missing required OpenSSL functionality!")]
|
||||
)
|
||||
)
|
||||
|
||||
AC_CHECK_FUNC(dlopen,
|
||||
[],
|
||||
AC_CHECK_LIB(dl, dlopen,
|
||||
|
|
|
@ -11,7 +11,19 @@ src/meta.c
|
|||
src/net.c
|
||||
src/netutl.c
|
||||
src/protocol.c
|
||||
src/protocol_auth.c
|
||||
src/protocol_edge.c
|
||||
src/protocol_key.c
|
||||
src/protocol_misc.c
|
||||
src/protocol_subnet.c
|
||||
src/subnet.c
|
||||
src/tincd.c
|
||||
src/process.c
|
||||
src/route.c
|
||||
src/node.c
|
||||
src/edge.c
|
||||
src/graph.c
|
||||
src/linux/device.c
|
||||
src/freebsd/device.c
|
||||
src/openbsd/device.c
|
||||
src/solaris/device.c
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
EXTRA_DIST = tinc tinc.spec
|
|
@ -1,14 +1,17 @@
|
|||
## Produce this file with automake to get Makefile.in
|
||||
# $Id: Makefile.am,v 1.4.4.18 2001/11/16 12:16:28 zarq Exp $
|
||||
# $Id: Makefile.am,v 1.4.4.19 2002/02/10 21:57:52 guus Exp $
|
||||
|
||||
sbin_PROGRAMS = tincd
|
||||
|
||||
tincd_SOURCES = conf.c connection.c device.c edge.c graph.c meta.c net.c node.c process.c \
|
||||
protocol.c route.c subnet.c tincd.c
|
||||
EXTRA_DIST = linux/device.c freebsd/device.c openbsd/device.c solaris/device.c
|
||||
|
||||
tincd_SOURCES = conf.c connection.c device.c edge.c event.c graph.c meta.c net.c netutl.c node.c process.c \
|
||||
protocol.c protocol_auth.c protocol_edge.c protocol_misc.c protocol_key.c protocol_subnet.c \
|
||||
route.c subnet.c tincd.c
|
||||
|
||||
INCLUDES = @INCLUDES@ -I$(top_builddir) -I$(top_srcdir)/lib -I$(top_srcdir)/intl
|
||||
|
||||
noinst_HEADERS = conf.h connection.h device.h edge.h graph.h meta.h net.h node.h process.h \
|
||||
noinst_HEADERS = conf.h connection.h device.h edge.h event.h graph.h meta.h net.h netutl.h node.h process.h \
|
||||
protocol.h route.h subnet.h
|
||||
|
||||
LIBS = @LIBS@ @INTLLIBS@
|
||||
|
|
86
src/conf.c
86
src/conf.c
|
@ -1,8 +1,8 @@
|
|||
/*
|
||||
conf.c -- configuration code
|
||||
Copyright (C) 1998 Robert van der Meulen
|
||||
1998-2001 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
2000,2001 Guus Sliepen <guus@sliepen.warande.net>
|
||||
1998-2002 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
2000-2002 Guus Sliepen <guus@sliepen.warande.net>
|
||||
2000 Cris van Pelt <tribbel@arise.dhs.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
|
@ -19,7 +19,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: conf.c,v 1.9.4.51 2001/11/16 22:31:41 zarq Exp $
|
||||
$Id: conf.c,v 1.9.4.52 2002/02/10 21:57:53 guus Exp $
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
@ -42,19 +42,17 @@
|
|||
#include <avl_tree.h>
|
||||
|
||||
#include "conf.h"
|
||||
#include "netutl.h" /* for str2address */
|
||||
|
||||
#include "system.h"
|
||||
|
||||
avl_tree_t *config_tree;
|
||||
|
||||
int debug_lvl = 0;
|
||||
int timeout = 0; /* seconds before timeout */
|
||||
int pingtimeout = 0; /* seconds before timeout */
|
||||
char *confbase = NULL; /* directory in which all config files are */
|
||||
char *netname = NULL; /* name of the vpn network */
|
||||
|
||||
/* Will be set if HUP signal is received. It will be processed when it is safe. */
|
||||
int sighup = 0;
|
||||
|
||||
int config_compare(config_t *a, config_t *b)
|
||||
{
|
||||
int result;
|
||||
|
@ -202,6 +200,41 @@ cp
|
|||
return 1;
|
||||
}
|
||||
|
||||
int get_config_address(config_t *cfg, ipv4_t **result)
|
||||
{
|
||||
ipv4_t *ip;
|
||||
cp
|
||||
if(!cfg)
|
||||
return 0;
|
||||
|
||||
ip = xmalloc(sizeof(*ip));
|
||||
*ip = str2address(cfg->value);
|
||||
|
||||
if(ip)
|
||||
{
|
||||
*result = ip;
|
||||
return 1;
|
||||
}
|
||||
|
||||
syslog(LOG_ERR, _("IP address expected for configuration variable %s in %s line %d"),
|
||||
cfg->variable, cfg->file, cfg->line);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_config_port(config_t *cfg, port_t *result)
|
||||
{
|
||||
cp
|
||||
if(!cfg)
|
||||
return 0;
|
||||
|
||||
if(sscanf(cfg->value, "%hu", result) == 1)
|
||||
return 1;
|
||||
|
||||
syslog(LOG_ERR, _("Port number expected for configuration variable %s in %s line %d"),
|
||||
cfg->variable, cfg->file, cfg->line);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_config_subnet(config_t *cfg, subnet_t **result)
|
||||
{
|
||||
subnet_t *subnet;
|
||||
|
@ -209,34 +242,27 @@ cp
|
|||
if(!cfg)
|
||||
return 0;
|
||||
|
||||
#warning FIXME
|
||||
/* ip = strtoip(cfg->value); */
|
||||
subnet = str2net(cfg->value);
|
||||
|
||||
/* if(!ip) */
|
||||
/* { */
|
||||
/* syslog(LOG_ERR, _("IP address expected for configuration variable %s in %s line %d"), */
|
||||
/* cfg->variable, cfg->file, cfg->line); */
|
||||
/* return 0; */
|
||||
/* } */
|
||||
if(!subnet)
|
||||
{
|
||||
syslog(LOG_ERR, _("Subnet expected for configuration variable %s in %s line %d"),
|
||||
cfg->variable, cfg->file, cfg->line);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Teach newbies what subnets are... */
|
||||
|
||||
/* if((ip->address & ip->mask) != ip->address) */
|
||||
/* { */
|
||||
/* syslog(LOG_ERR, _("Network address and subnet mask for configuration variable %s in %s line %d"), */
|
||||
/* cfg->variable, cfg->file, cfg->line); */
|
||||
/* free(ip); */
|
||||
/* return 0; */
|
||||
/* } */
|
||||
if(subnet->type == SUBNET_IPV4)
|
||||
if((subnet->net.ipv4.address & subnet->net.ipv4.mask) != subnet->net.ipv4.address)
|
||||
{
|
||||
syslog(LOG_ERR, _("Network address and mask length do not match for configuration variable %s in %s line %d"),
|
||||
cfg->variable, cfg->file, cfg->line);
|
||||
free(subnet);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* subnet = new_subnet(); */
|
||||
/* subnet->type = SUBNET_IP; */
|
||||
/* subnet->net.ip.address = ip->address; */
|
||||
/* subnet->net.ip.mask = ip->mask; */
|
||||
|
||||
/* free(ip); */
|
||||
|
||||
/* *result = subnet; */
|
||||
*result = subnet;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
11
src/conf.h
11
src/conf.h
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
conf.h -- header for conf.c
|
||||
Copyright (C) 1998-2001 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
2000,2001 Guus Sliepen <guus@sliepen.warande.net>
|
||||
Copyright (C) 1998-2002 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
2000-2002 Guus Sliepen <guus@sliepen.warande.net>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: conf.h,v 1.6.4.30 2001/11/16 12:14:20 zarq Exp $
|
||||
$Id: conf.h,v 1.6.4.31 2002/02/10 21:57:53 guus Exp $
|
||||
*/
|
||||
|
||||
#ifndef __TINC_CONF_H__
|
||||
|
@ -37,9 +37,8 @@ typedef struct config_t {
|
|||
extern avl_tree_t *config_tree;
|
||||
|
||||
extern int debug_lvl;
|
||||
extern int timeout;
|
||||
extern int pingtimeout;
|
||||
extern int maxtimeout;
|
||||
extern int sighup;
|
||||
extern int bypass_security;
|
||||
extern char *confbase;
|
||||
extern char *netname;
|
||||
|
@ -53,7 +52,9 @@ extern config_t *lookup_config(avl_tree_t *, char *);
|
|||
extern config_t *lookup_config_next(avl_tree_t *, config_t *);
|
||||
extern int get_config_bool(config_t *, int *);
|
||||
extern int get_config_int(config_t *, int *);
|
||||
extern int get_config_port(config_t *, port_t *);
|
||||
extern int get_config_string(config_t *, char **);
|
||||
extern int get_config_address(config_t *, ipv4_t **);
|
||||
struct subnet_t; /* Needed for next line. */
|
||||
extern int get_config_subnet(config_t *, struct subnet_t **);
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
connection.c -- connection list management
|
||||
Copyright (C) 2000,2001 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2000,2001 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
Copyright (C) 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: connection.c,v 1.1.2.26 2001/11/16 12:20:44 zarq Exp $
|
||||
$Id: connection.c,v 1.1.2.27 2002/02/10 21:57:53 guus Exp $
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
@ -31,6 +31,7 @@
|
|||
#include <list.h>
|
||||
|
||||
#include "net.h" /* Don't ask. */
|
||||
#include "netutl.h"
|
||||
#include "config.h"
|
||||
#include "conf.h"
|
||||
#include <utils.h>
|
||||
|
@ -105,11 +106,12 @@ cp
|
|||
cp
|
||||
}
|
||||
|
||||
connection_t *lookup_connection(struct addrinfo *address)
|
||||
connection_t *lookup_connection(ipv4_t address, port_t port)
|
||||
{
|
||||
connection_t c;
|
||||
cp
|
||||
c.address = address;
|
||||
c.port = port;
|
||||
|
||||
return avl_search(connection_tree, &c);
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
connection.h -- header for connection.c
|
||||
Copyright (C) 2000,2001 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2000,2001 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
Copyright (C) 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: connection.h,v 1.1.2.23 2001/11/16 12:01:48 zarq Exp $
|
||||
$Id: connection.h,v 1.1.2.24 2002/02/10 21:57:53 guus Exp $
|
||||
*/
|
||||
|
||||
#ifndef __TINC_CONNECTION_H__
|
||||
|
@ -46,30 +46,26 @@
|
|||
#include "node.h"
|
||||
#include "edge.h"
|
||||
|
||||
#include <config.h>
|
||||
#include <dropin.h>
|
||||
|
||||
#define OPTION_INDIRECT 0x0001
|
||||
#define OPTION_TCPONLY 0x0002
|
||||
|
||||
typedef struct connection_status_t {
|
||||
int pinged:1; /* sent ping */
|
||||
int active:1; /* 1 if active.. */
|
||||
int outgoing:1; /* I myself asked for this conn */
|
||||
int termreq:1; /* the termination of this connection was requested */
|
||||
int remove:1; /* Set to 1 if you want this connection removed */
|
||||
int timeout:1; /* 1 if gotten timeout */
|
||||
int encryptout:1; /* 1 if we can encrypt outgoing traffic */
|
||||
int decryptin:1; /* 1 if we have to decrypt incoming traffic */
|
||||
int mst:1; /* 1 if this connection is part of a minimum spanning tree */
|
||||
int unused:17;
|
||||
int unused:18;
|
||||
} connection_status_t;
|
||||
|
||||
typedef struct connection_t {
|
||||
char *name; /* name he claims to have */
|
||||
|
||||
struct addrinfo *address; /* his real (internet) ip */
|
||||
char *port; /* port number of meta connection */
|
||||
ipv4_t address; /* his real (internet) ip */
|
||||
port_t port; /* port number of meta connection */
|
||||
char *hostname; /* the hostname of its real ip */
|
||||
int protocol_version; /* used protocol */
|
||||
|
||||
|
@ -78,9 +74,10 @@ typedef struct connection_t {
|
|||
struct connection_status_t status; /* status info */
|
||||
int estimated_weight; /* estimation for the weight of the edge for this connection */
|
||||
struct timeval start; /* time this connection was started, used for above estimation */
|
||||
struct outgoing_t *outgoing; /* used to keep track of outgoing connections */
|
||||
|
||||
struct node_t *node; /* node associated with the other end */
|
||||
struct edge_t *edge; /* edge associated with this connection */
|
||||
struct edge_t *edge; /* edge associated with this connection */
|
||||
|
||||
RSA *rsa_key; /* his public/private key */
|
||||
EVP_CIPHER *incipher; /* Cipher he will use to send data to us */
|
||||
|
@ -112,7 +109,7 @@ extern connection_t *new_connection(void);
|
|||
extern void free_connection(connection_t *);
|
||||
extern void connection_add(connection_t *);
|
||||
extern void connection_del(connection_t *);
|
||||
extern connection_t *lookup_connection(struct addrinfo *);
|
||||
extern connection_t *lookup_connection(ipv4_t, short unsigned int);
|
||||
extern void dump_connections(void);
|
||||
extern int read_connection_config(connection_t *);
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
net.h -- generic header for device.c
|
||||
Copyright (C) 2001 Ivo Timmermans <zarq@iname.com>
|
||||
2001 Guus Sliepen <guus@sliepen.warande.net>
|
||||
Copyright (C) 2001-2002 Ivo Timmermans <zarq@iname.com>
|
||||
2001-2002 Guus Sliepen <guus@sliepen.warande.net>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: device.h,v 1.1.2.4 2001/10/31 12:50:24 guus Exp $
|
||||
$Id: device.h,v 1.1.2.5 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
#ifndef __TINC_DEVICE_H__
|
||||
|
|
52
src/edge.c
52
src/edge.c
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
edge.c -- edge tree management
|
||||
Copyright (C) 2000,2001 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2000,2001 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
Copyright (C) 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: edge.c,v 1.1.2.5 2001/11/16 12:21:49 zarq Exp $
|
||||
$Id: edge.c,v 1.1.2.6 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
@ -30,6 +30,7 @@
|
|||
#include <list.h>
|
||||
|
||||
#include "net.h" /* Don't ask. */
|
||||
#include "netutl.h"
|
||||
#include "config.h"
|
||||
#include "conf.h"
|
||||
#include <utils.h>
|
||||
|
@ -45,12 +46,12 @@ int edge_compare(edge_t *a, edge_t *b)
|
|||
{
|
||||
int result;
|
||||
|
||||
result = strcmp(a->from->name, b->from->name);
|
||||
result = strcmp(a->from.node->name, b->from.node->name);
|
||||
|
||||
if(result)
|
||||
return result;
|
||||
else
|
||||
return strcmp(a->to->name, b->to->name);
|
||||
return strcmp(a->to.node->name, b->to.node->name);
|
||||
}
|
||||
|
||||
/* Evil edge_compare() from a parallel universe ;)
|
||||
|
@ -59,7 +60,7 @@ int edge_compare(edge_t *a, edge_t *b)
|
|||
{
|
||||
int result;
|
||||
|
||||
return (result = strcmp(a->from->name, b->from->name)) || (result = strcmp(a->to->name, b->to->name)), result;
|
||||
return (result = strcmp(a->from.node->name, b->from.node->name)) || (result = strcmp(a->to.node->name, b->to.node->name)), result;
|
||||
}
|
||||
|
||||
*/
|
||||
|
@ -69,15 +70,15 @@ int edge_name_compare(edge_t *a, edge_t *b)
|
|||
int result;
|
||||
char *name_a1, *name_a2, *name_b1, *name_b2;
|
||||
|
||||
if(strcmp(a->from->name, a->to->name) < 0)
|
||||
name_a1 = a->from->name, name_a2 = a->to->name;
|
||||
if(strcmp(a->from.node->name, a->to.node->name) < 0)
|
||||
name_a1 = a->from.node->name, name_a2 = a->to.node->name;
|
||||
else
|
||||
name_a1 = a->to->name, name_a2 = a->from->name;
|
||||
name_a1 = a->to.node->name, name_a2 = a->from.node->name;
|
||||
|
||||
if(strcmp(b->from->name, b->to->name) < 0)
|
||||
name_b1 = b->from->name, name_b2 = b->to->name;
|
||||
if(strcmp(b->from.node->name, b->to.node->name) < 0)
|
||||
name_b1 = b->from.node->name, name_b2 = b->to.node->name;
|
||||
else
|
||||
name_b1 = b->to->name, name_b2 = b->from->name;
|
||||
name_b1 = b->to.node->name, name_b2 = b->from.node->name;
|
||||
|
||||
result = strcmp(name_a1, name_b1);
|
||||
|
||||
|
@ -151,8 +152,8 @@ void edge_add(edge_t *e)
|
|||
cp
|
||||
avl_insert(edge_tree, e);
|
||||
avl_insert(edge_weight_tree, e);
|
||||
avl_insert(e->from->edge_tree, e);
|
||||
avl_insert(e->to->edge_tree, e);
|
||||
avl_insert(e->from.node->edge_tree, e);
|
||||
avl_insert(e->to.node->edge_tree, e);
|
||||
cp
|
||||
}
|
||||
|
||||
|
@ -161,8 +162,8 @@ void edge_del(edge_t *e)
|
|||
cp
|
||||
avl_delete(edge_tree, e);
|
||||
avl_delete(edge_weight_tree, e);
|
||||
avl_delete(e->from->edge_tree, e);
|
||||
avl_delete(e->to->edge_tree, e);
|
||||
avl_delete(e->from.node->edge_tree, e);
|
||||
avl_delete(e->to.node->edge_tree, e);
|
||||
cp
|
||||
}
|
||||
|
||||
|
@ -170,16 +171,16 @@ edge_t *lookup_edge(node_t *from, node_t *to)
|
|||
{
|
||||
edge_t v, *result;
|
||||
cp
|
||||
v.from = from;
|
||||
v.to = to;
|
||||
v.from.node = from;
|
||||
v.to.node = to;
|
||||
|
||||
result = avl_search(edge_tree, &v);
|
||||
|
||||
if(result)
|
||||
return result;
|
||||
cp
|
||||
v.from = to;
|
||||
v.to = from;
|
||||
v.from.node = to;
|
||||
v.to.node = from;
|
||||
|
||||
return avl_search(edge_tree, &v);
|
||||
}
|
||||
|
@ -188,14 +189,21 @@ void dump_edges(void)
|
|||
{
|
||||
avl_node_t *node;
|
||||
edge_t *e;
|
||||
char *from_address, *to_address;
|
||||
cp
|
||||
syslog(LOG_DEBUG, _("Edges:"));
|
||||
|
||||
for(node = edge_tree->head; node; node = node->next)
|
||||
{
|
||||
e = (edge_t *)node->data;
|
||||
syslog(LOG_DEBUG, _(" %s - %s options %ld weight %d"),
|
||||
e->from->name, e->to->name, e->options, e->weight);
|
||||
from_address = address2str(e->from.address);
|
||||
to_address = address2str(e->to.address);
|
||||
syslog(LOG_DEBUG, _(" %s at %s port %hd - %s at %s port %hd options %ld weight %d"),
|
||||
e->from.node->name, from_address, e->from.port,
|
||||
e->to.node->name, to_address, e->to.port,
|
||||
e->options, e->weight);
|
||||
free(from_address);
|
||||
free(to_address);
|
||||
}
|
||||
|
||||
syslog(LOG_DEBUG, _("End of edges."));
|
||||
|
|
16
src/edge.h
16
src/edge.h
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
edge.h -- header for edge.c
|
||||
Copyright (C) 2001 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2001 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
Copyright (C) 2001-2002 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: edge.h,v 1.1.2.4 2001/11/16 12:13:34 zarq Exp $
|
||||
$Id: edge.h,v 1.1.2.5 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
#ifndef __TINC_EDGE_H__
|
||||
|
@ -28,18 +28,16 @@
|
|||
#include "node.h"
|
||||
#include "connection.h"
|
||||
|
||||
/* I don't know if halfconnection_t is useful... */
|
||||
|
||||
typedef struct halfconnection_t {
|
||||
struct node_t *node; /* node associated with this end of the connection */
|
||||
|
||||
struct addrinfo *address; /* real (internet) ip on this end of the meta connection */
|
||||
char *hostname; /* the hostname of real ip */
|
||||
ipv4_t address; /* real (internet) ip on this end of the meta connection */
|
||||
port_t port; /* port number of this end of the meta connection */
|
||||
} halfconnection_t;
|
||||
|
||||
typedef struct edge_t {
|
||||
struct node_t *from;
|
||||
struct node_t *to;
|
||||
struct halfconnection_t from;
|
||||
struct halfconnection_t to;
|
||||
|
||||
long int options; /* options turned on for this edge */
|
||||
int weight; /* weight of this edge */
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
device.c -- Interaction with FreeBSD tap device
|
||||
Copyright (C) 2001 Ivo Timmermans <itimmermans@bigfoot.com>,
|
||||
2001 Guus Sliepen <guus@sliepen.warande.net>
|
||||
Copyright (C) 2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
|
||||
2001-2002 Guus Sliepen <guus@sliepen.warande.net>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,38 +17,59 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: device.c,v 1.1.2.1 2001/10/12 15:22:59 guus Exp $
|
||||
$Id: device.c,v 1.1.2.2 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/socket.h>
|
||||
#include <fcntl.h>
|
||||
#include <net/if.h>
|
||||
#include <unistd.h>
|
||||
#include <syslog.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <utils.h>
|
||||
#include "conf.h"
|
||||
#include "net.h"
|
||||
#include "subnet.h"
|
||||
|
||||
#include "system.h"
|
||||
|
||||
#define DEFAULT_DEVICE "/dev/tap0"
|
||||
|
||||
int device_fd = -1;
|
||||
int device_type;
|
||||
char *device_fname;
|
||||
char *device;
|
||||
char *interface;
|
||||
char *device_info;
|
||||
|
||||
int device_total_in = 0;
|
||||
int device_total_out = 0;
|
||||
|
||||
*
|
||||
extern subnet_t mymac;
|
||||
|
||||
/*
|
||||
open the local ethertap device
|
||||
*/
|
||||
int setup_device(void)
|
||||
{
|
||||
struct ifreq ifr;
|
||||
|
||||
cp
|
||||
if(!get_config_string(lookup_config(config_tree, "Device"), &device_fname)))
|
||||
device_fname = DEFAULT_DEVICE;
|
||||
if(!get_config_string(lookup_config(config_tree, "Device"), &device))
|
||||
device = DEFAULT_DEVICE;
|
||||
|
||||
if(!get_config_string(lookup_config(config_tree, "Interface"), &interface))
|
||||
interface = netname;
|
||||
cp
|
||||
if((device_fd = open(device_fname, O_RDWR | O_NONBLOCK)) < 0)
|
||||
if((device_fd = open(device, O_RDWR | O_NONBLOCK)) < 0)
|
||||
{
|
||||
syslog(LOG_ERR, _("Could not open %s: %m"), device_fname);
|
||||
syslog(LOG_ERR, _("Could not open %s: %m"), device);
|
||||
return -1;
|
||||
}
|
||||
cp
|
||||
device_fd = device_fd;
|
||||
|
||||
/* Set default MAC address for ethertap devices */
|
||||
|
||||
|
@ -62,11 +83,17 @@ cp
|
|||
|
||||
device_info = _("FreeBSD tap device");
|
||||
|
||||
syslog(LOG_INFO, _("%s is a %s"), device_fname, device_info);
|
||||
syslog(LOG_INFO, _("%s is a %s"), device, device_info);
|
||||
cp
|
||||
return 0;
|
||||
}
|
||||
|
||||
void close_device(void)
|
||||
{
|
||||
cp
|
||||
close(device_fd);
|
||||
}
|
||||
|
||||
/*
|
||||
read, encrypt and send data that is
|
||||
available through the ethertap device
|
||||
|
@ -77,7 +104,7 @@ int read_packet(vpn_packet_t *packet)
|
|||
cp
|
||||
if((lenin = read(device_fd, packet->data, MTU)) <= 0)
|
||||
{
|
||||
syslog(LOG_ERR, _("Error while reading from %s %s: %m"), device_info, device_fname);
|
||||
syslog(LOG_ERR, _("Error while reading from %s %s: %m"), device_info, device);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -102,10 +129,19 @@ cp
|
|||
|
||||
if(write(device_fd, packet->data, packet->len) < 0)
|
||||
{
|
||||
syslog(LOG_ERR, _("Error while writing to %s %s: %m"), device_info, device_fname);
|
||||
syslog(LOG_ERR, _("Error while writing to %s %s: %m"), device_info, device);
|
||||
return -1;
|
||||
}
|
||||
|
||||
device_total_out += packet->len;
|
||||
cp
|
||||
}
|
||||
|
||||
void dump_device_stats(void)
|
||||
{
|
||||
cp
|
||||
syslog(LOG_DEBUG, _("Statistics for %s %s:"), device_info, device);
|
||||
syslog(LOG_DEBUG, _(" total bytes in: %10d"), device_total_in);
|
||||
syslog(LOG_DEBUG, _(" total bytes out: %10d"), device_total_out);
|
||||
cp
|
||||
}
|
||||
|
|
108
src/graph.c
108
src/graph.c
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
graph.c -- graph algorithms
|
||||
Copyright (C) 2001 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2001 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
Copyright (C) 2001-2002 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: graph.c,v 1.1.2.5 2001/10/31 12:50:24 guus Exp $
|
||||
$Id: graph.c,v 1.1.2.6 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
/* We need to generate two trees from the graph:
|
||||
|
@ -38,14 +38,24 @@
|
|||
|
||||
For the SSSP algorithm Dijkstra's seems to be a nice choice. Currently a
|
||||
simple breadth-first search is presented here.
|
||||
|
||||
The SSSP algorithm will also be used to determine whether nodes are directly,
|
||||
indirectly or not reachable from the source. It will also set the correct
|
||||
destination address and port of a node if possible.
|
||||
*/
|
||||
|
||||
#include <syslog.h>
|
||||
#include "config.h"
|
||||
#include <string.h>
|
||||
#if defined(HAVE_FREEBSD) || defined(HAVE_OPENBSD)
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include <avl_tree.h>
|
||||
#include <utils.h>
|
||||
|
||||
#include "netutl.h"
|
||||
#include "node.h"
|
||||
#include "edge.h"
|
||||
#include "connection.h"
|
||||
|
@ -67,6 +77,11 @@ void mst_kruskal(void)
|
|||
int safe_edges = 0;
|
||||
int skipped;
|
||||
|
||||
/* Do we have something to do at all? */
|
||||
|
||||
if(!edge_weight_tree->head)
|
||||
return;
|
||||
|
||||
/* Clear visited status on nodes */
|
||||
|
||||
for(node = node_tree->head; node; node = node->next)
|
||||
|
@ -78,7 +93,7 @@ void mst_kruskal(void)
|
|||
|
||||
/* Starting point */
|
||||
|
||||
((edge_t *)edge_weight_tree->head->data)->from->status.visited = 1;
|
||||
((edge_t *)edge_weight_tree->head->data)->from.node->status.visited = 1;
|
||||
|
||||
/* Clear MST status on connections */
|
||||
|
||||
|
@ -95,14 +110,14 @@ void mst_kruskal(void)
|
|||
next = node->next;
|
||||
e = (edge_t *)node->data;
|
||||
|
||||
if(e->from->status.visited == e->to->status.visited)
|
||||
if(e->from.node->status.visited == e->to.node->status.visited)
|
||||
{
|
||||
skipped = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
e->from->status.visited = 1;
|
||||
e->to->status.visited = 1;
|
||||
e->from.node->status.visited = 1;
|
||||
e->to.node->status.visited = 1;
|
||||
if(e->connection)
|
||||
e->connection->status.mst = 1;
|
||||
|
||||
|
@ -120,11 +135,12 @@ void mst_kruskal(void)
|
|||
Running time: O(E)
|
||||
*/
|
||||
|
||||
void sssp_bfs(int prune)
|
||||
void sssp_bfs(void)
|
||||
{
|
||||
avl_node_t *node, *from, *next, *to;
|
||||
edge_t *e;
|
||||
node_t *n, *check;
|
||||
node_t *n;
|
||||
halfconnection_t to_hc, from_hc;
|
||||
avl_tree_t *todo_tree;
|
||||
|
||||
todo_tree = avl_alloc_tree(NULL, NULL);
|
||||
|
@ -150,46 +166,82 @@ void sssp_bfs(int prune)
|
|||
|
||||
while(todo_tree->head)
|
||||
{
|
||||
for(from = todo_tree->head; from; from = next)
|
||||
for(from = todo_tree->head; from; from = next) /* "from" is the node from which we start */
|
||||
{
|
||||
next = from->next;
|
||||
n = (node_t *)from->data;
|
||||
|
||||
for(to = n->edge_tree->head; to; to = to->next)
|
||||
for(to = n->edge_tree->head; to; to = to->next) /* "to" is the edge connected to "from" */
|
||||
{
|
||||
e = (edge_t *)to->data;
|
||||
|
||||
if(e->from == n)
|
||||
check = e->to;
|
||||
if(e->from.node == n) /* "from_hc" is the halfconnection with .node == from */
|
||||
to_hc = e->to, from_hc = e->from;
|
||||
else
|
||||
check = e->from;
|
||||
to_hc = e->from, from_hc = e->to;
|
||||
|
||||
if(!check->status.visited)
|
||||
if(!to_hc.node->status.visited)
|
||||
{
|
||||
check->status.visited = 1;
|
||||
check->nexthop = (n->nexthop == myself) ? check : n->nexthop;
|
||||
check->via = (e->options & OPTION_INDIRECT || n->via != n) ? n->via : check;
|
||||
to_hc.node->status.visited = 1;
|
||||
to_hc.node->nexthop = (n->nexthop == myself) ? to_hc.node : n->nexthop;
|
||||
to_hc.node->via = (e->options & OPTION_INDIRECT || n->via != n) ? n->via : to_hc.node;
|
||||
to_hc.node->options = e->options;
|
||||
if(to_hc.node->address != to_hc.address || to_hc.node->port != to_hc.port)
|
||||
{
|
||||
node = avl_unlink(node_udp_tree, to_hc.node);
|
||||
to_hc.node->address = to_hc.address;
|
||||
to_hc.node->port = to_hc.port;
|
||||
if(to_hc.node->hostname)
|
||||
free(to_hc.node->hostname);
|
||||
to_hc.node->hostname = hostlookup(htonl(to_hc.address));
|
||||
avl_insert_node(node_udp_tree, node);
|
||||
}
|
||||
to_hc.node->port = to_hc.port;
|
||||
node = avl_alloc_node();
|
||||
node->data = check;
|
||||
node->data = to_hc.node;
|
||||
avl_insert_before(todo_tree, from, node);
|
||||
}
|
||||
}
|
||||
|
||||
avl_delete_node(todo_tree, from);
|
||||
avl_delete_node(todo_tree, from);
|
||||
}
|
||||
}
|
||||
|
||||
avl_free_tree(todo_tree);
|
||||
|
||||
/* Nodes we haven't visited are unreachable, prune them. */
|
||||
/* Check reachability status. */
|
||||
|
||||
if(prune)
|
||||
for(node = node_tree->head; node; node = next)
|
||||
for(node = node_tree->head; node; node = next)
|
||||
{
|
||||
next = node->next;
|
||||
n = (node_t *)node->data;
|
||||
|
||||
if(n->status.visited)
|
||||
{
|
||||
next = node->next;
|
||||
n = (node_t *)node->data;
|
||||
|
||||
if(n->status.visited == 0)
|
||||
node_del(n);
|
||||
if(!n->status.reachable)
|
||||
{
|
||||
if(debug_lvl >= DEBUG_TRAFFIC)
|
||||
syslog(LOG_DEBUG, _("Node %s (%s) became reachable"), n->name, n->hostname);
|
||||
n->status.reachable = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(n->status.reachable)
|
||||
{
|
||||
if(debug_lvl >= DEBUG_TRAFFIC)
|
||||
syslog(LOG_DEBUG, _("Node %s (%s) became unreachable"), n->name, n->hostname);
|
||||
n->status.reachable = 0;
|
||||
n->status.validkey = 0;
|
||||
n->status.waitingforkey = 0;
|
||||
n->sent_seqno = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void graph(void)
|
||||
{
|
||||
mst_kruskal();
|
||||
sssp_bfs();
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
graph.h -- header for graph.c
|
||||
Copyright (C) 2001 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2001 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
Copyright (C) 2001-2002 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,8 +17,9 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: graph.h,v 1.1.2.2 2001/10/31 12:50:24 guus Exp $
|
||||
$Id: graph.h,v 1.1.2.3 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
extern void graph(void);
|
||||
extern void mst_kruskal(void);
|
||||
extern void sssp_bfs(int);
|
||||
extern void sssp_bfs(void);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
device.c -- Interaction with Linux ethertap and tun/tap device
|
||||
Copyright (C) 2001 Ivo Timmermans <itimmermans@bigfoot.com>,
|
||||
2001 Guus Sliepen <guus@sliepen.warande.net>
|
||||
Copyright (C) 2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
|
||||
2001-2002 Guus Sliepen <guus@sliepen.warande.net>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: device.c,v 1.1.2.4 2001/10/31 12:50:24 guus Exp $
|
||||
$Id: device.c,v 1.1.2.5 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
@ -63,7 +63,7 @@ char *device_info;
|
|||
int device_total_in = 0;
|
||||
int device_total_out = 0;
|
||||
|
||||
subnet_t mymac;
|
||||
extern subnet_t mymac;
|
||||
|
||||
/*
|
||||
open the local ethertap device
|
||||
|
@ -158,9 +158,7 @@ cp
|
|||
}
|
||||
else /* ethertap */
|
||||
{
|
||||
struct iovec vector[2] = {{&packet->len, 2}, {packet->data, MTU}};
|
||||
|
||||
if((lenin = readv(device_fd, vector, 2)) <= 0)
|
||||
if((lenin = read(device_fd, packet->data - 2, MTU + 2)) <= 0)
|
||||
{
|
||||
syslog(LOG_ERR, _("Error while reading from %s %s: %m"), device_info, device);
|
||||
return -1;
|
||||
|
@ -197,9 +195,8 @@ cp
|
|||
}
|
||||
else/* ethertap */
|
||||
{
|
||||
struct iovec vector[2] = {{&packet->len, 2}, {packet->data, MTU}};
|
||||
|
||||
if(writev(device_fd, vector, 2) < 0)
|
||||
*(short int *)(packet->data - 2) = packet->len;
|
||||
if(write(device_fd, packet->data - 2, packet->len + 2) < 0)
|
||||
{
|
||||
syslog(LOG_ERR, _("Can't write to %s %s: %m"), device_info, device);
|
||||
return -1;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
meta.c -- handle the meta communication
|
||||
Copyright (C) 2000,2001 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2000,2001 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
Copyright (C) 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: meta.c,v 1.1.2.21 2001/10/27 12:13:17 guus Exp $
|
||||
$Id: meta.c,v 1.1.2.22 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
meta.h -- header for meta.c
|
||||
Copyright (C) 2000,2001 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2000,2001 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
Copyright (C) 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: meta.h,v 1.1.2.5 2001/01/07 17:08:58 guus Exp $
|
||||
$Id: meta.h,v 1.1.2.6 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
#ifndef __TINC_META_H__
|
||||
|
|
60
src/net.h
60
src/net.h
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
net.h -- header for net.c
|
||||
Copyright (C) 1998-2001 Ivo Timmermans <zarq@iname.com>
|
||||
2000,2001 Guus Sliepen <guus@sliepen.warande.net>
|
||||
Copyright (C) 1998-2002 Ivo Timmermans <zarq@iname.com>
|
||||
2000-2002 Guus Sliepen <guus@sliepen.warande.net>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: net.h,v 1.9.4.37 2001/11/16 12:08:38 zarq Exp $
|
||||
$Id: net.h,v 1.9.4.38 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
#ifndef __TINC_NET_H__
|
||||
|
@ -27,41 +27,35 @@
|
|||
|
||||
#include "config.h"
|
||||
|
||||
#define MAXSIZE 1700 /* should be a bit more than the MTU for the tapdevice */
|
||||
#define MTU 1600
|
||||
#define SALTLEN 2 /* to spice things up for the NSA... */
|
||||
#define MTU 1514 /* 1500 bytes payload + 14 bytes ethernet header */
|
||||
#define MAXSIZE 1600 /* MTU + header (seqno) and trailer (CBC padding and HMAC) */
|
||||
|
||||
#define MAC_ADDR_S "%02x:%02x:%02x:%02x:%02x:%02x"
|
||||
#define MAC_ADDR_V(x) ((unsigned char*)&(x))[0],((unsigned char*)&(x))[1], \
|
||||
((unsigned char*)&(x))[2],((unsigned char*)&(x))[3], \
|
||||
((unsigned char*)&(x))[4],((unsigned char*)&(x))[5]
|
||||
|
||||
#define IP_ADDR_S "%d.%d.%d.%d"
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
# define IP_ADDR_V(x) ((unsigned char*)&(x))[0],((unsigned char*)&(x))[1], \
|
||||
((unsigned char*)&(x))[2],((unsigned char*)&(x))[3]
|
||||
#else
|
||||
# define IP_ADDR_V(x) ((unsigned char*)&(x))[3],((unsigned char*)&(x))[2], \
|
||||
((unsigned char*)&(x))[1],((unsigned char*)&(x))[0]
|
||||
#endif
|
||||
|
||||
#define MAXBUFSIZE 4096 /* Probably way too much, but it must fit every possible request. */
|
||||
|
||||
/* tap types */
|
||||
#define TAP_TYPE_ETHERTAP 0
|
||||
#define TAP_TYPE_TUNTAP 1
|
||||
#define MAXBUFSIZE 2048 /* Probably way too much, but it must fit every possible request. */
|
||||
|
||||
typedef struct mac_t
|
||||
{
|
||||
unsigned char x[6];
|
||||
} mac_t;
|
||||
|
||||
typedef unsigned long ipv4_t;
|
||||
|
||||
typedef struct ip_mask_t {
|
||||
ipv4_t address;
|
||||
ipv4_t mask;
|
||||
} ip_mask_t;
|
||||
|
||||
typedef struct ipv6_t
|
||||
{
|
||||
unsigned short x[8];
|
||||
} ipv6_t;
|
||||
|
||||
typedef unsigned short port_t;
|
||||
|
||||
typedef short length_t;
|
||||
|
||||
typedef struct vpn_packet_t {
|
||||
length_t len; /* the actual number of bytes in the `data' field */
|
||||
unsigned char salt[SALTLEN]; /* two bytes of randomness */
|
||||
unsigned int seqno; /* 32 bits sequence number (network byte order of course) */
|
||||
unsigned char data[MAXSIZE];
|
||||
} vpn_packet_t;
|
||||
|
||||
|
@ -76,11 +70,16 @@ typedef struct packet_queue_t {
|
|||
queue_element_t *tail;
|
||||
} packet_queue_t;
|
||||
|
||||
typedef struct outgoing_t {
|
||||
char *name;
|
||||
int timeout;
|
||||
} outgoing_t;
|
||||
|
||||
extern int maxtimeout;
|
||||
extern int seconds_till_retry;
|
||||
|
||||
extern char *request_name[256];
|
||||
extern char *status_text[10];
|
||||
extern char *request_name[];
|
||||
extern char *status_text[];
|
||||
|
||||
#include "connection.h" /* Yes, very strange placement indeed, but otherwise the typedefs get all tangled up */
|
||||
|
||||
|
@ -89,11 +88,12 @@ extern void receive_packet(struct node_t *, vpn_packet_t *);
|
|||
extern void receive_tcppacket(struct connection_t *, char *, int);
|
||||
extern void broadcast_packet(struct node_t *, vpn_packet_t *);
|
||||
extern int setup_network_connections(void);
|
||||
extern void setup_outgoing_connection(struct outgoing_t *);
|
||||
extern void try_outgoing_connections(void);
|
||||
extern void close_network_connections(void);
|
||||
extern void main_loop(void);
|
||||
extern void terminate_connection(connection_t *, int);
|
||||
extern void flush_queue(struct node_t *);
|
||||
extern int read_rsa_public_key(struct connection_t *);
|
||||
extern RETSIGTYPE try_outgoing_connections(int);
|
||||
|
||||
#endif /* __TINC_NET_H__ */
|
||||
|
|
25
src/node.c
25
src/node.c
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
node.c -- node tree management
|
||||
Copyright (C) 2001 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2001 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
Copyright (C) 2001-2002 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: node.c,v 1.1.2.7 2001/11/16 17:39:38 zarq Exp $
|
||||
$Id: node.c,v 1.1.2.8 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
@ -47,10 +47,13 @@ int node_udp_compare(node_t *a, node_t *b)
|
|||
{
|
||||
if(a->address < b->address)
|
||||
return -1;
|
||||
else if (a->address > b->address)
|
||||
if (a->address > b->address)
|
||||
return 1;
|
||||
else
|
||||
return a->port - b->port;
|
||||
if (a->port < b->port)
|
||||
return -1;
|
||||
if (a->port > b->port)
|
||||
return 1;
|
||||
return (a->name && b->name)?strcmp(a->name, b->name):0;
|
||||
}
|
||||
|
||||
void init_nodes(void)
|
||||
|
@ -140,11 +143,13 @@ cp
|
|||
return avl_search(node_tree, &n);
|
||||
}
|
||||
|
||||
node_t *lookup_node_udp(struct addrinfo *address)
|
||||
node_t *lookup_node_udp(ipv4_t address, port_t port)
|
||||
{
|
||||
node_t n;
|
||||
cp
|
||||
n.name = NULL;
|
||||
n.address = address;
|
||||
n.port = port;
|
||||
return avl_search(node_udp_tree, &n);
|
||||
}
|
||||
|
||||
|
@ -158,9 +163,9 @@ cp
|
|||
for(node = node_tree->head; node; node = node->next)
|
||||
{
|
||||
n = (node_t *)node->data;
|
||||
syslog(LOG_DEBUG, _(" %s at %s port %s options %ld status %04x nexthop %s via %s"),
|
||||
n->name, n->hostname, n->port, n->options,
|
||||
n->status, n->nexthop->name, n->via->name);
|
||||
syslog(LOG_DEBUG, _(" %s at %s port %hd cipher %d digest %d maclength %d options %ld status %04x nexthop %s via %s"),
|
||||
n->name, n->hostname, n->port, n->cipher?n->cipher->nid:0, n->digest?n->digest->type:0, n->maclength, n->options,
|
||||
n->status, n->nexthop?n->nexthop->name:"-", n->via?n->via->name:"-");
|
||||
}
|
||||
|
||||
syslog(LOG_DEBUG, _("End of nodes."));
|
||||
|
|
25
src/node.h
25
src/node.h
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
node.h -- header for node.c
|
||||
Copyright (C) 2001 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2001 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
Copyright (C) 2001-2002 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: node.h,v 1.1.2.9 2001/11/16 15:56:44 zarq Exp $
|
||||
$Id: node.h,v 1.1.2.10 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
#ifndef __TINC_NODE_H__
|
||||
|
@ -33,23 +33,27 @@ typedef struct node_status_t {
|
|||
int validkey:1; /* 1 if we currently have a valid key for him */
|
||||
int waitingforkey:1; /* 1 if we already sent out a request */
|
||||
int visited:1; /* 1 if this node has been visited by one of the graph algorithms */
|
||||
int unused:28;
|
||||
int reachable:1; /* 1 if this node is reachable in the graph */
|
||||
int unused:27;
|
||||
} node_status_t;
|
||||
|
||||
typedef struct node_t {
|
||||
char *name; /* name of this node */
|
||||
long int options; /* options turned on for this node */
|
||||
|
||||
struct addrinfo *address; /* his real (internet) ip to send UDP packets to */
|
||||
char *port; /* string representation of the port number */
|
||||
ipv4_t address; /* his real (internet) ip to send UDP packets to */
|
||||
port_t port; /* port number of UDP connection */
|
||||
char *hostname; /* the hostname of its real ip */
|
||||
|
||||
struct node_status_t status;
|
||||
|
||||
EVP_CIPHER *cipher; /* Cipher type for UDP packets */
|
||||
const EVP_CIPHER *cipher; /* Cipher type for UDP packets */
|
||||
char *key; /* Cipher key and iv */
|
||||
int keylength; /* Cipher key and iv length*/
|
||||
|
||||
const EVP_MD *digest; /* Digest type for MAC */
|
||||
int maclength; /* Length of MAC */
|
||||
|
||||
list_t *queue; /* Queue for packets awaiting to be encrypted */
|
||||
|
||||
struct node_t *nexthop; /* nearest node from us to him */
|
||||
|
@ -60,10 +64,14 @@ typedef struct node_t {
|
|||
avl_tree_t *edge_tree; /* Edges with this node as one of the endpoints */
|
||||
|
||||
struct connection_t *connection; /* Connection associated with this node (if a direct connection exists) */
|
||||
|
||||
unsigned int sent_seqno; /* Sequence number last sent to this node */
|
||||
unsigned int received_seqno; /* Sequence number last received from this node */
|
||||
} node_t;
|
||||
|
||||
extern struct node_t *myself;
|
||||
extern avl_tree_t *node_tree;
|
||||
extern avl_tree_t *node_udp_tree;
|
||||
|
||||
extern void init_nodes(void);
|
||||
extern void exit_nodes(void);
|
||||
|
@ -72,8 +80,7 @@ extern void free_node(node_t *n);
|
|||
extern void node_add(node_t *n);
|
||||
extern void node_del(node_t *n);
|
||||
extern node_t *lookup_node(char *);
|
||||
extern node_t *lookup_node_udp(struct addrinfo *);
|
||||
extern node_t *lookup_node_udp(ipv4_t, port_t);
|
||||
extern void dump_nodes(void);
|
||||
|
||||
|
||||
#endif /* __TINC_NODE_H__ */
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
device.c -- Interaction with OpenBSD tun device
|
||||
Copyright (C) 2001 Ivo Timmermans <itimmermans@bigfoot.com>,
|
||||
2001 Guus Sliepen <guus@sliepen.warande.net>
|
||||
Copyright (C) 2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
|
||||
2001-2002 Guus Sliepen <guus@sliepen.warande.net>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,9 +17,30 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: device.c,v 1.1.2.2 2001/10/12 15:52:03 guus Exp $
|
||||
$Id: device.c,v 1.1.2.3 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/uio.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/socket.h>
|
||||
#include <fcntl.h>
|
||||
#include <net/if.h>
|
||||
#include <unistd.h>
|
||||
#include <syslog.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <utils.h>
|
||||
#include "conf.h"
|
||||
#include "net.h"
|
||||
#include "subnet.h"
|
||||
|
||||
#include "system.h"
|
||||
|
||||
#define DEFAULT_DEVICE "/dev/tun0"
|
||||
|
||||
#define DEVICE_TYPE_ETHERTAP 0
|
||||
|
@ -27,24 +48,29 @@
|
|||
|
||||
int device_fd = -1;
|
||||
int device_type;
|
||||
char *device_fname;
|
||||
char *device;
|
||||
char *interface;
|
||||
char *device_info;
|
||||
|
||||
int device_total_in = 0;
|
||||
int device_total_out = 0;
|
||||
|
||||
extern subnet_t mymac;
|
||||
|
||||
/*
|
||||
open the local ethertap device
|
||||
*/
|
||||
int setup_device(void)
|
||||
{
|
||||
if(!get_config_string(lookup_config(config_tree, "Device"), &device_fname)))
|
||||
device_fname = DEFAULT_DEVICE;
|
||||
if(!get_config_string(lookup_config(config_tree, "Device"), &device))
|
||||
device = DEFAULT_DEVICE;
|
||||
|
||||
if(!get_config_string(lookup_config(config_tree, "Interface"), &interface))
|
||||
interface = netname;
|
||||
cp
|
||||
if((device_fd = open(device_fname, O_RDWR | O_NONBLOCK)) < 0)
|
||||
if((device_fd = open(device, O_RDWR | O_NONBLOCK)) < 0)
|
||||
{
|
||||
syslog(LOG_ERR, _("Could not open %s: %m"), device_fname);
|
||||
syslog(LOG_ERR, _("Could not open %s: %m"), device);
|
||||
return -1;
|
||||
}
|
||||
cp
|
||||
|
@ -60,28 +86,35 @@ cp
|
|||
|
||||
device_info = _("OpenBSD tun device");
|
||||
|
||||
syslog(LOG_INFO, _("%s is a %s"), device_fname, device_info);
|
||||
syslog(LOG_INFO, _("%s is a %s"), device, device_info);
|
||||
cp
|
||||
return 0;
|
||||
}
|
||||
|
||||
void close_device(void)
|
||||
{
|
||||
cp
|
||||
close(device_fd);
|
||||
cp
|
||||
}
|
||||
|
||||
int read_packet(vpn_packet_t *packet)
|
||||
{
|
||||
int lenin;
|
||||
u_int32_t type;
|
||||
cp
|
||||
struct iovec vector[2] = {{&type, sizeof(type)}, {packet->data + 14, MTU - 14}};
|
||||
cp
|
||||
|
||||
if((lenin = readv(device_fd, vector, 2)) <= 0)
|
||||
{
|
||||
syslog(LOG_ERR, _("Error while reading from %s %s: %m"), device_info, device_fname);
|
||||
syslog(LOG_ERR, _("Error while reading from %s %s: %m"), device_info, device);
|
||||
return -1;
|
||||
}
|
||||
|
||||
memcpy(vp->data, mymac.net.mac.address.x, 6);
|
||||
memcpy(vp->data + 6, mymac.net.mac.address.x, 6);
|
||||
vp->data[12] = 0x08;
|
||||
vp->data[13] = 0x00;
|
||||
memcpy(packet->data, mymac.net.mac.address.x, 6);
|
||||
memcpy(packet->data + 6, mymac.net.mac.address.x, 6);
|
||||
packet->data[12] = 0x08;
|
||||
packet->data[13] = 0x00;
|
||||
|
||||
packet->len = lenin + 10;
|
||||
|
||||
|
@ -89,7 +122,7 @@ cp
|
|||
|
||||
if(debug_lvl >= DEBUG_TRAFFIC)
|
||||
{
|
||||
syslog(LOG_DEBUG, _("Read packet of %d bytes from %s"), device_info, packet.len);
|
||||
syslog(LOG_DEBUG, _("Read packet of %d bytes from %s"), packet->len, device_info);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -99,20 +132,32 @@ cp
|
|||
int write_packet(vpn_packet_t *packet)
|
||||
{
|
||||
u_int32_t type = htonl(AF_INET);
|
||||
struct iovec vector[2];
|
||||
cp
|
||||
if(debug_lvl >= DEBUG_TRAFFIC)
|
||||
syslog(LOG_DEBUG, _("Writing packet of %d bytes to %s"),
|
||||
packet->len, device_info);
|
||||
|
||||
|
||||
struct iovec vector[2] = {{&type, sizeof(type)}, {packet->data + 14, packet->len - 14}};
|
||||
vector[0].iov_base = &type;
|
||||
vector[0].iov_len = sizeof(type);
|
||||
vector[1].iov_base = packet->data + 14;
|
||||
vector[1].iov_len = packet->len - 14;
|
||||
|
||||
if(writev(device_fd, vector, 2) < 0)
|
||||
{
|
||||
syslog(LOG_ERR, _("Can't write to %s %s: %m"), device_info, packet.len);
|
||||
syslog(LOG_ERR, _("Can't write to %s %s: %m"), device_info, device);
|
||||
return -1;
|
||||
}
|
||||
|
||||
device_total_out += packet->len;
|
||||
cp
|
||||
}
|
||||
|
||||
void dump_device_stats(void)
|
||||
{
|
||||
cp
|
||||
syslog(LOG_DEBUG, _("Statistics for %s %s:"), device_info, device);
|
||||
syslog(LOG_DEBUG, _(" total bytes in: %10d"), device_total_in);
|
||||
syslog(LOG_DEBUG, _(" total bytes out: %10d"), device_total_out);
|
||||
cp
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
process.c -- process management functions
|
||||
Copyright (C) 1999-2001 Ivo Timmermans <itimmermans@bigfoot.com>,
|
||||
2000,2001 Guus Sliepen <guus@sliepen.warande.net>
|
||||
Copyright (C) 1999-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
|
||||
2000-2002 Guus Sliepen <guus@sliepen.warande.net>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: process.c,v 1.1.2.32 2001/11/03 22:53:02 guus Exp $
|
||||
$Id: process.c,v 1.1.2.33 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
@ -59,6 +59,10 @@ sigset_t emptysigset;
|
|||
|
||||
static int saved_debug_lvl = 0;
|
||||
|
||||
extern int sighup;
|
||||
extern int sigalrm;
|
||||
extern int do_purge;
|
||||
|
||||
void memory_full(int size)
|
||||
{
|
||||
syslog(LOG_ERR, _("Memory exhausted (couldn't allocate %d bytes), exiting."), size);
|
||||
|
@ -342,6 +346,7 @@ sigsegv_handler(int a, siginfo_t *info, void *b)
|
|||
act.sa_mask = emptysigset;
|
||||
act.sa_flags = SA_SIGINFO;
|
||||
act.sa_sigaction = sigsegv_square;
|
||||
sigaction(SIGSEGV, &act, NULL);
|
||||
|
||||
close_network_connections();
|
||||
sleep(5);
|
||||
|
@ -351,7 +356,7 @@ sigsegv_handler(int a, siginfo_t *info, void *b)
|
|||
else
|
||||
{
|
||||
syslog(LOG_NOTICE, _("Not restarting."));
|
||||
exit(0);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -382,6 +387,14 @@ sigint_handler(int a, siginfo_t *info, void *b)
|
|||
}
|
||||
}
|
||||
|
||||
RETSIGTYPE
|
||||
sigalrm_handler(int a, siginfo_t *info, void *b)
|
||||
{
|
||||
if(debug_lvl > DEBUG_NOTHING)
|
||||
syslog(LOG_NOTICE, _("Got ALRM signal"));
|
||||
sigalrm = 1;
|
||||
}
|
||||
|
||||
RETSIGTYPE
|
||||
sigusr1_handler(int a, siginfo_t *info, void *b)
|
||||
{
|
||||
|
@ -397,6 +410,13 @@ sigusr2_handler(int a, siginfo_t *info, void *b)
|
|||
dump_subnets();
|
||||
}
|
||||
|
||||
RETSIGTYPE
|
||||
sigwinch_handler(int a, siginfo_t *info, void *b)
|
||||
{
|
||||
extern int do_purge;
|
||||
do_purge = 1;
|
||||
}
|
||||
|
||||
RETSIGTYPE
|
||||
unexpected_signal_handler(int a, siginfo_t *info, void *b)
|
||||
{
|
||||
|
@ -427,7 +447,8 @@ struct {
|
|||
{ SIGUSR1, sigusr1_handler },
|
||||
{ SIGUSR2, sigusr2_handler },
|
||||
{ SIGCHLD, ignore_signal_handler },
|
||||
{ SIGALRM, ignore_signal_handler },
|
||||
{ SIGALRM, sigalrm_handler },
|
||||
{ SIGWINCH, sigwinch_handler },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
|
@ -447,7 +468,7 @@ setup_signals(void)
|
|||
for(i = 0; i < NSIG; i++)
|
||||
{
|
||||
if(!do_detach)
|
||||
act.sa_sigaction = SIG_DFL;
|
||||
act.sa_sigaction = (void(*)(int, siginfo_t *, void *))SIG_DFL;
|
||||
else
|
||||
act.sa_sigaction = unexpected_signal_handler;
|
||||
sigaction(i, &act, NULL);
|
||||
|
@ -455,7 +476,7 @@ setup_signals(void)
|
|||
|
||||
/* If we didn't detach, allow coredumps */
|
||||
if(!do_detach)
|
||||
sighandlers[3].handler = SIG_DFL;
|
||||
sighandlers[3].handler = (void(*)(int, siginfo_t *, void *))SIG_DFL;
|
||||
|
||||
/* Then, for each known signal that we want to catch, assign a
|
||||
handler to the signal, with error checking this time. */
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
process.h -- header file for process.c
|
||||
Copyright (C) 1999-2001 Ivo Timmermans <itimmermans@bigfoot.com>,
|
||||
2000,2001 Guus Sliepen <guus@sliepen.warande.net>
|
||||
Copyright (C) 1999-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
|
||||
2000-2002 Guus Sliepen <guus@sliepen.warande.net>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: process.h,v 1.1.2.9 2001/09/01 12:36:53 guus Exp $
|
||||
$Id: process.h,v 1.1.2.10 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
#ifndef __TINC_PROCESS_H__
|
||||
|
|
1392
src/protocol.c
1392
src/protocol.c
File diff suppressed because it is too large
Load diff
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: protocol.h,v 1.5.4.24 2001/10/28 08:41:19 guus Exp $
|
||||
$Id: protocol.h,v 1.5.4.25 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
#ifndef __TINC_PROTOCOL_H__
|
||||
|
@ -31,7 +31,7 @@
|
|||
incompatible version have different protocols.
|
||||
*/
|
||||
|
||||
#define PROT_CURRENT 11
|
||||
#define PROT_CURRENT 12
|
||||
|
||||
/* Request numbers */
|
||||
|
||||
|
@ -40,7 +40,7 @@ enum {
|
|||
ID = 0, METAKEY, CHALLENGE, CHAL_REPLY, ACK,
|
||||
STATUS, ERROR, TERMREQ,
|
||||
PING, PONG,
|
||||
ADD_NODE, DEL_NODE,
|
||||
// ADD_NODE, DEL_NODE,
|
||||
ADD_SUBNET, DEL_SUBNET,
|
||||
ADD_EDGE, DEL_EDGE,
|
||||
KEY_CHANGED, REQ_KEY, ANS_KEY,
|
||||
|
@ -53,33 +53,58 @@ enum {
|
|||
#define MAX_STRING_SIZE 1024
|
||||
#define MAX_STRING "%1024s"
|
||||
|
||||
extern int (*request_handlers[])(connection_t*);
|
||||
/* Basic functions */
|
||||
|
||||
extern int send_id(connection_t*);
|
||||
extern int send_metakey(connection_t*);
|
||||
extern int send_challenge(connection_t*);
|
||||
extern int send_chal_reply(connection_t*);
|
||||
extern int send_ack(connection_t*);
|
||||
extern int send_status(connection_t*, int, char*);
|
||||
extern int send_error(connection_t*, int, char*);
|
||||
extern int send_termreq(connection_t*);
|
||||
extern int send_ping(connection_t*);
|
||||
extern int send_pong(connection_t*);
|
||||
extern int send_add_node(connection_t*, node_t*);
|
||||
extern int send_del_node(connection_t*, node_t*);
|
||||
extern int send_add_subnet(connection_t*, subnet_t*);
|
||||
extern int send_del_subnet(connection_t*, subnet_t*);
|
||||
extern int send_add_edge(connection_t*, edge_t*);
|
||||
extern int send_del_edge(connection_t*, edge_t*);
|
||||
extern int send_key_changed(connection_t*, node_t*);
|
||||
extern int send_req_key(connection_t*, node_t*, node_t*);
|
||||
extern int send_ans_key(connection_t*, node_t*, node_t*, char*);
|
||||
extern int send_tcppacket(connection_t *, vpn_packet_t *);
|
||||
|
||||
/* Old functions */
|
||||
|
||||
extern int notify_others(connection_t *, connection_t *, int (*function)(connection_t*, connection_t*));
|
||||
extern int send_request(connection_t*, const char*, ...);
|
||||
extern int receive_request(connection_t *);
|
||||
extern int check_id(char *);
|
||||
|
||||
/* Requests */
|
||||
|
||||
extern int send_id(connection_t *);
|
||||
extern int send_metakey(connection_t *);
|
||||
extern int send_challenge(connection_t *);
|
||||
extern int send_chal_reply(connection_t *);
|
||||
extern int send_ack(connection_t *);
|
||||
extern int send_status(connection_t *, int, char *);
|
||||
extern int send_error(connection_t *, int, char *);
|
||||
extern int send_termreq(connection_t *);
|
||||
extern int send_ping(connection_t *);
|
||||
extern int send_pong(connection_t *);
|
||||
// extern int send_add_node(connection_t *, node_t *);
|
||||
// extern int send_del_node(connection_t *, node_t *);
|
||||
extern int send_add_subnet(connection_t *, subnet_t *);
|
||||
extern int send_del_subnet(connection_t *, subnet_t *);
|
||||
extern int send_add_edge(connection_t *, edge_t *);
|
||||
extern int send_del_edge(connection_t *, edge_t *);
|
||||
extern int send_key_changed(connection_t *, node_t *);
|
||||
extern int send_req_key(connection_t *, node_t *, node_t *);
|
||||
extern int send_ans_key(connection_t *, node_t *, node_t *);
|
||||
extern int send_tcppacket(connection_t *, vpn_packet_t *);
|
||||
|
||||
/* Request handlers */
|
||||
|
||||
extern int (*request_handlers[])(connection_t *);
|
||||
|
||||
extern int id_h(connection_t *);
|
||||
extern int metakey_h(connection_t *);
|
||||
extern int challenge_h(connection_t *);
|
||||
extern int chal_reply_h(connection_t *);
|
||||
extern int ack_h(connection_t *);
|
||||
extern int status_h(connection_t *);
|
||||
extern int error_h(connection_t *);
|
||||
extern int termreq_h(connection_t *);
|
||||
extern int ping_h(connection_t *);
|
||||
extern int pong_h(connection_t *);
|
||||
// extern int add_node_h(connection_t *);
|
||||
// extern int del_node_h(connection_t *);
|
||||
extern int add_subnet_h(connection_t *);
|
||||
extern int del_subnet_h(connection_t *);
|
||||
extern int add_edge_h(connection_t *);
|
||||
extern int del_edge_h(connection_t *);
|
||||
extern int key_changed_h(connection_t *);
|
||||
extern int req_key_h(connection_t *);
|
||||
extern int ans_key_h(connection_t *);
|
||||
extern int tcppacket_h(connection_t *);
|
||||
|
||||
#endif /* __TINC_PROTOCOL_H__ */
|
||||
|
|
52
src/route.c
52
src/route.c
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
route.c -- routing
|
||||
Copyright (C) 2000,2001 Ivo Timmermans <itimmermans@bigfoot.com>,
|
||||
2000,2001 Guus Sliepen <guus@sliepen.warande.net>
|
||||
Copyright (C) 2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
|
||||
2000-2002 Guus Sliepen <guus@sliepen.warande.net>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,17 +17,17 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: route.c,v 1.1.2.21 2001/11/16 17:40:50 zarq Exp $
|
||||
$Id: route.c,v 1.1.2.22 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifdef HAVE_FREEBSD
|
||||
#if defined(HAVE_FREEBSD) || defined(HAVE_OPENBSD)
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#ifdef HAVE_SOLARIS
|
||||
#if defined(HAVE_SOLARIS) || defined(HAVE_OPENBSD)
|
||||
#include <net/if.h>
|
||||
#define ETHER_ADDR_LEN 6
|
||||
#else
|
||||
|
@ -66,7 +66,7 @@ cp
|
|||
if(!subnet || subnet->owner!=myself)
|
||||
{
|
||||
if(debug_lvl >= DEBUG_TRAFFIC)
|
||||
syslog(LOG_INFO, _("Learned new MAC address %hhx:%hhx:%hhx:%hhx:%hhx:%hhx"),
|
||||
syslog(LOG_INFO, _("Learned new MAC address %hx:%hx:%hx:%hx:%hx:%hx"),
|
||||
address->x[0], address->x[1], address->x[2], address->x[3], address->x[4], address->x[5]);
|
||||
|
||||
subnet = new_subnet();
|
||||
|
@ -103,10 +103,26 @@ cp
|
|||
return NULL;
|
||||
}
|
||||
|
||||
node_t *route_ipv4(vpn_packet_t *packet)
|
||||
{
|
||||
ipv4_t dest;
|
||||
subnet_t *subnet;
|
||||
cp
|
||||
#ifdef HAVE_SOLARIS
|
||||
/* The other form gives bus errors on a SparcStation 20. */
|
||||
dest = ((packet->data[30] * 0x100 + packet->data[31]) * 0x100 + packet->data[32]) * 0x100 + packet->data[33];
|
||||
#else
|
||||
dest = ntohl(*((unsigned long*)(&packet->data[30])));
|
||||
#endif
|
||||
cp
|
||||
subnet = lookup_subnet_ipv4(&dest);
|
||||
cp
|
||||
if(!subnet)
|
||||
{
|
||||
if(debug_lvl >= DEBUG_TRAFFIC)
|
||||
{
|
||||
syslog(LOG_WARNING, _("Cannot route packet: unknown destination address %d.%d.%d.%d"),
|
||||
packet->data[30], packet->data[31], packet->data[32], packet->data[33]);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
@ -115,21 +131,25 @@ cp
|
|||
return subnet->owner;
|
||||
}
|
||||
|
||||
node_t *route_ip(vpn_packet_t *packet)
|
||||
node_t *route_ipv6(vpn_packet_t *packet)
|
||||
{
|
||||
struct addrinfo *dest;
|
||||
subnet_t *subnet;
|
||||
cp
|
||||
#warning FIXME
|
||||
memcpy(&dest, &packet->data[30], 0);
|
||||
|
||||
subnet = lookup_subnet_ip(&dest);
|
||||
subnet = lookup_subnet_ipv6((ipv6_t *)&packet->data[38]);
|
||||
cp
|
||||
if(!subnet)
|
||||
{
|
||||
if(debug_lvl >= DEBUG_TRAFFIC)
|
||||
{
|
||||
syslog(LOG_WARNING, _("Cannot route packet: unknown IP destination address"));
|
||||
syslog(LOG_WARNING, _("Cannot route packet: unknown IPv6 destination address %hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx"),
|
||||
ntohs(*(short unsigned int *)&packet->data[38]),
|
||||
ntohs(*(short unsigned int *)&packet->data[40]),
|
||||
ntohs(*(short unsigned int *)&packet->data[42]),
|
||||
ntohs(*(short unsigned int *)&packet->data[44]),
|
||||
ntohs(*(short unsigned int *)&packet->data[46]),
|
||||
ntohs(*(short unsigned int *)&packet->data[48]),
|
||||
ntohs(*(short unsigned int *)&packet->data[50]),
|
||||
ntohs(*(short unsigned int *)&packet->data[52]));
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
@ -143,7 +163,7 @@ void route_arp(vpn_packet_t *packet)
|
|||
struct ether_arp *arp;
|
||||
subnet_t *subnet;
|
||||
unsigned char ipbuf[4];
|
||||
struct addrinfo *dest;
|
||||
ipv4_t dest;
|
||||
cp
|
||||
/* First, snatch the source address from the ARP packet */
|
||||
|
||||
|
@ -172,9 +192,9 @@ cp
|
|||
}
|
||||
|
||||
/* Check if the IP address exists on the VPN */
|
||||
#warning FIXME
|
||||
|
||||
dest = ntohl(*((unsigned long*)(arp->arp_tpa)));
|
||||
subnet = lookup_subnet_ip(&dest);
|
||||
subnet = lookup_subnet_ipv4(&dest);
|
||||
|
||||
if(!subnet)
|
||||
{
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
route.h -- header file for route.c
|
||||
Copyright (C) 2000,2001 Ivo Timmermans <zarq@iname.com>
|
||||
2000,2001 Guus Sliepen <guus@sliepen.warande.net>
|
||||
Copyright (C) 2000-2002 Ivo Timmermans <zarq@iname.com>
|
||||
2000-2002 Guus Sliepen <guus@sliepen.warande.net>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: route.h,v 1.1.2.4 2001/10/27 12:13:17 guus Exp $
|
||||
$Id: route.h,v 1.1.2.5 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
#ifndef __TINC_ROUTE_H__
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
device.c -- Interaction with Solaris tun device
|
||||
Copyright (C) 2001 Ivo Timmermans <itimmermans@bigfoot.com>,
|
||||
2001 Guus Sliepen <guus@sliepen.warande.net>
|
||||
Copyright (C) 2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
|
||||
2001-2002 Guus Sliepen <guus@sliepen.warande.net>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: device.c,v 1.1.2.3 2001/11/05 19:06:07 guus Exp $
|
||||
$Id: device.c,v 1.1.2.4 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
|
||||
|
@ -157,7 +157,7 @@ cp
|
|||
|
||||
if(debug_lvl >= DEBUG_TRAFFIC)
|
||||
{
|
||||
syslog(LOG_DEBUG, _("Read packet of %d bytes from %s"), device_info, packet->len);
|
||||
syslog(LOG_DEBUG, _("Read packet of %d bytes from %s"), packet->len, device_info);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
209
src/subnet.c
209
src/subnet.c
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
subnet.c -- handle subnet lookups and lists
|
||||
Copyright (C) 2000,2001 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2000,2001 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
Copyright (C) 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
|
||||
2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: subnet.c,v 1.1.2.28 2001/10/30 12:59:12 guus Exp $
|
||||
$Id: subnet.c,v 1.1.2.29 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
@ -25,6 +25,10 @@
|
|||
#include <stdio.h>
|
||||
#include <syslog.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <netdb.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include "conf.h"
|
||||
#include "net.h"
|
||||
|
@ -102,10 +106,12 @@ cp
|
|||
case SUBNET_IPV6:
|
||||
return subnet_compare_ipv6(a, b);
|
||||
default:
|
||||
syslog(LOG_ERR, _("subnet_compare() was called with unknown subnet type %d, restarting!"), a->type);
|
||||
sighup = 1;
|
||||
return 0;
|
||||
syslog(LOG_ERR, _("subnet_compare() was called with unknown subnet type %d, exitting!"), a->type);
|
||||
cp_trace();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Initialising trees */
|
||||
|
@ -178,65 +184,108 @@ cp
|
|||
|
||||
subnet_t *str2net(char *subnetstr)
|
||||
{
|
||||
int type;
|
||||
int i, l;
|
||||
subnet_t *subnet;
|
||||
cp
|
||||
if(sscanf(subnetstr, "%d,", &type) != 1)
|
||||
return NULL;
|
||||
unsigned short int x[6];
|
||||
cp
|
||||
subnet = new_subnet();
|
||||
cp
|
||||
switch(type)
|
||||
if(sscanf(subnetstr, "%hu.%hu.%hu.%hu/%d",
|
||||
&x[0],
|
||||
&x[1],
|
||||
&x[2],
|
||||
&x[3],
|
||||
&subnet->net.ipv4.masklength) == 5)
|
||||
{
|
||||
case SUBNET_MAC:
|
||||
if(sscanf(subnetstr, "%d,%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", &subnet->type,
|
||||
&subnet->net.mac.address.x[0],
|
||||
&subnet->net.mac.address.x[1],
|
||||
&subnet->net.mac.address.x[2],
|
||||
&subnet->net.mac.address.x[3],
|
||||
&subnet->net.mac.address.x[4],
|
||||
&subnet->net.mac.address.x[5]) != 7)
|
||||
{
|
||||
free_subnet(subnet);
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
case SUBNET_IPV4:
|
||||
if(sscanf(subnetstr, "%d,%lx/%lx", &subnet->type, &subnet->net.ipv4.address, &subnet->net.ipv4.mask) != 3)
|
||||
{
|
||||
free_subnet(subnet);
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
case SUBNET_IPV6:
|
||||
if(sscanf(subnetstr, "%d,%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx/%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx", &subnet->type,
|
||||
&subnet->net.ipv6.address.x[0],
|
||||
&subnet->net.ipv6.address.x[1],
|
||||
&subnet->net.ipv6.address.x[2],
|
||||
&subnet->net.ipv6.address.x[3],
|
||||
&subnet->net.ipv6.address.x[4],
|
||||
&subnet->net.ipv6.address.x[5],
|
||||
&subnet->net.ipv6.address.x[6],
|
||||
&subnet->net.ipv6.address.x[7],
|
||||
&subnet->net.ipv6.mask.x[0],
|
||||
&subnet->net.ipv6.mask.x[1],
|
||||
&subnet->net.ipv6.mask.x[2],
|
||||
&subnet->net.ipv6.mask.x[3],
|
||||
&subnet->net.ipv6.mask.x[4],
|
||||
&subnet->net.ipv6.mask.x[5],
|
||||
&subnet->net.ipv6.mask.x[6],
|
||||
&subnet->net.ipv6.mask.x[7]) != 17)
|
||||
{
|
||||
free_subnet(subnet);
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
free_subnet(subnet);
|
||||
return NULL;
|
||||
subnet->type = SUBNET_IPV4;
|
||||
subnet->net.ipv4.address = (((((x[0] << 8) + x[1]) << 8) + x[2]) << 8) + x[3];
|
||||
subnet->net.ipv4.mask = ~((1 << (32 - subnet->net.ipv4.masklength)) - 1);
|
||||
return subnet;
|
||||
}
|
||||
cp
|
||||
return subnet;
|
||||
|
||||
if(sscanf(subnetstr, "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx/%d",
|
||||
&subnet->net.ipv6.address.x[0],
|
||||
&subnet->net.ipv6.address.x[1],
|
||||
&subnet->net.ipv6.address.x[2],
|
||||
&subnet->net.ipv6.address.x[3],
|
||||
&subnet->net.ipv6.address.x[4],
|
||||
&subnet->net.ipv6.address.x[5],
|
||||
&subnet->net.ipv6.address.x[6],
|
||||
&subnet->net.ipv6.address.x[7],
|
||||
&subnet->net.ipv6.masklength) == 9)
|
||||
{
|
||||
subnet->type = SUBNET_IPV6;
|
||||
for(l = subnet->net.ipv6.masklength, i = 0; i < 8; l -= 16, i++)
|
||||
{
|
||||
subnet->net.ipv6.address.x[i] = htons(subnet->net.ipv6.address.x[i]);
|
||||
if(l >= 16)
|
||||
subnet->net.ipv6.mask.x[i] = 65535;
|
||||
else if (l > 0)
|
||||
subnet->net.ipv6.mask.x[i] = htons(65536 - (1 << l));
|
||||
else
|
||||
subnet->net.ipv6.mask.x[i] = 0;
|
||||
}
|
||||
return subnet;
|
||||
}
|
||||
|
||||
if(sscanf(subnetstr, "%hu.%hu.%hu.%hu",
|
||||
&x[0],
|
||||
&x[1],
|
||||
&x[2],
|
||||
&x[3]) == 4)
|
||||
{
|
||||
subnet->type = SUBNET_IPV4;
|
||||
subnet->net.ipv4.address = (((((x[0] << 8) + x[1]) << 8) + x[2]) << 8) + x[3];
|
||||
subnet->net.ipv4.mask = ~0;
|
||||
subnet->net.ipv4.masklength = 32;
|
||||
return subnet;
|
||||
}
|
||||
|
||||
if(sscanf(subnetstr, "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx",
|
||||
&subnet->net.ipv6.address.x[0],
|
||||
&subnet->net.ipv6.address.x[1],
|
||||
&subnet->net.ipv6.address.x[2],
|
||||
&subnet->net.ipv6.address.x[3],
|
||||
&subnet->net.ipv6.address.x[4],
|
||||
&subnet->net.ipv6.address.x[5],
|
||||
&subnet->net.ipv6.address.x[6],
|
||||
&subnet->net.ipv6.address.x[7]) == 8)
|
||||
{
|
||||
subnet->type = SUBNET_IPV6;
|
||||
subnet->net.ipv6.masklength = 128;
|
||||
for(l = subnet->net.ipv6.masklength, i = 0; i < 8; l -= 16, i++)
|
||||
{
|
||||
subnet->net.ipv6.address.x[i] = htons(subnet->net.ipv6.address.x[i]);
|
||||
if(l >= 16)
|
||||
subnet->net.ipv6.mask.x[i] = 65535;
|
||||
else if (l > 0)
|
||||
subnet->net.ipv6.mask.x[i] = htons(65536 - (1 << l));
|
||||
else
|
||||
subnet->net.ipv6.mask.x[i] = 0;
|
||||
}
|
||||
return subnet;
|
||||
}
|
||||
|
||||
if(sscanf(subnetstr, "%hx:%hx:%hx:%hx:%hx:%hx",
|
||||
&x[0],
|
||||
&x[1],
|
||||
&x[2],
|
||||
&x[3],
|
||||
&x[4],
|
||||
&x[5]) == 6)
|
||||
{
|
||||
subnet->type = SUBNET_MAC;
|
||||
subnet->net.mac.address.x[0] = x[0];
|
||||
subnet->net.mac.address.x[1] = x[1];
|
||||
subnet->net.mac.address.x[2] = x[2];
|
||||
subnet->net.mac.address.x[3] = x[3];
|
||||
subnet->net.mac.address.x[4] = x[4];
|
||||
subnet->net.mac.address.x[5] = x[5];
|
||||
return subnet;
|
||||
}
|
||||
|
||||
free(subnet);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char *net2str(subnet_t *subnet)
|
||||
|
@ -246,7 +295,7 @@ cp
|
|||
switch(subnet->type)
|
||||
{
|
||||
case SUBNET_MAC:
|
||||
asprintf(&netstr, "%d,%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", subnet->type,
|
||||
asprintf(&netstr, "%hx:%hx:%hx:%hx:%hx:%hx",
|
||||
subnet->net.mac.address.x[0],
|
||||
subnet->net.mac.address.x[1],
|
||||
subnet->net.mac.address.x[2],
|
||||
|
@ -255,26 +304,24 @@ cp
|
|||
subnet->net.mac.address.x[5]);
|
||||
break;
|
||||
case SUBNET_IPV4:
|
||||
asprintf(&netstr, "%d,%lx/%lx", subnet->type, subnet->net.ipv4.address, subnet->net.ipv4.mask);
|
||||
asprintf(&netstr, "%hu.%hu.%hu.%hu/%d",
|
||||
(unsigned short int)((subnet->net.ipv4.address >> 24) & 255),
|
||||
(unsigned short int)((subnet->net.ipv4.address >> 16) & 255),
|
||||
(unsigned short int)((subnet->net.ipv4.address >> 8) & 255),
|
||||
(unsigned short int)(subnet->net.ipv4.address & 255),
|
||||
subnet->net.ipv4.masklength);
|
||||
break;
|
||||
case SUBNET_IPV6:
|
||||
asprintf(&netstr, "%d,%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx/%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx", subnet->type,
|
||||
subnet->net.ipv6.address.x[0],
|
||||
subnet->net.ipv6.address.x[1],
|
||||
subnet->net.ipv6.address.x[2],
|
||||
subnet->net.ipv6.address.x[3],
|
||||
subnet->net.ipv6.address.x[4],
|
||||
subnet->net.ipv6.address.x[5],
|
||||
subnet->net.ipv6.address.x[6],
|
||||
subnet->net.ipv6.address.x[7],
|
||||
subnet->net.ipv6.mask.x[0],
|
||||
subnet->net.ipv6.mask.x[1],
|
||||
subnet->net.ipv6.mask.x[2],
|
||||
subnet->net.ipv6.mask.x[3],
|
||||
subnet->net.ipv6.mask.x[4],
|
||||
subnet->net.ipv6.mask.x[5],
|
||||
subnet->net.ipv6.mask.x[6],
|
||||
subnet->net.ipv6.mask.x[7]);
|
||||
asprintf(&netstr, "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx/%d",
|
||||
ntohs(subnet->net.ipv6.address.x[0]),
|
||||
ntohs(subnet->net.ipv6.address.x[1]),
|
||||
ntohs(subnet->net.ipv6.address.x[2]),
|
||||
ntohs(subnet->net.ipv6.address.x[3]),
|
||||
ntohs(subnet->net.ipv6.address.x[4]),
|
||||
ntohs(subnet->net.ipv6.address.x[5]),
|
||||
ntohs(subnet->net.ipv6.address.x[6]),
|
||||
ntohs(subnet->net.ipv6.address.x[7]),
|
||||
subnet->net.ipv6.masklength);
|
||||
break;
|
||||
default:
|
||||
asprintf(&netstr, _("unknown subnet type"));
|
||||
|
@ -342,8 +389,8 @@ subnet_t *lookup_subnet_ipv6(ipv6_t *address)
|
|||
int i;
|
||||
cp
|
||||
subnet.type = SUBNET_IPV6;
|
||||
memcpy(&subnet.net.ipv6.address, address, sizeof(ipv6_t));
|
||||
memset(&subnet.net.ipv6.mask, 0xFF, 16);
|
||||
memcpy(subnet.net.ipv6.address.x, address, sizeof(ipv6_t));
|
||||
memset(subnet.net.ipv6.mask.x, 0xFF, 16);
|
||||
|
||||
p = (subnet_t *)avl_search_closest_greater(subnet_tree, &subnet);
|
||||
|
||||
|
@ -366,7 +413,7 @@ cp
|
|||
{
|
||||
subnet = (subnet_t *)node->data;
|
||||
netstr = net2str(subnet);
|
||||
syslog(LOG_DEBUG, " %s owner %s", netstr, subnet->owner->name);
|
||||
syslog(LOG_DEBUG, _(" %s owner %s"), netstr, subnet->owner->name);
|
||||
free(netstr);
|
||||
}
|
||||
syslog(LOG_DEBUG, _("End of subnet list."));
|
||||
|
|
28
src/subnet.h
28
src/subnet.h
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: subnet.h,v 1.1.2.14 2001/11/16 12:10:54 zarq Exp $
|
||||
$Id: subnet.h,v 1.1.2.15 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
#ifndef __TINC_SUBNET_H__
|
||||
|
@ -28,7 +28,8 @@
|
|||
enum
|
||||
{
|
||||
SUBNET_MAC = 0,
|
||||
SUBNET_IP,
|
||||
SUBNET_IPV4,
|
||||
SUBNET_IPV6,
|
||||
SUBNET_TYPES /* Guardian */
|
||||
};
|
||||
|
||||
|
@ -37,11 +38,19 @@ typedef struct subnet_mac_t
|
|||
mac_t address;
|
||||
} subnet_mac_t;
|
||||
|
||||
typedef struct subnet_ip_t
|
||||
typedef struct subnet_ipv4_t
|
||||
{
|
||||
struct addrinfo *address;
|
||||
struct addrinfo *mask;
|
||||
} subnet_ip_t;
|
||||
ipv4_t address;
|
||||
ipv4_t mask;
|
||||
int masklength;
|
||||
} subnet_ipv4_t;
|
||||
|
||||
typedef struct subnet_ipv6_t
|
||||
{
|
||||
ipv6_t address;
|
||||
ipv6_t mask;
|
||||
int masklength;
|
||||
} subnet_ipv6_t;
|
||||
|
||||
#include "node.h"
|
||||
|
||||
|
@ -56,9 +65,9 @@ typedef struct subnet_t {
|
|||
union net
|
||||
{
|
||||
subnet_mac_t mac;
|
||||
subnet_ip_t ip;
|
||||
subnet_ipv4_t ipv4;
|
||||
subnet_ipv6_t ipv6;
|
||||
} net;
|
||||
|
||||
} subnet_t;
|
||||
|
||||
extern subnet_t *new_subnet(void);
|
||||
|
@ -73,7 +82,8 @@ extern char *net2str(subnet_t *);
|
|||
extern subnet_t *str2net(char *);
|
||||
extern subnet_t *lookup_subnet(struct node_t *, subnet_t *);
|
||||
extern subnet_t *lookup_subnet_mac(mac_t *);
|
||||
extern subnet_t *lookup_subnet_ip(struct addrinfo *);
|
||||
extern subnet_t *lookup_subnet_ipv4(ipv4_t *);
|
||||
extern subnet_t *lookup_subnet_ipv6(ipv6_t *);
|
||||
extern void dump_subnets(void);
|
||||
|
||||
#endif /* __TINC_SUBNET_H__ */
|
||||
|
|
17
src/tincd.c
17
src/tincd.c
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
tincd.c -- the main file for tincd
|
||||
Copyright (C) 1998-2001 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
2000,2001 Guus Sliepen <guus@sliepen.warande.net>
|
||||
Copyright (C) 1998-2002 Ivo Timmermans <itimmermans@bigfoot.com>
|
||||
2000-2002 Guus Sliepen <guus@sliepen.warande.net>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,7 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: tincd.c,v 1.10.4.56 2001/11/16 22:40:26 zarq Exp $
|
||||
$Id: tincd.c,v 1.10.4.57 2002/02/10 21:57:54 guus Exp $
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
@ -41,12 +41,14 @@
|
|||
#include <openssl/rand.h>
|
||||
#include <openssl/rsa.h>
|
||||
#include <openssl/pem.h>
|
||||
#include <openssl/evp.h>
|
||||
|
||||
#include <utils.h>
|
||||
#include <xalloc.h>
|
||||
|
||||
#include "conf.h"
|
||||
#include "net.h"
|
||||
#include "netutl.h"
|
||||
#include "process.h"
|
||||
#include "protocol.h"
|
||||
#include "subnet.h"
|
||||
|
@ -295,7 +297,7 @@ main(int argc, char **argv, char **envp)
|
|||
if(show_version)
|
||||
{
|
||||
printf(_("%s version %s (built %s %s, protocol %d)\n"), PACKAGE, VERSION, __DATE__, __TIME__, PROT_CURRENT);
|
||||
printf(_("Copyright (C) 1998-2001 Ivo Timmermans, Guus Sliepen and others.\n"
|
||||
printf(_("Copyright (C) 1998-2002 Ivo Timmermans, Guus Sliepen and others.\n"
|
||||
"See the AUTHORS file for a complete list.\n\n"
|
||||
"tinc comes with ABSOLUTELY NO WARRANTY. This is free software,\n"
|
||||
"and you are welcome to redistribute it under certain conditions;\n"
|
||||
|
@ -327,6 +329,13 @@ main(int argc, char **argv, char **envp)
|
|||
/* Slllluuuuuuurrrrp! */
|
||||
cp
|
||||
RAND_load_file("/dev/urandom", 1024);
|
||||
|
||||
#ifdef HAVE_SSLEAY_ADD_ALL_ALGORITHMS
|
||||
SSLeay_add_all_algorithms();
|
||||
#else
|
||||
OpenSSL_add_all_algorithms();
|
||||
#endif
|
||||
|
||||
cp
|
||||
if(generate_keys)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue