Guus Sliepen [Sun, 8 Dec 2013 20:06:03 +0000 (21:06 +0100)]
Allow running without ECDSA keys If ExperimentalProtocol is not explicitly set.
To make upgrading less painful, allow running tinc 1.1 without ECDSA keys
unless ExperimentalProtocol is explicitly set to yes.
Guus Sliepen [Sun, 8 Dec 2013 19:23:44 +0000 (20:23 +0100)]
Don't print device statistics when exiting tinc.
Much more detailed statistics are now kept per node, which can be queried at
any time, which makes the device statistics obsolete.
Guus Sliepen [Sat, 7 Dec 2013 21:59:37 +0000 (22:59 +0100)]
Prefer ncurses over curses.
Guus Sliepen [Sat, 7 Dec 2013 21:54:02 +0000 (22:54 +0100)]
Use hardcoded value for TUNNEWPPA if net/if_tun.h is missing on Solaris.
Guus Sliepen [Sat, 7 Dec 2013 21:39:24 +0000 (22:39 +0100)]
Avoid using a variable named "sun". Solaris doesn't like it.
Guus Sliepen [Sat, 7 Dec 2013 21:20:10 +0000 (22:20 +0100)]
Stricter check for raw socket support.
Guus Sliepen [Sat, 7 Dec 2013 21:19:39 +0000 (22:19 +0100)]
Include <limits.h> for PATH_MAX.
Guus Sliepen [Sat, 7 Dec 2013 20:52:41 +0000 (21:52 +0100)]
Update support for Solaris.
Adds support for the latest TAP driver from
http://www.whiteboard.ne.jp/~admin2/tuntap/, so tinc now also works in switch
mode on Solaris 11.
Guus Sliepen [Thu, 5 Dec 2013 14:01:30 +0000 (15:01 +0100)]
If no Port is specified, set myport to actual port of first listening socket.
If the Port statement is not used, there are two other ways to let tinc listen
on a non-default port: either by specifying one or more BindToAddress
statements including port numbers, or by starting it from systemd with socket
activation. Tinc announces its own port to other nodes, but before it only
announced what was set using the Port statement.
Guus Sliepen [Thu, 5 Dec 2013 13:30:00 +0000 (14:30 +0100)]
Mention in the manual that multiple Address staments are allowed.
Guus Sliepen [Thu, 28 Nov 2013 13:19:55 +0000 (14:19 +0100)]
Allow "none" for Cipher and Digest again.
Guus Sliepen [Thu, 21 Nov 2013 21:13:14 +0000 (22:13 +0100)]
Make LocalDiscovery work for SPTPS packets.
Guus Sliepen [Wed, 20 Nov 2013 22:02:20 +0000 (23:02 +0100)]
Remove an unused variable.
Guus Sliepen [Fri, 15 Nov 2013 14:32:53 +0000 (15:32 +0100)]
Fix two warnings from Clang's static analyzer.
Guus Sliepen [Tue, 22 Oct 2013 19:28:44 +0000 (21:28 +0200)]
Fix sending bulk data starting with a newline.
Guus Sliepen [Tue, 22 Oct 2013 19:19:41 +0000 (21:19 +0200)]
Make sptps_test less verbose by default.
Guus Sliepen [Fri, 18 Oct 2013 14:58:47 +0000 (16:58 +0200)]
Clean up child processes from proxy type exec.
Guus Sliepen [Tue, 15 Oct 2013 12:09:42 +0000 (14:09 +0200)]
Fix sending empty SPTPS records.
Guus Sliepen [Sat, 12 Oct 2013 23:02:52 +0000 (01:02 +0200)]
Use AES-256-GCM for the SPTPS protocol.
It is faster than AES-256-CTR + HMAC-SHA256, especially on Intel chips with AES
and PCLMULQDQ instructions.
Guus Sliepen [Fri, 27 Sep 2013 08:43:56 +0000 (10:43 +0200)]
Fix typos in the documentation.
Thanks to Thomas Sattler for finding and reporting them.
Guus Sliepen [Fri, 27 Sep 2013 09:36:46 +0000 (11:36 +0200)]
Fix segfault when Name = $HOST but $HOST is not set.
Conflicts:
src/net_setup.c
Guus Sliepen [Sun, 15 Sep 2013 20:03:00 +0000 (22:03 +0200)]
Link sptps_speed with -lrt.
This is necessary for clock_gettime() on older versions of libc.
Guus Sliepen [Sun, 15 Sep 2013 20:02:33 +0000 (22:02 +0200)]
Don't leak memory during the key generation speed test.
Guus Sliepen [Sun, 15 Sep 2013 15:35:55 +0000 (17:35 +0200)]
Add a benchmark for the SPTPS protocol.
Guus Sliepen [Sun, 15 Sep 2013 14:21:25 +0000 (16:21 +0200)]
Avoid using BIOs.
Guus Sliepen [Sun, 15 Sep 2013 11:36:53 +0000 (13:36 +0200)]
Wrong date for the 1.1pre9 release in the NEWS.
Guus Sliepen [Sun, 8 Sep 2013 15:29:12 +0000 (17:29 +0200)]
Releasing 1.1pre9.
Guus Sliepen [Sun, 8 Sep 2013 13:03:06 +0000 (15:03 +0200)]
Don't try to mkdir(CONFDIR) if --config is used.
Guus Sliepen [Sun, 8 Sep 2013 12:47:59 +0000 (14:47 +0200)]
Make sure test scripts end up in the tarball.
Guus Sliepen [Sun, 8 Sep 2013 12:42:32 +0000 (14:42 +0200)]
Automake doesn't like info files being mentioned in CLEANFILES.
Guus Sliepen [Thu, 5 Sep 2013 15:42:31 +0000 (17:42 +0200)]
Test running ping through two tinc daemons.
This is a more complicated test with one tinc daemon using a tap interface
(therefore requiring root), and a second one using a multicast interface. A
separate program "pong" is listening on the same multicast address, and waits
for ARP and ICMP packets, responding to ICMP echo packets with replies.
This test doesn't require any configuration of the tap interface.
Guus Sliepen [Thu, 5 Sep 2013 15:41:05 +0000 (17:41 +0200)]
Don't return zero-length packets when receiving multicast loopback packets.
Guus Sliepen [Thu, 5 Sep 2013 12:59:56 +0000 (14:59 +0200)]
Add two more test scripts.
Guus Sliepen [Thu, 5 Sep 2013 12:51:13 +0000 (14:51 +0200)]
Fix multicast device.
Guus Sliepen [Thu, 5 Sep 2013 12:50:10 +0000 (14:50 +0200)]
Exit value 1 instead of a random non-zero value.
Guus Sliepen [Sun, 1 Sep 2013 22:15:50 +0000 (00:15 +0200)]
Add a test for invite and join commands.
Guus Sliepen [Sun, 1 Sep 2013 22:15:18 +0000 (00:15 +0200)]
Also test whether tinc daemons can connect to each other after import/export.
Guus Sliepen [Sun, 1 Sep 2013 22:11:04 +0000 (00:11 +0200)]
Slightly relax the connection rate limit for a single address.
The restriction of accepting only 1 connection per second from a single address
is a bit too much, especially if one wants to join a VPN using an invitation,
which requires two connections.
Guus Sliepen [Sun, 1 Sep 2013 20:59:51 +0000 (22:59 +0200)]
Send a RELOAD to a running tincd when a new invitation key has been generated.
Guus Sliepen [Sun, 1 Sep 2013 20:58:45 +0000 (22:58 +0200)]
Clean up leftover tincd and sptps_test processes.
Guus Sliepen [Sun, 1 Sep 2013 19:55:16 +0000 (21:55 +0200)]
Fix tincd logfile location when running tests.
Etienne Dechamps [Sun, 1 Sep 2013 19:07:32 +0000 (20:07 +0100)]
Fix broken build with --with-openssl, --with-libgcrypt.
When --with-openssl is used, $openssl is set to the specified path.
Unfortunately, that confuses the OPENSSL conditional which expects it to
be set to "true". The result is that the contents of the openssl/
directory are not built when --with-openssl is used, resulting in
undefined references and a broken build.
In addition, there is a typo in the GCRYPT conditional definition
("grypt" instead of "gcrypt") which means GCRYPT never gets set,
(presumably) breaking builds using libgcrypt.
These regressions were introduced in
9b9230a0a79c670b86f54fadd2807b864ff9d91f.
Guus Sliepen [Sun, 1 Sep 2013 19:07:02 +0000 (21:07 +0200)]
Add test for import, export and exchange commands.
Guus Sliepen [Sun, 1 Sep 2013 19:06:25 +0000 (21:06 +0200)]
Small fixes for tests.
Guus Sliepen [Sun, 1 Sep 2013 14:02:49 +0000 (16:02 +0200)]
Make sptps_test more easy to work with.
It now defers reading from stdin until after the authentication phase is
completed. Furthermore, it supports the -q, -r, -w options similar to those of
Jürgen Nickelsen's socket.
Guus Sliepen [Sun, 1 Sep 2013 13:40:59 +0000 (15:40 +0200)]
Some shells set $_ to an absolute path.
Guus Sliepen [Sat, 31 Aug 2013 22:39:14 +0000 (00:39 +0200)]
Start of a test suite.
Guus Sliepen [Fri, 30 Aug 2013 12:23:02 +0000 (14:23 +0200)]
Allow testing the replay window with sptps_test.
Guus Sliepen [Fri, 30 Aug 2013 12:22:05 +0000 (14:22 +0200)]
Fix the replay window in SPTPS.
Guus Sliepen [Fri, 30 Aug 2013 11:43:23 +0000 (13:43 +0200)]
Fix CTR mode.
Guus Sliepen [Fri, 30 Aug 2013 11:04:14 +0000 (13:04 +0200)]
Add an option to test datagram SPTPS with packet loss.
Guus Sliepen [Wed, 28 Aug 2013 12:24:07 +0000 (14:24 +0200)]
When generating invitations, handle any order of Port and Adress statements.
Guus Sliepen [Tue, 27 Aug 2013 19:19:50 +0000 (21:19 +0200)]
Call WSAStartup() in main().
The tinc utility defered calling WSAStartup() until it tried to connect to a
running tinc daemon. However, socket functions are now also used for other
things (like joining another VPN using an invitation). Now we just
unconditionally call WSAStartup() early in main().
Guus Sliepen [Fri, 23 Aug 2013 22:48:24 +0000 (00:48 +0200)]
Tell invited node about Mode and Broadcast settings.
Since these settings really should be the same for all nodes in a VPN.
Guus Sliepen [Fri, 23 Aug 2013 17:24:36 +0000 (19:24 +0200)]
Use PATHEXT when checking for the presence of scripts on Windows.
It seems like a lot of overhead to call access() for every possible extension
defined in PATHEXT, but apparently this is what Windows does itself too. At
least this avoids calling system() when the script one is looking for does not
exist at all.
Since the tinc utility also needs to call scripts, execute_script() is now
split off into its own source file.
Guus Sliepen [Tue, 20 Aug 2013 22:24:55 +0000 (00:24 +0200)]
Execute scripts when invitations are created or accepted.
Guus Sliepen [Tue, 20 Aug 2013 21:09:36 +0000 (23:09 +0200)]
Ensure the invitation filenames do not reveal the secret cookie.
Since filenames could potentially leak to unprivileged users (for example,
because of locatedb), it should not contain the cookie used for invitations.
Instead, tinc now uses the hash of the cookie and the invitation key as the
filename to store pending invitations in.
Guus Sliepen [Tue, 20 Aug 2013 20:36:31 +0000 (22:36 +0200)]
Let a server explicitly send a notification when the invitation protocol succeeded.
Guus Sliepen [Tue, 20 Aug 2013 14:49:03 +0000 (16:49 +0200)]
Use our own infrastructure for finding out the local node's externally visible host name.
Guus Sliepen [Tue, 20 Aug 2013 14:47:07 +0000 (16:47 +0200)]
Resolve the local host name before generating the invitation file.
Guus Sliepen [Sun, 18 Aug 2013 21:55:40 +0000 (23:55 +0200)]
Bind outgoing sockets again.
Commit
cff5a84 removed the feature of binding outgoing TCP sockets to a local
address. We now call bind() again, but only if there is exactly one listening
socket with the same address family as the destination address of the outgoing
socket.
Guus Sliepen [Sun, 18 Aug 2013 20:43:55 +0000 (22:43 +0200)]
Remove broadcast of KEY_CHANGED message during tinc's initialization.
Guus Sliepen [Sun, 18 Aug 2013 20:35:27 +0000 (22:35 +0200)]
Fix order of tincd's initialization.
The order in which tinc initialized things was not completely correct. Now, it
is done as follows:
- Load and parse configuration files.
- Create all TCP and UDP listening sockets.
- Create PID file and UNIX socket.
- Run the tinc-up script.
- Drop privileges.
- Start outgoing connections.
- Run the main loop.
The PID file can only be created correctly if the listening sockets have been
set up ,as it includes the address and port of the first listening socket. The
tinc-up script has to be run after the PID file and UNIX socket have been
created so it can change their permissions if necessary. Outgoing connections
should only be started right before the main loop, because this is not really
part of the initialization.
Guus Sliepen [Sun, 18 Aug 2013 16:20:41 +0000 (18:20 +0200)]
Don't force a .bat extension for scripts under Windows.
Guus Sliepen [Sun, 18 Aug 2013 15:02:49 +0000 (17:02 +0200)]
Create UNIX socket at the same time as the PID file is created.
The PID file was created before tinc-up was called, but the UNIX socket was
created afterwards, which meant one could not change the UNIX socket's owner or
permissions from the tinc-up script.
Guus Sliepen [Wed, 14 Aug 2013 14:20:32 +0000 (16:20 +0200)]
Remove texi2html rule in docs/Makefile.
According to Debian, texi2html is deprecated and makeinfo --html should be used
instead. Automake already provides a html target that invokes makeinfo.
Guus Sliepen [Wed, 14 Aug 2013 14:17:12 +0000 (16:17 +0200)]
Stop using EXTRA_DIST in src/Makefile.am.
Automake finds the files in the subdirectories of src/ now that they are
properly declared in the _SOURCES variables. Using EXTRA_DIST would now cause
.o files to be included in the tarball.
Guus Sliepen [Tue, 13 Aug 2013 20:05:43 +0000 (22:05 +0200)]
Releasing 1.1pre8.
Guus Sliepen [Tue, 13 Aug 2013 18:40:40 +0000 (20:40 +0200)]
Don't typedef the same struct in two header files.
Some (older?) versions of GCC don't like this.
Guus Sliepen [Tue, 13 Aug 2013 18:38:57 +0000 (20:38 +0200)]
Update copyright notices.
Guus Sliepen [Tue, 13 Aug 2013 18:37:55 +0000 (20:37 +0200)]
Build .tar.gz instead of .tar.xz.
Only FreeBSD's tar supports xz compression, the other BSDs do not. NetBSD doesn't even
like bzip2.
Guus Sliepen [Tue, 13 Aug 2013 18:35:48 +0000 (20:35 +0200)]
Move .h files from noinst_HEADERS to tincd_SOURCES.
This is the recommended way according to the Automake manual.
Guus Sliepen [Thu, 8 Aug 2013 15:40:15 +0000 (17:40 +0200)]
Don't echo broadcast packets back when Broadcast = direct.
Guus Sliepen [Fri, 2 Aug 2013 21:51:55 +0000 (23:51 +0200)]
Fix a typo.
Guus Sliepen [Fri, 2 Aug 2013 21:46:19 +0000 (23:46 +0200)]
Non-zero exit code when reloading config file fails after SIGHUP.
When reloading the configuration file via the tinc command, the user will get
an error message if reloading has failed. However, no such warning exists when
sending a HUP signal. Previously, tincd would exit in both cases, but with a
zero exit code. Now it will exit with code 1 when reloading fails after a
SIGHUP, but tincd will keep running if it is signaled via the tinc command.
Instead, the tinc command will exit with a non-zero exit code.
Guus Sliepen [Fri, 2 Aug 2013 18:53:54 +0000 (20:53 +0200)]
Really retry outgoing connections immediately if requested.
The retry() function would only abort connections that were in progress of
being made, it wouldn't reschedule the outgoing connections that had been
sleeping.
Guus Sliepen [Fri, 2 Aug 2013 18:50:19 +0000 (20:50 +0200)]
Clean up the SIGINT handler.
Guus Sliepen [Fri, 2 Aug 2013 17:27:06 +0000 (19:27 +0200)]
Use umask() to set file and UNIX socket permissions without race conditions.
As mentioned by Erik Tews, calling fchmod() after fopen() leaves a small window
for exploits. As long as tinc is single-threaded, we can use umask() instead to
reduce file permissions. This also works when creating the AF_UNIX control socket.
The umask of the user running tinc(d) is used for most files, except for the
private keys, invitation files, PID file and control socket.
Guus Sliepen [Fri, 26 Jul 2013 13:48:52 +0000 (15:48 +0200)]
Defer handling netname conflicts when accepting an invitation.
In case no explicit netname of configuration directory is specified when
accepting an invitation, the netname specified in the invitation data is
used. However, this new netname is only known after making the connection
to the server. If the new netname conflicts with an existing one at the
client, we ask the user for a netname that doesn't conflict. However, we
should first finish accepting the invitation, so we don't run into the
problem that the server times out and cancels the invitation. So, we create
a random netname and store the files there, and only after we finish
accepting the invitation we ask the user for a better netname, and then
just rename the temporary directory to the final name.
Guus Sliepen [Fri, 26 Jul 2013 13:44:05 +0000 (15:44 +0200)]
Make absolutely sure we can write config files before accepting an invitation.
Guus Sliepen [Fri, 26 Jul 2013 12:53:36 +0000 (14:53 +0200)]
Choose a different Port when 655 isn't available when doing "tinc join".
Guus Sliepen [Fri, 26 Jul 2013 12:17:15 +0000 (14:17 +0200)]
Choose a different Port when 655 isn't available when doing "tinc init".
If port 655 cannot be bound to when using the init command, tinc will try to
find a random port number that can be bound to, and will add the appropriate
Port variable to its host config file. A warning will be printed as well.
Guus Sliepen [Thu, 25 Jul 2013 15:17:33 +0000 (17:17 +0200)]
Don't forget the Port variable when creating an invitation URL.
Guus Sliepen [Thu, 25 Jul 2013 15:14:07 +0000 (17:14 +0200)]
Allow control-C to stop tincd without stopping the tinc shell.
Guus Sliepen [Thu, 25 Jul 2013 14:21:11 +0000 (16:21 +0200)]
Warn when incorrect use of add or set causes variables to be removed.
Guus Sliepen [Wed, 24 Jul 2013 18:48:31 +0000 (20:48 +0200)]
Fix compression when using the SPTPS protocol.
Guus Sliepen [Mon, 22 Jul 2013 20:58:13 +0000 (22:58 +0200)]
Honour umask, let temporary key files inherit original's permissions.
During the init command, tinc changed the umask to 077 when writing the public
and private key files, to prevent the temporary copies from being world
readable. However, subsequently created files would therefore also be
unreadable for others. Now we don't change the umask anymore, therefore
allowing the user to choose whether the files are world readable or not by
setting the umask as desired. The private key files are still made unreadable
for others of course. Temporary files now inherit the permissions of the
original, and the tinc-up script's permissions now also honour the umask.
Etienne Dechamps [Mon, 22 Jul 2013 20:22:26 +0000 (21:22 +0100)]
Further improve bandwidth estimation for type 2 MTU probe replies.
This patch adds timestamp information to type 2 MTU probe replies. This
timestamp can then be used by the recipient to estimate bandwidth more
accurately, as jitter in the RX direction won't affect the results.
Etienne Dechamps [Sun, 21 Jul 2013 12:05:42 +0000 (13:05 +0100)]
Introduce lightweight PMTU probe replies.
When replying to a PMTU probe, tinc sends a packet with the same length
as the PMTU probe itself, which is usually large (~1450 bytes). This is
not necessary: the other node wants to know the size of the PMTU probes
that have been received, but encoding this information as the actual
reply length is probably the most inefficient way to do it. It doubles
the bandwidth usage of the PMTU discovery process, and makes it less
reliable since large packets are more likely to be dropped.
This patch introduces a new PMTU probe reply type, encoded as type "2"
in the first byte of the packet, that indicates that the length of the
PMTU probe that is being replied to is encoded in the next two bytes of
the packet. Thus reply packets are only 3 bytes long.
(This also protects against very broken networks that drop very small
packets - yes, I've seen it happen on a subnet of a national ISP - in
such a case the PMTU probe replies will be dropped, and tinc won't
enable UDP communication, which is a good thing.)
Because legacy nodes won't understand type 2 probe replies, the minor
protocol number is bumped to 3.
Note that this also improves bandwidth estimation, as it is able to
measure bandwidth in both directions independently (the node receiving
the replies is measuring in the TX direction) and the use of smaller
reply packets might decrease the influence of jitter.
Etienne Dechamps [Sat, 20 Jul 2013 21:59:57 +0000 (22:59 +0100)]
Disable PMTU discovery when TCPOnly is set.
Obviously, PMTU discovery doesn't make much sense when we know we'll be
using TCP anyway.
Guus Sliepen [Sat, 20 Jul 2013 22:20:54 +0000 (00:20 +0200)]
Allow extra options to be passed to "tinc restart" again.
Guus Sliepen [Sat, 20 Jul 2013 22:13:38 +0000 (00:13 +0200)]
Forbid protocol version rollback.
When we know a node's ECDSA key, we only allow communication via the SPTPS
protocol.
Guus Sliepen [Sat, 20 Jul 2013 21:41:01 +0000 (23:41 +0200)]
Attribution for Etienne Dechamps.
Etienne Dechamps [Sat, 20 Jul 2013 13:50:28 +0000 (14:50 +0100)]
Fix hash_function().
The hashing function that tinc uses is currently broken as it only looks
at the first 4 bytes of data.
This leads to interesting bugs, like the node UDP address cache being
subtly broken because two addresses with the same protocol and port (but
not the same IP address) will override each other. This is because
the first four bytes of sockaddr_in contains the IP protocol and port,
while the IP address itself is contained in the four remaining bytes
that are never used when the hash is computed.
Guus Sliepen [Wed, 17 Jul 2013 16:06:56 +0000 (18:06 +0200)]
Don't use vasprintf() anymore on Windows.
Windows doesn't actually support it, but MinGW provides it. However, with some versions of
MinGW it doesn't work correctly. Instead, we vsnprintf() to a local buffer and xstrdup() the
results.
Guus Sliepen [Wed, 17 Jul 2013 16:02:07 +0000 (18:02 +0200)]
Don't search in local directories for include files.
Tinc's source code doesn't rely on this anymore, and this gets rid of potential conflicts with
system headers.
Guus Sliepen [Wed, 17 Jul 2013 16:00:40 +0000 (18:00 +0200)]
Add missing definitions on Windows.
Guus Sliepen [Mon, 15 Jul 2013 12:48:43 +0000 (14:48 +0200)]
Fix warning "Both netname and configuration directory given" on Windows.
Etienne Dechamps [Sat, 13 Jul 2013 22:34:42 +0000 (23:34 +0100)]
Fix combination of Mode = router and DeviceType = tap on Linux.
I believe I have found a bug in tinc on Linux when it is used with
Mode = router and DeviceType = tap. This combination is useful because
it allows global broadcast packets to be used in router mode. However,
when tinc receives a packet in this situation, it needs to make sure its
destination MAC address matches the address of the TAP adapter, which is
typically not the case since the sending node doesn't know the MAC
address of the recipient. Unfortunately, this is not the case on Linux,
which breaks connectivity.
Guus Sliepen [Thu, 11 Jul 2013 21:38:38 +0000 (23:38 +0200)]
Add connection rate limiting.
Tinc now strictly limits incoming connections from the same host to 1 per
second. For incoming connections from multiple hosts short bursts of incoming
connections are allowed (by default 100), but on average also only 1 connection
per second is allowed.
When an incoming connection exceeds the limit, tinc will keep the connection in
a tarpit; the connection will be kept open but it is ignored completely. Only
one connection is in a tarpit at a time to limit the number of useless open
connections.