memcmp: Introduce and use consttime_memeq
[secnet] / secnet.8
CommitLineData
3ca86f6d
RK
1.TH secnet 8
2
3.SH NAME
4secnet \- VPN router daemon
5
6.SH SYNOPSIS
7\fBsecnet\fR [\fIOPTIONS\fR]
8
9.SH DESCRIPTION
10\fBsecnet\fR allows virtual private networks to be constructed
11spanning multiple separate sites.
12
13.SH OPTIONS
14.TP
15.B --verbose\fR, \fB-v
16Enable extra diagnostics.
17.TP
18.B --nowarnings\fR, \fB-w
19Suppress warnings.
20.TP
21.B --help
22Display usage message.
23.TP
24.B --version
25Display version string.
26.TP
27.B --nodetach\fR, \fB-n
28Don't go into background.
29The default behaviour is to become a daemon during startup.
30.TP
31.B --silent\fR, \fB--quiet\fR, \fB-f
32Suppress error messages.
33.TP
34.B --debug\fR, \fB-d
35Enable debug messages.
36.TP
37.B --config\fR, \fB-c \fIPATH
38Specify configuration file.
39The default is \fI/etc/secnet/secnet.conf\fR.
40.TP
41.B --just-check-config\fR, \fB-j
42Check configuration and exit.
43.TP
44.B --sites-key\fR, \fB-s \fIKEY
45Configuration file key defining active sites.
46The default is \fBsites\fR.
47
48.SH "CONFIGURATION FILE"
49.SS Overview
50The default configuration file is \fI/etc/secnet/secnet.conf\fR.
51This can be overridden with the \fB--config\fR option.
52.PP
53The configuration file defines a dictionary (a mapping from keys to
54values) of configuration information for secnet.
55It is recursive in nature, i.e. values may themselves include dictionaries.
56Any node in the nested structure thus defined can be identified by a
57\fIpath\fR, which is the sequence of keys necessary to reach it from
58the root, separated by "/" characters.
59See \fBPaths\fR below for how this is used.
60.PP
61Furthermore, when a key is looked up in a dictionary, if it cannot be
62found, it is sought in the parent dictionary, and so on back to the
63root.
64For instance, each \fIsite\fR must contain the \fBresolver\fR key, but
65in a typical configuration there is no value in having different
66resolvers for each site.
67Therefore \fBresolver\fR is defined at the root and thus automatically
68incorporated into all sites.
69.SS Whitespace
70Whitespace, including newlines, is ignored except to the extent that
71it bounds other symbols.
72.PP
73Comment begin with "#" and continues to the end of the line.
74Comments are ignored.
75.SS Inclusion
76A file may be recursively included into the configuration file using a
77line of the form:
78.IP
79\fBinclude \fIPATH
80.PP
81This is handled at a higher level than the main parser and so
82precludes the possibility of using the string \fBinclude\fR for any
83other purpose.
84.\" check if this is true. it's probably a bug!
85.SS Assignments
86The configuration file contains one or more assigments.
87Each assignment is written:
88.IP
89\fIkey\fR [\fB=\fR] \fIlist\fR\fB;\fR
90.PP
91i.e. the equals sign is optional.
92The semicolon is mandatory in all contexts.
93.PP
94Keys start with a letter or "_" and continue with any numbers of
95letters, digits, "_" and "-".
96.PP
97Each \fIkey\fR is a list of one or more \fIvalues\fR, separated by commas.
98Possible values types are \fIboolean\fR, \fIstring\fR, \fInumber\fR,
99\fIdictionary\fR, \fIpath\fR and \fIclosure evaluation\fR.
100.\" This man page draws a distinction between a closure (the thing
101.\" evaluated) and a closure evaluation (the closure plus is
102.\" arguments).
103.SS "Strings"
104Strings are contained within "double quotes".
105There is (currently) no escape syntax and no way to include quotes
106inside strings.
107.PP
108Example:
109.nf
110 filename "/var/log/secnet";
111.fi
112.SS "Numbers"
113Numbers are encoded in decimal and do not include a sign.
114Numbers must lie in the range 0 to 4294967295.
115.PP
116Example:
117.nf
118 mtu 1400;
119.fi
120.SS "Dictionaries"
121.\" In conffile.y dictionaries can be preceded by a search path, but
122.\" this is not implemented elsewhere, so not documented here.
123Dictionaries consist of one or more assignments, in the same syntax as
124given above, enclosed in "{" and "}".
125.PP
126Example:
127.nf
128 system {
129 userid "secnet";
130 pidfile "/var/run/secnet.pid";
131 };
132.fi
133.SS "Paths"
134Paths allow a key already defined in the configuration to be aliased.
135.PP
136Paths consist of a sequence of keys separated by "/".
137If the path starts with a "/" then it is an \fIabsolute path\fR and
138the search starts at the root of the configuration.
139Otherwise it is a \fIrelative path\fR and starts in the containing
140dictionary or in any of its parents, down to and including the root.
141If there is more than one match, the one furthest from the root "wins".
142.PP
143The value of a path is the list assigned to the key it refers to.
144Lists are flattened; for example if a key is defined as a list of two
145paths, and each of those refers to a list of two integers, the
146original key is therefore defined to be a list of four integers, not
147a list consisting of two lists.
148.PP
149It is not possible to refer to a \fIlater\fR key using a path.
150.PP
151Example:
152.nf
153 vpn {
154 test {
155 kakajou vpn-data/test/kakajou/kakajou;
156 araminta vpn-data/test/araminta/araminta;
157 deodand vpn-data/test/deodand/deodand;
158 all-sites kakajou,araminta,deodand;
159 };
160 };
161 all-sites vpn/test/all-sites;
162.fi
163.PP
164Here, each of \fBvpn/test/kakajou\fR, \fBvpn/test/araminta\fR and
165\fBvpn/test/deodand\fR are defined as aliases to values defined
166elsewhere.
167\fBvpn/tests/all-sites\fR is defined as the list of all three of those
168values, and \fBall-sites\fR is then defined to be an alias for that.
169.SS "Booleans"
170The (single-element) paths \fBfalse\fR, \fBno\fR and \fBnowise\fR are
171predefined and refer to a boolean false value.
172Similarly \fBtrue\fR, \fByes\fR and \fBverily\fR point at a boolean
173true value.
174.PP
175In all six cases, variants with just the first letter capitalized, and
176with all letters capitalized, are also provided.
177.PP
178Example:
179.nf
180 random randomfile("/dev/urandom",no);
181.fi
182.SS "Closure Evaluation"
183Closure evaluation uses the following syntax:
184.IP
185\fICLOSURE \fB( \fIARGUMENTS \fB)
186.PP
187\fICLOSURE\fR may be a path referring to a closure, or may itself be a
188closure evaluation.
189.PP
190\fIARGUMENTS\fR is a list of zero or more values, separated by commas.
191As a shortcut, if the arguments consist of a single dictionary, the
192parentheses may be ommitted:
193.IP
194\fICLOSURE \fB{ \fR... \fB}
195.PP
196Example:
197.nf
198 sites map(site, vpn/test/all-sites);
199.fi
200.PP
201When a closure is evaluated it returns a value (a list, much as above)
202and may also have side effects (which may be immediate or may be
203deferred to some later phase of execution).
204A list of built-in closures is given below.
205.SS "Mandatory Keys"
206Two keys are mandatory.
207\fBsystem\fR must be a dictionary in which the following keys can be
208looked up:
209.TP
210.B log
211A \fIlog closure\fR; see the \fBlogfile\fR documentation below.
212The destination for log messages.
213Mandatory.
214.TP
215.B userid
216A string.
217The userid to run as after dropping privilege.
218Optional.
219.TP
220.B pidfile
221A string.
222The path to write a pidfile.
223Optional.
224.PP
225\fBsites\fR should be a list of \fIsite closures\fR; see the \fBsite\fR documentation below.
226This defines the collection of tunnel endpoints that \fBsecnet\fR will
227communicate with.
228.PP
229Recall the recursive lookup logic described in \fBOverview\fR above:
230if (for instance) \fBlog\fR is defined in the top level dictionary but
231not in \fBsystem\fR, it will nevertheless be found when looked up in
232the latter.
233
234.SH CLOSURES
235\fBsecnet\fR contains a collection of built-in closures
236with names (i.e. single-element paths) given below.
237.PP
238Most of them return anonymous closures of various types,
239which are described contextually.
240
241.SS adns
242\fBadns(\fIDICT\fB)\fR => \fIresolver closure\fR
243.TP
244.I DICT
245This either be empty or contain the single key \fBconfig\fR, with a
246string value giving configuration to supply to ADNS.
247This might be read from a file using \fBreadfile\fR.
248.PP
249A \fIresolver closure\fR is a means of converting hostnames into
250network addresses.
251
252.SS diffie-hellman
253.PP
254\fBdiffie-hellman(\fIMODULUS\fB, \fIGENERATOR\fR[\fB, \fICHECK\fR]\fB)\fR => \fIdh closure\fR
255.TP
256.I MODULUS
257String.
258The prime modulus \fIp\fR in hex.
259.TP
260.I GENERATOR
261String.
262The generator \fIg\fR in hex.
263.TP
264.I CHECK
265Boolean.
266If \fBtrue\fR (the default) then check if \fIp\fR is prime.
267.PP
268A \fIdh closure\fR defines a group to be used for key exchange.
269The same group must be used by all sites in the VPN.
270
271.SS logfile
272\fBlogfile(\fIDICT\fB)\fR => \fIlog closure\fR
273.PP
274Valid keys in the \fIDICT\fR argument are:
275.TP
276.B filename
277The path to log to.
278.TP
279.B class
280A list of strings defining which classes of message to log.
281The possible message classes are \fBdebug-config\fR,
282\fBdebug-phase\fR, \fBdebug\fR, \fBinfo\fR, \fBnotice\fR,
283\fBwarning\fR, \fBerror\fR, \fBsecurity\fR and \fBfatal\fR.
284.IP
285\fBall-debug\fR is the union of all the \fBdebug\fR... classes.
286\fBdefault\fR is equivalent to \fBwarning, error, security, fatal\fR.
287\fBverbose\fR is equivalent to \fBinfo, notice, warning, error,
288security, fatal\fR.
289\fBquiet\fR is equivalent to \fBfatal\fR.
290.PP
291A \fIlog closure\fR is a means of saving log messages.
292See also \fBsyslog\fR below.
293
294.SS makelist
295\fBmakelist(\fIDICT\fB)\fR => \fILIST\fR
296.PP
297Returns the (flattened) list of values from the dictionary, discarding
298the keys.
299
300.SS map
301\fBmap(\fICLOSURE\fB, \fIINPUT\fR...\fB)\fR => \fILIST\fR
302.PP
303Applies \fICLOSURE\fR to all its additional input arguments and
304returns the resulting list.
305
306.SS md5
307\fBmd5\fR is a \fIhash closure\fR implementing the MD5 algorithm.
308
309.SS null-netlink
310\fBnull-netlink(\fIDICT\fB)\fR => \fInetlink closure\fR
311.br
312\fBnull-netlink(\fIDICT\fB)\fR => \fIpure closure\fR
313.\" TODO pure closure is what it's called internally but this is a
314.\" very opaque name to use in docs
315.PP
316Valid keys in the \fIDICT\fR argument are:
317.TP
318.B name
319String.
320The name for the netlink device.
321The default is \fBnull-netlink\fR.
322.TP
323.B networks
324List of strings.
325The networks on the host side of the netlink device.
326.TP
327.B remote-networks
328List of strings.
329Networks that may be claimed by remote sites using this netlink device.
330.TP
331.B secnet-address
332String.
333IP address of this netlink.
334Incompatible with \fBptp-address\fR.
335.TP
336.B ptp-address
337String.
338IP address of the other end of a point-to-point link.
339Incompatible with \fBsecnet-address\fR.
340.TP
341.B mtu
342Number.
343The MTU of the netlink device.
344The default is 1000.
345.PP
346If \fBptp-address\fR is used then the result is a \fInetlink closure\fR.
347This can be used directly with the \fBlink\fR key in the \fBsites\fR
348closure (see below).
349.PP
350If \fBsecnet-address\fR is used then the result is a \fIpure
351closure\fR.
352This must be evaluated to yield a \fInetlink closure\fR, using a
353dictionary argument with the following keys:
354.TP
355.B routes
356String list.
357networks reachable via this tunnel, in \fIaddress\fB/\fIbits\fR format.
358.TP
359.B options
360String list.
361A list of options:
362.RS
363.TP
364.B allow-route
365Allow packets received via this tunnel to be routed down other tunnels
366(without this option only packets from the host will be routed).
367.TP
368.B soft
369Remove these routes from the host routing table when the link quality
370is 0.
371.RE
372.TP
373.B mtu
374Number.
375Default MTU over this link.
376The default is inherited from the \fIpure closure\fR.
377.TP
378.B priority
379Number.
380The priority of this link.
381Higher values beat lower values.
382The default is 0.
383
384.\" TODO ptp-address turns up in sites.conf, but why? I think this
385.\" is a bug in make-secnet-sites; it is not used by
386 \" netlink_inst_create.
387
388.PP
389A \fInetlink closure\fR is a virtual IP link, and is supplied to the
390\fBlink\fR key of a \fIsite\fR closure.
391.PP
392The netlink created by \fBnull-netlink\fR has no connection to the
393host.
394See \fBtun\fR and \fBuserv-ipif\fR below for more useful alternatives.
395
396
397
398.SS randomfile
399\fBrandomfile(\fIFILENAME\fR[\fB, \fIBLOCKING\fR]\fB)\fR => \fIrandomsource closure\fR
400.TP
401.I FILENAME
402String.
403Path to random device, e.g. \fI/dev/urandom\fR.
404.TP
405.I BLOCKING
406Boolean.
407\fBTrue\fR if this is a blocking device and \fBfalse\fR otherwise (the default).
408Blocking device support is not implemented so this must always be
409\fBFalse\fR or absent.
410.PP
411A \fIrandomsource closure\fR is a source of random numbers.
412
413.SS readfile
414\fBreadfile(\fIPATH\fB)\fR => \fISTRING\fR
415.PP
416Read the contents of the file \fIPATH\fR (a string) and return it as a string.
417
418.SS serpent256-cbc
419\fBserpent256-cbc(\fIDICT\fB)\fR => \fItransform closure\fR
420.PP
421Valid keys in the \fIDICT\fR argument are:
422.TP
423.B max-sequence-skew
424The maximum acceptable difference between the sequence number in a
425received, decrypted message and the previous one.
426The default is 10.
427It may be necessary to increase this is if connectivity is poor.
428.PP
429A \fItransform closure\fR is a reversible means of transforming
430messages for transmission over a (presumably) insecure network.
431It is responsible for both confidentiality and integrity.
432
433.SS rsa-private
434\fBrsa-private(\fIPATH\fB\fR[, \fICHECK\fR]\fB)\fR => \fIrsaprivkey closure\fR
435.TP
436.I PATH
437String.
438The path to a file containing an RSA private key in SSH format
439(version 1).
440There must be no passphrase.
441.TP
442.I CHECK
443Boolean.
444If \fBtrue\fR (the default) then check that the key is valid.
445
446.SS rsa-public
447\fBrsa-public(\fIKEY\fB, \fIMODULUS\fB)\fR => \fIrsapubkey closure\fR
448.TP
449.I KEY
450String.
451The public key exponent (\fIe\fR), in decimal.
452.TP
453.I MODULUS
454String.
455The modulus (\fIn\fR), in decimal.
456
457.SS sha1
458\fBsha1\fR is a \fIhash closure\fR implementing the SHA-1 algorithm.
459
460.SS site
461\fBsite(\fIDICT\fB)\fR => \fIsite closure\fR
462.PP
463Valid keys in the \fIDICT\fR argument are:
464.TP
465.B local-name
466String.
467The site's name for itself.
468.TP
469.B name
470String.
471The name of the site's peer.
472.TP
473.B link
474A \fInetlink closure\fR.
475.TP
476.B comm
477A \fIcomm closure\fR.
478.TP
479.B resolver
480A \fIresolver closure\fR.
481.TP
482.B random
483A \fIrandomsource closure\fR.
484.TP
485.B local-key
486An \fIrsaprivkey closure\fR.
487The key used to prove our identity to the peer.
488.TP
489.B address
490String.
491The DNS name of the peer.
492Optional, but if it is missing then it will not be possible to
493initiate new connections to the peer.
494.TP
495.B port
496Number.
497The port to contact the peer.
498.TP
499.B key
500An \fIrsapubkey closure\fR.
501The key used to verify the peer's identity.
502.TP
503.B transform
504A \fItransform closure\fR.
505Used to protect packets exchanged with the peer.
506.TP
507.B dh
508A \fIdh closure\fR.
509The group to use in key exchange.
510.TP
511.B hash
512The hash function used during setup.
513.\" TODO clarify what we actually use it for!
514.TP
515.B key-lifetime
516Number.
517The maximum lifetime of a session key in milliseconds.
518The default is one hour.
519.TP
520.B setup-retries
521Number.
522The maximum number of times a key negotiation packet will be
523transmitted before giving up.
524The default is 5.
525.TP
526.B setup-timeout
527Number.
528The time between retransmissions of key negotiation packets, in milliseconds.
529The default is one second.
530.TP
531.B wait-time
532Number.
533The time to wait after a failed key setup before making another
534attempt, in milliseconds.
535The default is 20s.
536.TP
537.B renegotiate-time
538Number.
539The time after which a new session key will be negotiated, \fIif\fR
540there is traffic on the link, in milliseconds.
541It must not be greater than the \fBkey-lifetime\fR.
542The default 5 minutes less than the key lifetime, unless the lifetime
543is less than 10 minutes in which case the default is half the
544lifetime.
545.TP
546.B keepalive
547Boolean.
548If \fBtrue\fR then attempt to always maintain a live session key.
549Not implemented.
550.TP
551.B log-events
552String list.
553Types of event to log for this site.
554.RS
555.TP
556.B unexpected
557Unexpected key setup packets (including late retransmissions).
558.TP
559.B setup-init
560Start of attempt to setup a session key.
561.TP
562.B setup-timeout
563Failure of attempt to setup a session key, through timeout.
564.TP
565.B activate-key
566Activation of a new session key.
567.TP
568.B timeout-key
569Deletion of current session key through age.
570.TP
571.B security
572Anything potentially suspicious.
573.TP
574.B state-change
575Steps in the key setup protocol.
576.TP
577.B packet-drop
578Whenever we throw away an outgoing packet.
579.TP
580.B dump-packets
581Every key setup packet we see.
582.TP
583.B errors
584Failure of name resolution, internal errors.
585.TP
586.B all
587Everything (too much!)
588.RE
589.PP
590A \fIsite closure\fR defines one site to communicate with.
591\fBsecnet\fR expects the (root) key \fBsite\fR to be a list of site
592closures.
593
594.SS sysbuffer
595\fBsysbuffer(\fR[\fISIZE\fR[\fB, \fIOPTIONS\fR]]\fB)\fR => \fIbuffer closure\fR
596.TP
597.I SIZE
598Number.
599The size of the buffer in bytes.
600This must be between 64 and 131072.
601The default is 4096.
602.TP
603.I OPTIONS
604Dictionary.
605Optional and presently unused.
606.\" lockdown is accepted but ignored.
607.PP
608A \fIbuffer closure\fR is a means of buffering packets to send or that
609have been received.
610
611.SS syslog
612\fBsyslog(\fIDICT\fB)\fR => \fIlog closure\fR
613.PP
614Valid keys in the \fIDICT\fR argument are:
615.TP
616.B ident
617String.
618The ident string to pass to \fBopenlog\fR(3); this value will appear
619in each message.
620.TP
621.B facility
622String.
623The facility to log as.
624The possible values are \fBauthpriv\fR, \fBcron\fR, \fBdaemon\fR,
625\fBkern\fR, \fBlocal0\fR-\fB7\fR, \fBlpr\fR, \fBmail\fR, \fBnews\fR,
626\fBsyslog\fR, \fBuser\fR and \fBuucp\fR.
627.PP
628See also \fBlogfile\fR above.
629
630.SS tun
631\fBtun(\fIDICT\fB)\fR => \fInetlink closure\fR
632.br
633\fBtun(\fIDICT\fB)\fR => \fIpure closure\fR
634.PP
635Valid keys in the \fIDICT\fR argument are those documented for
636\fBnull-netlink\fR above, plus:
637.TP
638.B flavour
639String.
640The type of TUN interface to use.
641Possible values are \fBlinux\fR, \fBbsd\fR, \fBstreams\fR and \fBguess\fR.
642The default is \fBguess\fR.
643.TP
644.B device
645String.
646The path to the TUN/TAP device file.
647The default is \fI/dev/net/tun\fR for the \fBlinux\fR flavour and
648\fI/dev/tun\fR for the others.
649.TP
650.B interface
651String.
652The interface to use.
653The default is to pick one automatically.
654This cannot be used with the \fBstreams\fR flavour.
655.TP
656.B local-address
657String.
658IP address of the host's tunnel interface.
659.\" README says this belongs to netlink-null but actually it's
660 \" duplicated between slip & tun
661.TP
662.B ifconfig-path
663String.
664The name of the \fBifconfig\fR command.
665The default is simply "ifconfig".
666.TP
667.B route-path
668String.
669The name of the \fBroute\fR command.
670The default is simply "route".
671.TP
672.B ifconfig-type
673String.
674The syntax expected by the \fBifconfig\fR command.
675Possible values are \fBlinux\fR, \fBbsd\fR, \fBioctl\fR,
676\fBsolaris-2.5\fR and \fBguess\fR.
677The default is \fBguess\fR.
678.TP
679.B route-type
680String.
681The syntax expected by the \fBifconfig\fR command.
682Possible values are \fBlinux\fR, \fBbsd\fR, \fBioctl\fR,
683\fBsolaris-2.5\fR and \fBguess\fR.
684The default is \fBguess\fR.
685.TP
686.B buffer
687A \fIbuffer closure\fR to use for packets transferred from the host to secnet.
688The buffer size must be at least 60 greater than the MTU.
689.\" TODO rumour has is that buffers are sometimes shareable between
690.\" netlink devices - document that if the conditions are reasonable
691.\" ones.
692.PP
693The \fBifconfig-type\fR and \fBroute-type\fR values determine how
694those commands are executed.
695If they are set to \fBioctl\fR then low-level system calls are used
696directly instead of invoking the commands.
697.PP
698The netlink created by \fBtun\fR uses the \fBtun\fR device to
699communicate with the host kernel.
700
701.SS udp
702\fBudp(\fIDICT\fB)\fR => \fIcomm closure\fR
703.PP
704Valid keys in the \fIDICT\fR argument are:
705.TP
706.B address
707String.
708The IP address to bind on.
709The default is 0.0.0.0, i.e. "any".
710.TP
711.B port
712Number.
713The port number to bind to.
714The default is 0, i.e. the OS will choose one.
715It is suggested that any given VPN agree a common port number.
716.TP
717.B buffer
718A \fIbuffer closure\fR.
719See the \fBsysbuffer\fR closure above.
720.TP
721.B authbind
722String.
723The path to a helper program to bind the socket.
724Optional.
725.IP
726The program will be invoked with the address and port number as its
727arguments, and with the socket to bind as file descriptor 0.
728It should either bind the socket as requested, or exit with nonzero
729status.
730.PP
731A \fIcomm closure\fR is a means of sending and receiving messages via
732a network.
733It does not provide confidentiality, reliablity or availability.
734
735.SS userv-ipif
736\fBuserv-ipif(\fIDICT\fB)\fR => \fInetlink closure\fR
737.br
738\fBuserv-ipif(\fIDICT\fB)\fR => \fIpure closure\fR
739.PP
740Valid keys in the \fIDICT\fR argument are those documented for
741\fBnull-netlink\fR above, plus:
742.TP
743.B local-address
744String.
745IP address of the host's SLIP interface.
746.\" README says this belongs to netlink-null but actually it's
747 \" duplicated between SLIP & tun
748.TP
749.B userv-path
750String.
751Where to find \fBuserv\fR(1).
752The default is \fB"userv"\fR.
753.TP
754.B service-user
755String.
756The name of the user that owns the service.
757The default is \fB"root"\fR.
758.TP
759.B service-name
760String.
761The name of the service to request.
762The default is \fB"ipif"\fR.
763.TP
764.B buffer
765A \fIbuffer closure\fR to use for packets transferred from the host to secnet.
766.PP
767The netlink created by \fBuserv-ipif\fR invokes the specified \fBuserv\fR service with pipes connected to its standard input and output.
768It uses SLIP to communicate with the host kernel via these pipes.
769
770.SH FILES
771.TP
772.I /etc/secnet/secnet.conf
773Configuration file.
774
775.SH "SEE ALSO"
776\fBuserv\fR(1)