Updated the manual:
- incorporated comments from Stefan Hartsuiker - updated configuration variables section - added some text about key types
This commit is contained in:
parent
5c78e158d4
commit
d3f41b803b
1 changed files with 133 additions and 40 deletions
173
doc/tinc.texi
173
doc/tinc.texi
|
@ -30,7 +30,7 @@ Copyright 1998,199,2000 Ivo Timmermans <itimmermans@@bigfoot.com>
|
||||||
@titlepage
|
@titlepage
|
||||||
@title tinc Manual
|
@title tinc Manual
|
||||||
@subtitle Setting up a Virtual Private Network with tinc
|
@subtitle Setting up a Virtual Private Network with tinc
|
||||||
@author Ivo Timmermans <itimmermans@@bigfoot.com>
|
@author Ivo Timmermans <itimmermans@@bigfoot.com> and Guus Sliepen <guus@sliepen.warande.net>
|
||||||
|
|
||||||
@page
|
@page
|
||||||
@vskip 0pt plus 1filll
|
@vskip 0pt plus 1filll
|
||||||
|
@ -100,7 +100,7 @@ more than just one way.
|
||||||
Private networks can consist of a single stand-alone ethernet LAN. Or
|
Private networks can consist of a single stand-alone ethernet LAN. Or
|
||||||
even two computers hooked up using a null-modem cable. In these cases,
|
even two computers hooked up using a null-modem cable. In these cases,
|
||||||
it is
|
it is
|
||||||
obvious that the network is @emph{private}, noone can access it from the
|
obvious that the network is @emph{private}, no one can access it from the
|
||||||
outside. But if your computers are linked to the internet, the network
|
outside. But if your computers are linked to the internet, the network
|
||||||
is not private anymore, unless one uses firewalls to block all private
|
is not private anymore, unless one uses firewalls to block all private
|
||||||
traffic. But then, there is no way to send private data to trusted
|
traffic. But then, there is no way to send private data to trusted
|
||||||
|
@ -219,7 +219,9 @@ kernel.
|
||||||
@subsubheading Device files
|
@subsubheading Device files
|
||||||
|
|
||||||
First, you'll need the special device file(s) that form the interface
|
First, you'll need the special device file(s) that form the interface
|
||||||
between the kernel and the daemon.
|
between the kernel and the daemon. If you are running the new 2.4 kernel and
|
||||||
|
you are using the devfs filesystem, then the tap device will be automatically
|
||||||
|
generated as @file{/dev/netlink/tap0}. Otherwise, you have to make it yourself:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
mknod -m 600 /dev/tap0 c 36 16
|
mknod -m 600 /dev/tap0 c 36 16
|
||||||
|
@ -233,7 +235,8 @@ tincd as root.
|
||||||
|
|
||||||
If you want to, you may also create more device files, which would be
|
If you want to, you may also create more device files, which would be
|
||||||
numbered 0...15, with minor device numbers 16...31. They all should be
|
numbered 0...15, with minor device numbers 16...31. They all should be
|
||||||
owned by root and have permission 600.
|
owned by root and have permission 600. Under devfs, these files will
|
||||||
|
be automatically generated.
|
||||||
|
|
||||||
|
|
||||||
@subsubheading @file{/etc/networks}
|
@subsubheading @file{/etc/networks}
|
||||||
|
@ -245,6 +248,9 @@ symbolic name. For example:
|
||||||
myvpn 10.0.0.0
|
myvpn 10.0.0.0
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
|
This has nothing to do with the MyVPNIP configuration variable that will be
|
||||||
|
discussed later, it is only to make the output of the route command more
|
||||||
|
legible.
|
||||||
|
|
||||||
@subsubheading @file{/etc/services}
|
@subsubheading @file{/etc/services}
|
||||||
|
|
||||||
|
@ -288,15 +294,17 @@ use. It should be the same @emph{n} as the one you use for
|
||||||
(0--ff). With previous versions of tincd, it didn't matter what they
|
(0--ff). With previous versions of tincd, it didn't matter what they
|
||||||
were. But newer kernels require properly set up ethernet addresses.
|
were. But newer kernels require properly set up ethernet addresses.
|
||||||
In fact, the old behavior was wrong. It is required that the @emph{xx}s
|
In fact, the old behavior was wrong. It is required that the @emph{xx}s
|
||||||
match MyOwnVPNIP.
|
match the numbers of the IP address you will give to the tap device
|
||||||
|
and to the MyOwnVPNIP configuration (which will be discussed later):
|
||||||
|
|
||||||
@example
|
@example
|
||||||
ifconfig tap@emph{n} @emph{IP} netmask @emph{mask}
|
ifconfig tap@emph{n} @emph{xx}.@emph{xx}.@emph{xx}.@emph{xx} netmask @emph{mask}
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
This will activate the device with an IP address @emph{IP} with network
|
This will activate the device with an IP address @emph{IP} with network
|
||||||
mask @emph{mask}.
|
mask @emph{mask}. The netmask is the mask of the @emph{entire} VPN network,
|
||||||
|
not just your own subnet. It is the same netmask you will have to specify
|
||||||
|
with the VpnMask configuration variable.
|
||||||
|
|
||||||
|
|
||||||
@c ==================================================================
|
@c ==================================================================
|
||||||
|
@ -395,31 +403,67 @@ out, remember to replace it with at least one space character.
|
||||||
@node Variables, , Configuration file, Configuration file
|
@node Variables, , Configuration file, Configuration file
|
||||||
@subsection Variables
|
@subsection Variables
|
||||||
|
|
||||||
Here are all valid variables, listed in alphabetical order:
|
Here are all valid variables, listed in alphabetical order. The default
|
||||||
|
value, required or optional is given between parentheses.
|
||||||
|
|
||||||
@c straight from the manpage
|
@c straight from the manpage
|
||||||
@table @asis
|
@table @asis
|
||||||
@item ConnectPort = port
|
@item ConnectPort = <port> (655)
|
||||||
Connect to the upstream host (given with the ConnectTo directive) on
|
Connect to the upstream host (given with the ConnectTo directive) on
|
||||||
port port. port may be given in decimal (default), octal (when preceded
|
port port. port may be given in decimal (default), octal (when preceded
|
||||||
by a single zero) or hexadecimal (prefixed with 0x). port is the port
|
by a single zero) or hexadecimal (prefixed with 0x). port is the port
|
||||||
number for both the UDP and the TCP (meta) connections.
|
number for both the UDP and the TCP (meta) connections.
|
||||||
|
|
||||||
@item ConnectTo = (IP address|hostname)
|
@item ConnectTo = <IP address|hostname> (optional)
|
||||||
Specifies which host to connect to on startup. If the ConnectPort
|
Specifies which host to connect to on startup. Multiple ConnectTo variables
|
||||||
variable is omitted, then tinc will try to connect to port 655.
|
may be specified, if connecting to the first one fails then tinc will try
|
||||||
|
the next one, and so on. It is possible to specify hostnames for dynamic IP
|
||||||
|
addresses (like those given on dyndns.org), tinc will not cache the resolved
|
||||||
|
IP address.
|
||||||
|
|
||||||
If you don't specify a host with ConnectTo, regardless of whether a
|
If you don't specify a host with ConnectTo, regardless of whether a
|
||||||
value for ConnectPort is given, tinc won't connect at all, and will
|
value for ConnectPort is given, tinc won't connect at all, and will
|
||||||
instead just listen for incoming connections. Only the initiator of a
|
instead just listen for incoming connections.
|
||||||
tinc VPN should need this.
|
|
||||||
|
|
||||||
@item ListenPort = port
|
@item Hostnames = <yes|no> (no)
|
||||||
|
This option selects whether IP addresses (both real and on the VPN) should
|
||||||
|
be resolved. Since DNS lookups are blocking, it might affect tinc's
|
||||||
|
efficiency, even stopping the daemon for a few seconds everytime it does
|
||||||
|
a lookup if your DNS server is not responding.
|
||||||
|
|
||||||
|
This does not affect resolving hostnames to IP addresses from the configuration
|
||||||
|
file.
|
||||||
|
|
||||||
|
@item IndirectData = <yes|no> (no)
|
||||||
|
This option specifies whether other tinc daemons besides the one you
|
||||||
|
specified with ConnectTo can make a direct connection to you. This is
|
||||||
|
especially useful if you are behind a firewall and it is impossible
|
||||||
|
to make a connection from the outside to your tinc daemon. Otherwise,
|
||||||
|
it is best to leave this option out or set it to no.
|
||||||
|
|
||||||
|
@item Interface = <device> (optional)
|
||||||
|
If you have more than one network interface in your computer, tinc will by
|
||||||
|
default listen on all of them for incoming connections. It is possible to
|
||||||
|
bind tinc to a single interface like eth0 or ppp0 with this variable.
|
||||||
|
|
||||||
|
@item InterfaceIP = <local address> (optional)
|
||||||
|
If your computer has more than one IP address on a single interface (for example
|
||||||
|
if you are running virtual hosts), tinc will by default listen on all of them for
|
||||||
|
incoming connections. It is possible to bind tinc to a single IP address with
|
||||||
|
this variable. It is still possible to listen on several interfaces at the same
|
||||||
|
time though, if they share the same IP address.
|
||||||
|
|
||||||
|
@item KeyExpire = <seconds> (3600)
|
||||||
|
This option controls the time the encryption keys used to encrypt the data
|
||||||
|
are valid. It is common practice to change keys at regular intervals to
|
||||||
|
make it even harder for crackers, even though it is thought to be nearly
|
||||||
|
impossible to crack a single key.
|
||||||
|
|
||||||
|
@item ListenPort = <port> (655)
|
||||||
Listen on local port port. The computer connecting to this daemon should
|
Listen on local port port. The computer connecting to this daemon should
|
||||||
use this number as the argument for his ConnectPort. Again, the
|
use this number as the argument for his ConnectPort.
|
||||||
default is 655.
|
|
||||||
|
|
||||||
@item MyOwnVPNIP = local address[/maskbits]
|
@item MyOwnVPNIP = <local address[/maskbits]> (required)
|
||||||
The local address is the number that the daemon will propagate to
|
The local address is the number that the daemon will propagate to
|
||||||
other daemons on the network when it is identifying itself. Hence this
|
other daemons on the network when it is identifying itself. Hence this
|
||||||
will be the file name of the passphrase file that the other end expects
|
will be the file name of the passphrase file that the other end expects
|
||||||
|
@ -432,32 +476,40 @@ equal to the IP address (see the example).
|
||||||
|
|
||||||
maskbits is the number of bits set to 1 in the netmask part.
|
maskbits is the number of bits set to 1 in the netmask part.
|
||||||
|
|
||||||
@item MyVirtualIP = local address[/maskbits]
|
@item MyVirtualIP = <local address[/maskbits]>
|
||||||
This is an alias for MyOwnVPNIP.
|
This is an alias for MyOwnVPNIP.
|
||||||
|
|
||||||
@item Passphrases = directory
|
@item Passphrases = <directory> (/etc/tinc/NETNAME/passphrases)
|
||||||
The directory where tinc will look for passphrases when someone tries to
|
The directory where tinc will look for passphrases when someone tries to
|
||||||
connect. Please see the manpage for genauth(8) for more information
|
connect. Please see the manpage for genauth(8) for more information
|
||||||
about passphrases as used by tinc.
|
about passphrases as used by tinc.
|
||||||
|
|
||||||
@item PingTimeout = number
|
@item PingTimeout = <seconds> (5)
|
||||||
The number of seconds of inactivity that tinc will wait before sending a
|
The number of seconds of inactivity that tinc will wait before sending a
|
||||||
probe to the other end. If that other end doesn't answer within that
|
probe to the other end. If that other end doesn't answer within that
|
||||||
same amount of seconds, the connection is terminated, and the others
|
same amount of seconds, the connection is terminated, and the others
|
||||||
will be notified of this.
|
will be notified of this.
|
||||||
|
|
||||||
@item TapDevice = device
|
@item TapDevice = <device> (/dev/tap0)
|
||||||
The ethertap device to use. Note that you can only use one device per
|
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
|
daemon. The info pages of the tinc package contain more information
|
||||||
about configuring an ethertap device for Linux.
|
about configuring an ethertap device for Linux.
|
||||||
|
|
||||||
@item VpnMask = mask
|
@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 firewall, or if
|
||||||
|
UDP packet routing is disabled somehow. This is experimental code,
|
||||||
|
try this at your own risk.
|
||||||
|
|
||||||
|
@item VpnMask = <mask> (optional)
|
||||||
The mask that defines the scope of the entire VPN. This option is not used
|
The mask that defines the scope of the entire VPN. This option is not used
|
||||||
by the tinc daemon itself, but can be used by startup scripts to configure
|
by the tinc daemon itself, but can be used by startup scripts to configure
|
||||||
the ethertap devices correctly.
|
the ethertap devices correctly.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@c ==================================================================
|
@c ==================================================================
|
||||||
@node Example, , Configuration file, Configuring tinc
|
@node Example, , Configuration file, Configuring tinc
|
||||||
@section Example
|
@section Example
|
||||||
|
@ -483,17 +535,18 @@ need to run tincd, but it must do a port forwarding of TCP&UDP on port
|
||||||
655 (unless otherwise configured).
|
655 (unless otherwise configured).
|
||||||
|
|
||||||
In this example, it is assumed that eth0 is the interface that points to
|
In this example, it is assumed that eth0 is the interface that points to
|
||||||
the inner LAN of the office. This could be the same as the interface
|
the inner LAN of the office, although this could also be the same as the interface
|
||||||
that leads to the internet.
|
that leads to the internet. The configuration of the real interface is also shown
|
||||||
|
as a comment, to give you an idea of how these example host is set up.
|
||||||
|
|
||||||
@subsubheading For A
|
@subsubheading For A
|
||||||
|
|
||||||
@emph{A} would be configured like this:
|
@emph{A} would be configured like this:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
|
#ifconfig eth0 10.1.54.1 netmask 255.255.0.0 broadcast 10.1.255.255
|
||||||
ifconfig tap0 hw ether fe:fd:0a:01:36:01
|
ifconfig tap0 hw ether fe:fd:0a:01:36:01
|
||||||
ifconfig tap0 10.1.54.1 netmask 255.0.0.0
|
ifconfig tap0 10.1.54.1 netmask 255.0.0.0
|
||||||
ifconfig eth0 10.1.54.1 netmask 255.255.0.0 broadcast 10.1.255.255
|
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
and in /etc/tinc/tinc.conf:
|
and in /etc/tinc/tinc.conf:
|
||||||
|
@ -507,9 +560,9 @@ VpnMask = 255.0.0.0
|
||||||
@subsubheading For B
|
@subsubheading For B
|
||||||
|
|
||||||
@example
|
@example
|
||||||
|
#ifconfig eth0 10.2.43.8 netmask 255.255.0.0 broadcast 10.2.255.255
|
||||||
ifconfig tap0 hw ether fe:fd:0a:02:01:0c
|
ifconfig tap0 hw ether fe:fd:0a:02:01:0c
|
||||||
ifconfig tap0 10.2.1.12 netmask 255.0.0.0
|
ifconfig tap0 10.2.1.12 netmask 255.0.0.0
|
||||||
ifconfig eth0 10.2.43.8 netmask 255.255.0.0 broadcast 10.2.255.255
|
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
and in /etc/tinc/tinc.conf:
|
and in /etc/tinc/tinc.conf:
|
||||||
|
@ -528,30 +581,33 @@ connect to this node.
|
||||||
@subsubheading For C
|
@subsubheading For C
|
||||||
|
|
||||||
@example
|
@example
|
||||||
|
#ifconfig eth0 10.3.69.254 netmask 255.255.0.0 broadcast 10.3.255.255
|
||||||
ifconfig tap0 hw ether fe:fd:0a:03:45:fe
|
ifconfig tap0 hw ether fe:fd:0a:03:45:fe
|
||||||
ifconfig tap0 10.3.69.254 netmask 255.0.0.0
|
ifconfig tap0 10.3.69.254 netmask 255.0.0.0
|
||||||
ifconfig eth0 10.3.69.254 netmask 255.255.0.0 broadcast 10.3.255.255
|
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
and in /etc/tinc/A/tinc.conf:
|
and in /etc/tinc/A/tinc.conf:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
MyVirtualIP = 10.3.69.254/16
|
MyVirtualIP = 10.3.69.254/16
|
||||||
|
TapDevice = /dev/tap1
|
||||||
ConnectTo = 1.2.3.4
|
ConnectTo = 1.2.3.4
|
||||||
ListenPort = 2000
|
ListenPort = 2000
|
||||||
VpnMask = 255.0.0.0
|
VpnMask = 255.0.0.0
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
C already has another daemon that runs on port 655, so they have to
|
C already has another daemon that runs on port 655, so they have to
|
||||||
reserve another port for tinc. They also use the netname to distinguish
|
reserve another port for tinc. It can connect to other tinc daemons on
|
||||||
|
the regular port though, so no ConnectPort variable is needed.
|
||||||
|
They also use the netname to distinguish
|
||||||
between the two. tinc is started with `tincd -n A'.
|
between the two. tinc is started with `tincd -n A'.
|
||||||
|
|
||||||
@subsubheading For D
|
@subsubheading For D
|
||||||
|
|
||||||
@example
|
@example
|
||||||
|
#ifconfig tap0 10.4.3.32 netmask 255.255.0.0 broadcast 10.4.255.255
|
||||||
ifconfig tap0 hw ether fe:fd:0a:04:03:20
|
ifconfig tap0 hw ether fe:fd:0a:04:03:20
|
||||||
ifconfig tap0 10.4.3.32 netmask 255.0.0.0
|
ifconfig tap0 10.4.3.32 netmask 255.0.0.0
|
||||||
ifconfig tap0 10.4.3.32 netmask 255.255.0.0 broadcast 10.4.255.255
|
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
and in /etc/tinc/tinc.conf:
|
and in /etc/tinc/tinc.conf:
|
||||||
|
@ -564,7 +620,8 @@ VpnMask=255.0.0.0
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
D will be connecting to C, which has a tincd running for this network on
|
D will be connecting to C, which has a tincd running for this network on
|
||||||
port 2000. Hence they need to put in a ConnectPort.
|
port 2000. Hence they need to put in a ConnectPort, but it doesn't need
|
||||||
|
to have a different ListenPort.
|
||||||
|
|
||||||
@subsubheading Authentication
|
@subsubheading Authentication
|
||||||
|
|
||||||
|
@ -810,16 +867,48 @@ This chapter is a mixture of ideas, reasoning and explanation, please
|
||||||
don't take it too serious.
|
don't take it too serious.
|
||||||
|
|
||||||
@menu
|
@menu
|
||||||
|
* Key Types::
|
||||||
* Key Management::
|
* Key Management::
|
||||||
* Authentication::
|
* Authentication::
|
||||||
* Protection::
|
* Protection::
|
||||||
@end menu
|
@end menu
|
||||||
|
|
||||||
|
@c ==================================================================
|
||||||
|
@node Key Types, Key Management, Security, Security
|
||||||
|
@subsection Key Types
|
||||||
|
@c FIXME: check if I'm not talking nonsense
|
||||||
|
|
||||||
|
There are several types of encryption keys. Tinc uses two of them,
|
||||||
|
symmetric private keypairs and public/private keypairs.
|
||||||
|
|
||||||
|
Public/private keypairs are used in public key cryptography. It enables
|
||||||
|
someone to send out a public key with which other people can encrypt their
|
||||||
|
data. The encrypted data now can only be decrypted by the person who has
|
||||||
|
the private key that matches the public key. So, a public key only allows
|
||||||
|
@emph{other} people to send encrypted messages to you. This is very useful
|
||||||
|
in setting up private communications channels. Just send out your public key
|
||||||
|
and other people can talk to you in a secure way. But how can you know
|
||||||
|
the other person is who he says he is?
|
||||||
|
|
||||||
|
For authentication itself tinc uses symmetric private keypairs, referred
|
||||||
|
to as a passphrase. The identity of each tinc daemon is defined by it's
|
||||||
|
passphrase (like you can be identified by your social security number).
|
||||||
|
Every tinc daemon that is allowed to connect to you has a copy of your
|
||||||
|
passphrase (hence symmetrical).
|
||||||
|
|
||||||
|
It would also be possible to use public/private keypairs for authentication,
|
||||||
|
so that you could shout out your public key and don't need to keep it
|
||||||
|
secret (like the passphrase you would have to send to someone else). Also,
|
||||||
|
no one else has to know a private key from you.
|
||||||
|
Both forms have their pros and cons, and at the moment tinc just uses passphrases
|
||||||
|
(which are computationaly more efficient and perhaps in some way more
|
||||||
|
secure).
|
||||||
|
|
||||||
@c ==================================================================
|
@c ==================================================================
|
||||||
@node Key Management, Authentication, Security, Security
|
@node Key Management, Authentication, Key Types, Security
|
||||||
@subsection Key Management
|
@subsection Key Management
|
||||||
@c FIXME: recheck
|
@c FIXME: recheck
|
||||||
|
@c I did, it sounds sane :) [guus]
|
||||||
|
|
||||||
@cindex Diffie-Hellman
|
@cindex Diffie-Hellman
|
||||||
You can't just send a private encryption key to your peer, because
|
You can't just send a private encryption key to your peer, because
|
||||||
|
@ -840,10 +929,6 @@ mod p. This is then sent to B; while B computes g^b mod p, and transmits
|
||||||
this to A, b being generated by B. Both a and b must be smaller than
|
this to A, b being generated by B. Both a and b must be smaller than
|
||||||
p-1.
|
p-1.
|
||||||
|
|
||||||
These private keys are generated upon startup, and they are not changed
|
|
||||||
while the connection exists. A possible feature in the future is to
|
|
||||||
dynamically change the keys, every hour for example.
|
|
||||||
|
|
||||||
Both parties then calculate g^ab mod p = k. k is the new, shared, but
|
Both parties then calculate g^ab mod p = k. k is the new, shared, but
|
||||||
still secret key.
|
still secret key.
|
||||||
|
|
||||||
|
@ -864,17 +949,25 @@ system.
|
||||||
We will let A transmit a passphrase that is also known to B encrypted
|
We will let A transmit a passphrase that is also known to B encrypted
|
||||||
with g^a, before A sends this to B. This way, B can check whether A is
|
with g^a, before A sends this to B. This way, B can check whether A is
|
||||||
really A or just someone else.
|
really A or just someone else.
|
||||||
|
B will never receive the real passphrase though, because it was
|
||||||
|
encrypted using public/private keypairs. This way there is no way an
|
||||||
|
imposter could steal A's passphrase.
|
||||||
|
|
||||||
@cindex passphrase
|
@cindex passphrase
|
||||||
|
@c ehrmz... but we only use 1024 bits passphrases ourselves? [guus]
|
||||||
This passphrase should be 2304 bits for a symmetric encryption
|
This passphrase should be 2304 bits for a symmetric encryption
|
||||||
system. But since an asymmetric system is more secure, we could do with
|
system. But since an asymmetric system is more secure, we could do with
|
||||||
2048 bits. This only holds if the passphrase is very random.
|
2048 bits. This only holds if the passphrase is very random.
|
||||||
|
|
||||||
These passphrases could be stored in a file that is non-readable by
|
These passphrases could be stored in a file that is non-readable by
|
||||||
anyone else but root; e.g. @file{/etc/vpn/passphrases}.
|
anyone else but root; e.g. @file{/etc/tinc/passphrases} with UID 0
|
||||||
|
and permissions mode 700.
|
||||||
|
|
||||||
The only thing that needs to be taken care of is how A announces its
|
The only thing that needs to be taken care of is how A can securely send
|
||||||
passphrase to B.
|
a copy of it's passphrase to B if B doesn't have it yet. This could be
|
||||||
|
done via mail with PGP, but you should be really convinced of the
|
||||||
|
identity of the person who owns the email address you are sending this to.
|
||||||
|
Swapping floppy disks in real life might be the best way to do this!
|
||||||
|
|
||||||
|
|
||||||
@c ==================================================================
|
@c ==================================================================
|
||||||
|
|
Loading…
Reference in a new issue