Import release 0.1.9
[secnet] / README
CommitLineData
558fa3fb
SE
1secnet - flexible VPN software
2
8dea8d37
SE
3* Copying
4
5secnet is Copyright (C) 1995--2001 Stephen Early <steve@greenend.org.uk>
6It is distributed under the terms of the GNU General Public License,
7version 2 or later. See the file COPYING for more information.
8
9The portable snprintf implementation in snprintf.c is Copyright (C)
101999 Mark Martinec <mark.martinec@ijs.si> and is distributed under the
11terms of the Frontier Artistic License. You can find the standard
12version of snprintf.c at http://www.ijs.si/software/snprintf/
13
14The IP address handling library in ipaddr.py is Copyright (C)
151996--2000 Cendio Systems AB, and is distributed under the terms of
16the GPL.
17
558fa3fb
SE
18* Introduction
19
20secnet allows large virtual private networks to be constructed
21spanning multiple separate sites. It is designed for the case where a
22private network connecting many hosts is 'hidden' behind a single
23globally-routable IP address, but can also be applied in other
24circumstances. It communicates entirely using UDP, and works well
25with gateways that implement network address translation.
26
27If you are installing secnet to join an existing VPN, you should read
28the 'INSTALL' file and your particular VPN's documentation now. You
29may need to refer back to this file for information on the netlink and
30comm sections of the configuration file.
31
32If you are thinking about setting up a new VPN of any size (from one
33providing complete links between multiple sites to a simple
34laptop-to-host link), read the section in this file on 'Creating a
35VPN'.
36
37* Creating a VPN
38
39XXX TODO
40
41* secnet configuration file format
42
43By default secnet on linux reads /etc/secnet/secnet.conf. The default
44may be different on other platforms.
45
46This file defines a dictionary (a mapping from keys to values) full of
47configuration information for secnet. Two keys must be defined in
48this file for secnet to start. One is "system", a dictionary
49containing systemwide control parameters. The other is "sites", a
50list of all the sites that you intend to communicate with.
51
52The configuration file has a very simple syntax; keys are defined as
53follows:
54
55key definition;
56or
57key = definition;
58
59(the "=" is optional)
60
61Keys must match the following regular expression:
62[[:alpha:]_][[:alnum:]\-_]*
63
64i.e. the first character must be an alpha or an underscore, and the
65remaining characters may be alphanumeric, '-' or '_'.
66
67Keys can be defined to be a comma-separated list of any of the
68following types:
69
70 a boolean
71 a string, in quotes
72 a number, in decimal
73 a dictionary of definitions, enclosed in { }
74 a "closure", followed by arguments
75 a path to a key that already exists, to reference that definition
76
77Note that dictionaries can be nested: a key in one dictionary can
78refer to another dictionary. When secnet looks for a key in a
79particular directory and can't find it, it looks in the dictionary's
80lexical 'parents' in turn until it finds it (or fails to find it at
81all and stops with an error).
82
83Definitions can refer to previous definitions by naming them with a
84path. Paths are key1/key2/key3... (starting from wherever we find
85key1, i.e. in the current dictionary or any of its parents), or
86alternatively /key1/key2/key3... (to start from the root).
87Definitions cannot refer to future definitions.
88
89Example:
90
91a=1;
92b=2;
93c={ d=3; e=a; };
94f={ a=4; g=c; };
95
96The following paths are valid:
97a is 1
98b is 2
99c is a dictionary:
100 c/d is 3
101 c/e is 1
102f is a dictionary:
103 f/a is 4
104 f/g is a dictionary:
105 f/g/d is 3
106 f/g/e is 1
107
108Note that f/g/e is NOT 4.
109
110In a future version of secnet it will also be permissible to list
111other dictionaries before a dictionary definition,
112eg. <defaults,otherdefaults>{definitions}. These will be searched in
113order for keys, before the lexical parent. (This is not yet
114implemented)
115
116Elements that are lists are inserted into lists in definitions, not
117referenced by them (i.e. you can't have lists of lists).
118
119Some closures may be followed by an argument list in ( ), and may
120return any number of whatever type they like (including other
121closures). Some types of closure (typically those returned from
122invokations of other closures) cannot be invoked.
123
124closure { definitions } is short for closure({definitions}).
125
126The main body of secnet, and all the additional modules, predefine
127some keys in the root dictionary. The main ones are:
128
129 yes, true, True, TRUE: the boolean value True
130 no, false, False, FALSE: the boolean value False
131 makelist: turns a dictionary (arg1) into a list of definitions
132 (ignoring the keys)
133 readfile: reads a file (arg1) and returns it as a string
134
135Keys defined by modules are described below, in the module
136documentation.
137
138Other configuration files can be included inline by writing "include
139filename" at the start of a line.
140
141After the configuration file is read, secnet looks for particular keys
142in configuration space to tell it what to do:
143
144 system: a dictionary which can contain the following keys:
145 log (log closure): a destination for system messages
146 userid (string): the userid for secnet to run as once it drops privileges
147 pidfile (string): where to store its PID
148
149 sites: a list of closures of type 'site', which define other tunnel
150 endpoints that secnet will attempt to communicate with
151
152* secnet command line options
153
154XXX TODO
155
156* secnet builtin modules
157
158** resolver
159
160Defines:
161 adns (closure => resolver closure)
162
3454dce4
SE
163adns: dict argument
164 config (string): optional, a resolv.conf for ADNS to use
165
558fa3fb
SE
166** random
167
168Defines:
169 randomsrc (closure => randomsrc closure)
170
3454dce4
SE
171randomsrc: string[,bool]
172 arg1: filename of random source
173 arg2: if True then source is blocking
174
558fa3fb
SE
175** udp
176
177Defines:
178 udp (closure => comm closure)
179
3454dce4
SE
180udp: dict argument
181 port (integer): UDP port to listen and send on
182 buffer (buffer closure): buffer for incoming packets
b2a56f7c 183 authbind (string): optional, path to authbind-helper program
3454dce4 184
042a8da9 185** log
558fa3fb
SE
186
187Defines:
188 logfile (closure => log closure)
b2a56f7c 189 syslog (closure => log closure)
558fa3fb 190
b2a56f7c
SE
191logfile: dict argument
192 filename (string): where to log to
193 class (string list): what type of messages to log
194 { "debug-config", M_DEBUG_CONFIG },
195 { "debug-phase", M_DEBUG_PHASE },
196 { "debug", M_DEBUG },
197 { "all-debug", M_DEBUG|M_DEBUG_PHASE|M_DEBUG_CONFIG },
198 { "info", M_INFO },
199 { "notice", M_NOTICE },
200 { "warning", M_WARNING },
201 { "error", M_ERROR },
202 { "security", M_SECURITY },
203 { "fatal", M_FATAL },
204 { "default", M_WARNING|M_ERROR|M_SECURITY|M_FATAL },
205 { "verbose", M_INFO|M_NOTICE|M_WARNING|M_ERROR|M_SECURITY|M_FATAL },
206 { "quiet", M_FATAL }
207
042a8da9
SE
208logfile will close and reopen its file upon receipt of SIGHUP.
209
b2a56f7c
SE
210syslog: dict argument
211 ident (string): include this string in every log message
212 facility (string): facility to log as
213 { "authpriv", LOG_AUTHPRIV },
214 { "cron", LOG_CRON },
215 { "daemon", LOG_DAEMON },
216 { "kern", LOG_KERN },
217 { "local0", LOG_LOCAL0 },
218 { "local1", LOG_LOCAL1 },
219 { "local2", LOG_LOCAL2 },
220 { "local3", LOG_LOCAL3 },
221 { "local4", LOG_LOCAL4 },
222 { "local5", LOG_LOCAL5 },
223 { "local6", LOG_LOCAL6 },
224 { "local7", LOG_LOCAL7 },
225 { "lpr", LOG_LPR },
226 { "mail", LOG_MAIL },
227 { "news", LOG_NEWS },
228 { "syslog", LOG_SYSLOG },
229 { "user", LOG_USER },
230 { "uucp", LOG_UUCP }
231
042a8da9
SE
232** util
233
234Defines:
235 sysbuffer (closure => buffer closure)
236
b2a56f7c
SE
237sysbuffer: integer[,dict]
238 arg1: buffer length
239 arg2: options:
240 lockdown (boolean): if True, mlock() the buffer
241
558fa3fb
SE
242** site
243
244Defines:
245 site (closure => site closure)
246
3454dce4
SE
247site: dict argument
248 local-name (string): this site's name for itself
249 name (string): the name of the site's peer
250 netlink (netlink closure)
251 comm (comm closure)
252 resolver (resolver closure)
253 random (randomsrc closure)
254 local-key (rsaprivkey closure)
255 address (string): optional, DNS name used to find our peer
256 port (integer): mandatory if 'address' is specified: the port used
257 to contact our peer
258 networks (string list): networks that our peer may claim traffic for
259 key (rsapubkey closure): our peer's public key
260 transform (transform closure): how to mangle packets sent between sites
261 dh (dh closure)
262 hash (hash closure)
263 key-lifetime (integer): max lifetime of a session key, in ms [one hour]
264 setup-retries (integer): max number of times to transmit a key negotiation
265 packet [5]
266 setup-timeout (integer): time between retransmissions of key negotiation
267 packets, in ms [1000]
268 wait-time (integer): after failed key setup, wait this long (in ms) before
269 allowing another attempt [20000]
270 renegotiate-time (integer): if we see traffic on the link after this time
271 then renegotiate another session key immediately [depends on key-lifetime]
272 keepalive (bool): if True then attempt always to keep a valid session key
273 log-events (string list): types of events to log for this site
274 unexpected: unexpected key setup packets (may be late retransmissions)
275 setup-init: start of attempt to setup a session key
276 setup-timeout: failure of attempt to setup a session key, through timeout
277 activate-key: activation of a new session key
278 timeout-key: deletion of current session key through age
279 security: anything potentially suspicious
280 state-change: steps in the key setup protocol
281 packet-drop: whenever we throw away an outgoing packet
282 dump-packets: every key setup packet we see
283 errors: failure of name resolution, internal errors
284 all: everything (too much!)
285 netlink-options (string list): options to pass to netlink device when
286 registering remote networks
287 soft: create 'soft' routes that go away when there's no key established
288 with the peer
289 allow-route: allow packets from our peer to be sent down other tunnels,
290 as well as to the host
291
558fa3fb
SE
292** transform
293
294Defines:
295 serpent256-cbc (closure => transform closure)
296
297** netlink
298
299Defines:
3454dce4
SE
300 null-netlink (closure => netlink closure)
301
302null-netlink: dict argument
303 name (string): name for netlink device, used in log messages
304 networks (string list): networks on the host side of the netlink device
305 exclude-remote-networks (string list): networks that may never be claimed
306 by any remote site using this netlink device
307 local-address (string): IP address of host's tunnel interface
308 secnet-address (string): IP address of this netlink device
c6f79b17 309 ptp-address (string): IP address of the other end of a point-to-point link
3454dce4
SE
310 mtu (integer): MTU of host's tunnel interface
311
c6f79b17
SE
312Only one of secnet-address or ptp-address may be specified. If
313point-to-point mode is in use then precisely one tunnel must register
314with the netlink device.
315
042a8da9
SE
316Netlink will dump its current routing table to the system/log on
317receipt of SIGUSR1.
318
3454dce4
SE
319** slip
320
321Defines:
558fa3fb 322 userv-ipif (closure => netlink closure)
3454dce4
SE
323
324userv-ipif: dict argument
325 userv-path (string): optional, where to find userv ["userv"]
326 service-user (string): optional, username for userv-ipif service ["root"]
327 service-name (string): optional, name of userv-ipif service ["ipif"]
328 buffer (buffer closure): buffer for assembly of host->secnet packets
329 plus generic netlink options, as for 'null-netlink'
330
331** tun
332
333Defines:
558fa3fb
SE
334 tun (closure => netlink closure) [only on linux-2.4]
335 tun-old (closure => netlink closure)
3454dce4
SE
336
337tun: dict argument
338 device (string): optional, path of TUN/TAP device file ["/dev/net/tun"]
339 interface (string): optional, name of tunnel network interface
340 ifconfig-path (string): optional, path to ifconfig command
341 route-path (string): optional, path to route command
342 buffer (buffer closure): buffer for host->secnet packets
343 plus generic netlink options, as for 'null-netlink'
344
345tun-old: dict argument
346 device (string): optional, path of TUN/TAP device file ["/dev/tun*"]
347 interface (string): optional, name of tunnel network interface
348 interface-search (bool): optional, whether to search for a free tunnel
349 interface (True if 'device' not specified, otherwise False)
350 ifconfig-path (string): optional, path to ifconfig command
351 route-path (string): optional, path to route command
352 plus generic netlink options, as for 'null-netlink'
558fa3fb 353
c6f79b17
SE
354 I recommend you don't specify the 'interface' option unless you're
355 doing something that requires the interface name to be constant.
356
558fa3fb
SE
357** rsa
358
359Defines:
360 rsa-private (closure => rsaprivkey closure)
361 rsa-public (closure => rsapubkey closure)
362
3454dce4
SE
363rsa-private: string[,bool]
364 arg1: filename of SSH private key file (version 1, no password)
365 arg2: whether to check that the key is usable [default True]
366
367rsa-public: string,string
368 arg1: encryption key (decimal)
369 arg2: modulus (decimal)
370
558fa3fb
SE
371** dh
372
373Defines:
374 diffie-hellman (closure => dh closure)
375
3454dce4
SE
376diffie-hellman: string,string[,bool]
377 arg1: modulus (hex)
378 arg2: generator (hex)
379 arg3: whether to check that the modulus is prime [default True]
380
558fa3fb
SE
381** md5
382
383Defines:
384 md5 (hash closure)
3454dce4
SE
385
386** sha1
387
388Defines:
389 sha1 (hash closure)
c6f79b17
SE
390
391** conffile
392
393Defines:
394 makelist (dictionary => list of definitions)
395 readfile (string => string)
396 map (closure,list => list)
397
398makelist: dictionary
399 returns a list consisting of the definitions in the dictionary. The keys
400 are discarded.
401
402readfile: string
403 reads the named file and returns its contents as a string
404
405map:
406 applies the closure specified as arg1 to each of the elements in the list.
407 Returns a list made up of the outputs of the closure.