chiark / gitweb /
5a11164763eda16df987c994775121f24e0ea2d8
[tripe] / svc / connect.8.in
1 .\" -*-nroff-*-
2 .\".
3 .\" Manual for the connect service
4 .\"
5 .\" (c) 2008 Straylight/Edgeware
6 .\"
7 .
8 .\"----- Licensing notice ---------------------------------------------------
9 .\"
10 .\" This file is part of Trivial IP Encryption (TrIPE).
11 .\"
12 .\" TrIPE is free software: you can redistribute it and/or modify it under
13 .\" the terms of the GNU General Public License as published by the Free
14 .\" Software Foundation; either version 3 of the License, or (at your
15 .\" option) any later version.
16 .\"
17 .\" TrIPE is distributed in the hope that it will be useful, but WITHOUT
18 .\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 .\" FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
20 .\" for more details.
21 .\"
22 .\" You should have received a copy of the GNU General Public License
23 .\" along with TrIPE.  If not, see <https://www.gnu.org/licenses/>.
24 .
25 .\"--------------------------------------------------------------------------
26 .so ../common/defs.man \"@@@PRE@@@
27 .
28 .\"--------------------------------------------------------------------------
29 .TH connect 8tripe "11 December 2007" "Straylight/Edgeware" "TrIPE: Trivial IP Encryption"
30 .
31 .\"--------------------------------------------------------------------------
32 .SH "NAME"
33 .
34 connect \- tripe service to handle addition and removal of peers
35 .
36 .\"--------------------------------------------------------------------------
37 .SH "SYNOPSIS"
38 .
39 .B connect
40 .RB [ \-a
41 .IR socket ]
42 .RB [ \-d
43 .IR dir ]
44 .RB [ \-p
45 .IR file ]
46 .br
47 \&      \c
48 .RB [ \-\-daemon ]
49 .RB [ \-\-debug ]
50 .RB [ \-\-startup ]
51 .
52 .\"--------------------------------------------------------------------------
53 .SH "DESCRIPTION"
54 .
55 The
56 .B connect
57 service tracks associations with peers and performs various actions at
58 appropriate stages in the assocations' lifecycles.  It also registers
59 new peers with the
60 .BR tripe (8)
61 server on demand.
62 .PP
63 For example:
64 .hP \*o
65 When a peer is added, it arranges to configure the corresponding network
66 interface correctly, and (if necessary) to initiate a dynamic
67 connection.
68 .hP \*o
69 When a peer is removed, it arranges to bring down the network interface.
70 .hP \*o
71 While the peer is known, it
72 .BR PING s
73 it at regular intervals.  If the peer fails to respond, it can be
74 removed or reconnected.
75 .PP
76 A peer may participate
77 .I actively
78 or
79 .I passively
80 in a connection.  A peer participating actively (an
81 .IR "active peer" )
82 must already know its peer's connection details \(en its server's IP
83 address and port.  Active connection is suitable when the peer is a
84 well-known server with stable details.
85 .PP
86 A server participating passively (a
87 .IR "passive peer" )
88 waits to be contacted by its peer, and discovers the peer's IP address
89 and port as a result of a simple protocol described below.  Passive
90 connection is suitable when the peer's IP address or port can vary over
91 time \(en e.g., if its IP address is assigned dynamically by DHCP or
92 PPP, or if it is hidden behind a NAT firewall.
93 .PP
94 If both peers are active, we say that they establish an
95 .IR "static connection" ;
96 if one is passive, we say that they establish a
97 .IR "dynamic connection" .
98 At least one of the peers must be active; it is not possible to
99 establish a connection if both peers are passive.
100 .SS "Command line"
101 In addition to the standard options described in
102 .BR tripe-service (7),
103 the following command-line options are recognized.
104 .TP
105 .BI "\-p, \-\-peerdb=" file
106 Use
107 .I file
108 as the (CDB format) peer database.  In the absence of this option, the
109 file named by the
110 .B TRIPEPEERDB
111 environment variable is used; if that's not set either, then the default
112 default of
113 .B peers.cdb
114 in the current working directory is used instead.
115 .
116 .\"--------------------------------------------------------------------------
117 .SH "BEHAVIOUR"
118 .
119 .SS "Adoption"
120 The
121 .B connect
122 service maintains a list of peers which it has adopted.  A peer is
123 .I eligible for adoption
124 if it has a record in the peer database
125 .BR peers.cdb (5)
126 in which the
127 .B watch
128 key is assigned the value
129 .BR t ,
130 .BR true ,
131 .BR y ,
132 .BR yes ,
133 or
134 .BR on .
135 .PP
136 The service pings adopted peers periodically in order to ensure that
137 they are alive, and takes appropriate action if no replies are received.
138 .PP
139 A peer is said to be
140 .I adopted
141 when it is added to this list, and
142 .I disowned
143 when it removed.
144 .
145 .SS "Configuring interfaces"
146 The
147 .B connect
148 service configures network interfaces by invoking an
149 .B ifup
150 script.  The script is invoked as
151 .IP
152 .I script
153 .IR args ...
154 .I peer
155 .I ifname
156 .IR addr ...
157 .PP
158 where the elements are as described below.
159 .TP
160 .IR script " and " args
161 The peer's database record is retrieved; the value assigned to the
162 .B ifup
163 key is split into words (quoting is allowed; see
164 .BR tripe-admin (5)
165 for details).  The first word is the
166 .IR script ;
167 subsequent words are gathered to form the
168 .IR args .
169 .TP
170 .I peer
171 The name of the peer.
172 .TP
173 .I ifname
174 The name of the network interface associated with the peer, as returned
175 by the
176 .B IFNAME
177 administration command (see
178 .BR tripe-admin (5)).
179 .TP
180 .I addr
181 The network address of the peer's TrIPE server, in the form output by
182 the
183 .B ADDR
184 administration command (see
185 .BR tripe-admin (5)).
186 The first word of
187 .I addr
188 is therefore a network address family, e.g.,
189 .BR INET .
190 .PP
191 The
192 .B connect
193 service deconfigures interfaces by invoking an
194 .B ifdown
195 script, in a similar manner.  The script is invoked as
196 .IP
197 .I script
198 .IR args ...
199 .I peer
200 .PP
201 where the elements are as above, except that
202 .I script
203 and
204 .I args
205 are formed by splitting the value associated with the peer record's
206 .B ifdown
207 key.
208 .PP
209 In both of the above cases, if the relevant key (either
210 .B ifup
211 or
212 .BR ifdown )
213 is absent, no action is taken.
214 .PP
215 The key/value pairs in the peer's database record and the server's
216 response to the
217 .B ALGS
218 administration command (see
219 .BR tripe-admin (5))
220 are passed to the
221 .B ifup
222 and
223 .B ifdown
224 scripts as environment variables.  The environment variable name
225 corresponding to a key is determined as follows:
226 .hP \*o
227 Convert all letters to upper-case.
228 .hP \*o Convert all sequences of one or more non-alphanumeric characters
229 to an underscore
230 .RB ` _ '.
231 .hP \*o Prefix the resulting name by
232 .RB ` P_ '
233 or
234 .RB ` A_ '
235 depending on whether it came from the peer's database record or the
236 .B ALGS
237 output respectively.
238 .PP
239 For example,
240 .B ifname
241 becomes
242 .BR P_IFNAME ;
243 and
244 .B cipher-blksz
245 becomes
246 .BR A_CIPHER_BLKSZ .
247 .
248 .SS "Dynamic connection"
249 The
250 .B connect
251 service supports two kinds of dynamic connection.
252 .PP
253 The new kind of dynamic association uses the built-in
254 .B knock
255 protocol.  If the peer's database record assigns a value to the
256 .B knock
257 key, then the new connection protocol is used: this value is sent to the
258 peer during key-exchange, which should (if the peer is properly
259 configured) automatically establish the other end of the connection.
260 The string should have the form
261 .RI [ prefix\fB. ] tag ,
262 where the whole string names this host as it is known by the remote
263 host, and the
264 .I tag
265 names this host's public key.  The passive server receives this string,
266 verifies that the sender has access to the claimed private key, and
267 emits a
268 .B KNOCK
269 notification which
270 .B connect
271 notices, causing it to establish the passive peer.  While the internals
272 are somewhat complex, configuration is pretty easy.
273 .PP
274 The older kind of dynamic association is rather more complicated to set
275 up, and involves running shell commands, and probably configuring SSH.
276 If a peer's database record assigns a value to the
277 .B connect
278 key, then the
279 .B connect
280 service will attempt to establish a connection dynamically with the
281 peer.  The value of the
282 .B connect
283 key is invoked as a Bourne shell command, i.e.,
284 .IP
285 .B /bin/sh \-c
286 .I connect
287 .PP
288 is executed.  The command is expected to contact the remote server and
289 report, on standard output, a challenge string, typically by issuing
290 a
291 .B passive
292 command to the instance of the
293 .B connect
294 service running on the peer.  The
295 .B connect
296 service reads this challenge, and submits the command
297 .IP
298 .B GREET
299 .I peer
300 .I challenge
301 .PP
302 Typically, the
303 .B connect
304 command will issue a command such as
305 .IP
306 .B SVCSUBMIT connect passive
307 .I our-name
308 .PP
309 where
310 .I our-name
311 is the remote peer's name for this host.
312 .PP
313 Similarly, if the database record has a
314 .B disconnect
315 entry, then
316 .B connect
317 will use this to give the peer explicit notification that its services
318 are no longer needed.  The value of the
319 .B disconnect
320 key is invoked as a Bourne shell command.  This ought to result in a
321 .B KILL
322 command being issued to the peer's server.
323 .PP
324 In detail, the protocol for old-style dynamic connection works as
325 follows.
326 .hP 1.
327 The active peer
328 .BR ADD s
329 its partner, typically using the
330 .B \-cork
331 option to suppress the key-exchange message which the server usually
332 sends immediately, since otherwise the passive peer will warn about it.
333 .hP 2.
334 The active peer issues the command
335 .RS
336 .IP
337 .B SVCSUBMIT connect passive
338 .I user
339 .PP
340 to the passive peer's server.  (Here,
341 .I user
342 is a name identifying the active peer; see below.)  Doing this is the
343 responsibility of the
344 .B connect
345 command.
346 .RE
347 .hP 3.
348 The
349 .B connect
350 service on the passive peer responds with a
351 .I challenge
352 \(en a short Base64-encoded string.  Somehow this challenge is sent back
353 to the passive peer without being intercepted.
354 .hP 4.
355 The active peer sends a
356 .BR GREET ing
357 containing the challenge to its passive partner.  The passive server
358 announces the arrival of this message, and the originating address and
359 port.
360 .hP 5.
361 The
362 .B connect
363 service running on the passive host receives the notification, matches
364 it up with the
365 .I user
366 from the initial connection request, and
367 .BR ADD s
368 the appropriate peer, with the address from the
369 .BR GREET ing.
370 .
371 .SS "Operation"
372 On startup,
373 .B connect
374 requests a list of current peers from the
375 .BR tripe (8)
376 server, and adopts any eligible peers.  If the
377 .B \-\-startup
378 flag was passed on the command line, the newly adopted peers have their
379 interfaces configured and connection attempts are made.
380 .PP
381 Adopted peers are pinged at regular intervals (using the
382 .B PING
383 administrative command; see
384 .BR tripe-admin (5)).
385 This process can be configured by assigning values to keys in the peer's
386 database record.  Some of these parameters are time intervals,
387 expressed as a nonnegative integer followed optionally by
388 .BR d ,
389 .BR h ,
390 .BR m ,
391 or
392 .B s
393 for days, hours, minutes, or seconds, respectively; if no suffix is
394 given, seconds are assumed.
395 .PP
396 The parameters are as follows.
397 .TP
398 .B every
399 A time interval: how often to ping the peer to ensure that it's still
400 alive.  The default is 30 seconds for active dynamic peers, and 5
401 minutes for passive peers.
402 .IP
403 The period for dynamic peers should be no longer than
404 .I timeout
405 \(mu
406 .RI ( retries
407 \- 1).  Consider an idle mobile peer which has its IP address changed
408 just before its passive peer begins pinging.  The static peer's pings
409 will go to the old address until it receives a ping back from the mobile
410 peer.  Therefore, the static peer has to keep pinging until it would
411 definitely have received an unsolicited ping from the mobile peer, and
412 therefore be informed of the change of address.  And it's no use
413 learning about the change of address just after sending the last ping to
414 the old address, so the last retry doesn't count for the purposes of
415 this calculation.
416 .IP
417 Besides, the consequences of failed pinging differ between dynamic and
418 passive peers.  In the former case, a failure provokes a reconnection
419 attempt, after which (hopefully) things will work again: it's probably a
420 good thing to check frequently and fail fast.  In the latter case, the
421 dynamic peer will certainly have to notice that it's been abandoned and
422 arrange to retry, causing a communication failure where maybe there
423 wasn't really one before.
424 .TP
425 .B timeout
426 A time interval: how long to wait for a reply before retrying or giving
427 up.  The default is 10 seconds.
428 .TP
429 .B retries
430 An integer: how many failed attempts to make before deciding that the
431 peer is unreachable and taking action.  The default is 5 attempts.
432 .PP
433 The algorithm is as follows.  Send up to
434 .I retries
435 pings; if a reply is received before the
436 .I timeout
437 then the peer is alive; wait
438 .I every
439 and check again.  If no reply is received within the
440 .IR timeout ,
441 then try again up to
442 .I retries
443 times.  If no attempt succeeds, the peer is declared unreachable.  If
444 the peer has a
445 .B connect
446 command (i.e., it connects dynamically) then another connection attempt
447 is made.  Otherwise the peer is killed.
448 .
449 .\"--------------------------------------------------------------------------
450 .SH "SERVICE COMMAND REFERENCE"
451 .
452 .\"* 10 Service commands
453 The commands provided by the service are as follows.
454 .SP
455 .BI "active " peer
456 Make an active connection to the named
457 .IR peer .
458 The service will submit the command
459 .RS
460 .IP
461 .B ADD
462 .RB [ \-cork ]
463 .RB [ \-keepalive
464 .IR time ]
465 .RB [ \-key
466 .IR tag ]
467 .RB [ \-priv
468 .IR tag ]
469 .RB [ \-mobile ]
470 .RB [ \-tunnel
471 .IR driver ]
472 .I address
473 .PP
474 Specifically:
475 .hP \*o
476 The option
477 .B \-cork
478 is provided if the peer's database record assigns the
479 .B cork
480 key one of the values
481 .BR t ,
482 .BR true ,
483 .BR y ,
484 .BR yes,
485 or
486 .BR on .
487 .hP \*o
488 The option
489 .B \-keepalive
490 .I time
491 is provided if the database record assigns a value
492 .I time
493 to the
494 .B keepalive
495 key.
496 .hP \*o
497 The option
498 .B \-key
499 .I tag
500 is provided if the database record assigns a value
501 .I tag
502 to the
503 .B key
504 key.
505 .hP \*o
506 The option
507 .B \-priv
508 .I tag
509 is provided if the database record assigns a value
510 .I tag
511 to the
512 .B priv
513 key.
514 .hP \*o
515 The option
516 .B \-mobile
517 is provided if the peer's database record assigns the
518 .B mobile
519 key one of the values
520 .BR t ,
521 .BR true ,
522 .BR y ,
523 .BR yes,
524 or
525 .BR on .
526 .hP \*o
527 The option
528 .B \-tunnel
529 .I driver
530 is provided if the database record assigns a value
531 .I driver
532 to the
533 .B tunnel
534 key.
535 .hP \*o
536 The
537 .I address
538 is the value assigned to the
539 .B peer
540 key in the database record.
541 .RE
542 .SP
543 .B adopted
544 For each peer being tracked by the
545 .B connect
546 service, write a line
547 .B INFO
548 .IR name .
549 (Compatibility note: it's possible that further information will be
550 provided about each peer, in the form of subsequent tokens.  Clients
551 should be prepared to ignore such tokens.)
552 .SP
553 .BI "info " peer
554 Lists the database record and additional information about the named
555 .IR peer .
556 For each key/value pair, a line
557 .RS
558 .IP
559 .B INFO
560 .IB key = value
561 .PP
562 is output.  The key/value pairs are output in an arbitrary order.
563 .PP
564 In addition to the fields of the peer's database record, the following
565 additional keys are defined.
566 .TP
567 .B failures
568 The number of failed pings in the current or most recent batch, in
569 decimal.
570 .TP
571 .B last-ping
572 The round-trip time of the most recent ping in milliseconds, in the form
573 .IB nn.n ms\fR,
574 or
575 .B timeout
576 if the most recent ping timed out,
577 or
578 .B \-
579 if no pings have yet completed.
580 .TP
581 .B max-ping
582 The maximum successful ping time so far in milliseconds, in the form
583 .IB nn.n ms\fR,
584 or
585 .B \-
586 if no pings have yet succeeded.
587 .TP
588 .B mean-ping
589 The average successful ping time so far in milliseconds, in the form
590 .IB nn.n ms\fR,
591 or
592 .B \-
593 if no pings have yet succeeded.
594 .TP
595 .B min-ping
596 The minimum successful ping time so far in milliseconds, in the form
597 .IB nn.n ms\fR,
598 or
599 .B \-
600 if no pings have yet succeeded.
601 .TP
602 .B n-lost
603 The number of pings which have been declared timed out so far, in
604 decimal.
605 .TP
606 .B n-ping
607 The number of successful pings so far, in decimal.
608 .TP
609 .B sd-ping
610 The standard deviation of ping times so far in milliseconds, in the form
611 .IB nn.n ms\fR,
612 or
613 .B \-
614 if no pings have yet succeeded.
615 .TP
616 .B state
617 One of the strings:
618 .B idle
619 if the peer has responded to a ping recently, and we are waiting for the
620 .B every
621 delay before we try again; or
622 .B check
623 if we are currently waiting for a ping to return.
624 .RE
625 .SP
626 .BI "kick " peer
627 If
628 .I peer
629 is currently added, and its record in the peer database contains a
630 .B connect
631 key (see
632 .BR peers.in )
633 then force a reconnection attempt.  See
634 .BR "Dynamic connection" .
635 .SP
636 .B "list-active"
637 Output a list of peers in the database.  For each peer name
638 .IR peer ,
639 a line
640 .RS
641 .IP
642 .B INFO
643 .I peer
644 .PP
645 is output.
646 .RE
647 .SP
648 .BI "passive \fR[" options "\fR]\fP " user
649 If the database contains a user record mapping
650 .I user
651 to some
652 .I peer
653 then an
654 .B INFO
655 line is written containing a freshly chosen challenge string.  If the
656 server receives a
657 .BR GREET ing
658 message quoting this challenge within 30 seconds, the
659 .B connect
660 service will issue an
661 .B ADD
662 request for the peer, as for the
663 .B active
664 command, except that the origin of the
665 .BR GREET ing
666 packet is used as the peer's address.
667 .RS
668 .\"+opts
669 .PP
670 The following option is recognized.
671 .TP
672 .BI "\-timeout " time
673 Wait for
674 .I time
675 instead of 30 seconds.  The
676 .I time
677 is expressed as a non-negative integer followed by
678 .BR d ,
679 .BR h ,
680 .BR m ,
681 or
682 .B s
683 for days, hours, minutes or seconds respectively; if no suffix is given,
684 seconds are assumed.
685 .\"-opts
686 .RE
687 .SP
688 .BI "sabotage " peer
689 Sabotage the
690 .I peer
691 so that
692 .B connect
693 thinks that it can't respond to pings.  This will usually provoke a
694 reconnection attempt.  Use
695 .B kick
696 instead unless you're trying to test
697 .BR connect .
698 .SP
699 .BI "userpeer " user
700 Output a single
701 .B INFO
702 line identifying the peer corresponding to the
703 .I user
704 name.
705 .
706 .\"--------------------------------------------------------------------------
707 .SH "NOTIFICATIONS"
708 .
709 .\"* 30 Notification broadcasts (NOTE codes)
710 All notifications issued by
711 .B connect
712 begin with the tokens
713 .BR "USER connect" .
714 .SP
715 .B "USER connect peerdb-update"
716 The peer database has changed.  Other interested clients should reopen
717 the database.
718 .SP
719 .BI "USER connect ping-failed " peer " " error\fR...
720 An attempt to
721 .B PING
722 the named
723 .I peer
724 failed; the server replied
725 .B FAIL
726 .IR error ...
727 .SP
728 .BI "USER connect " process\fR... " stdout " line
729 The
730 .I process
731 spawned by the
732 .B connect
733 service unexpectedly wrote
734 .I line
735 to its standard output.
736 .
737 .\"--------------------------------------------------------------------------
738 .SH "WARNINGS"
739 .
740 .\"* 40 Warning broadcasts (WARN codes)
741 All warnings issued by
742 .B connect
743 begin with the tokens
744 .BR "USER connect" .
745 .SP
746 .BI "USER connect auto-add-failed " name " " error\fR...
747 The attempt to add the peer
748 .I name
749 automatically failed: the
750 .B ADD
751 command reported
752 .B FAIL
753 .IR error ...
754 .SP
755 .BI "USER connect knock-active-peer " name
756 The server reported a valid
757 .B knock
758 message from a peer calling itself
759 .I name
760 but this is not a passive peer.
761 .SP
762 .BI "USER connect knock-unknown-peer " name
763 The server reported a valid
764 .B knock
765 message from a peer calling itself
766 .I name
767 but no such peer is defined in the database.
768 .SP
769 .BI "USER connect knock-tag-mismatch peer " name " public-key-tag " tag
770 The server reported a valid
771 .B knock
772 message from a peer calling itself
773 .I name
774 but this name doesn't match that peer's recorded public-key tag, which
775 is
776 .IR tag .
777 .SP
778 .BI "USER connect ping-ok " peer
779 A reply was received to a
780 .B PING
781 sent to the
782 .IR peer ,
783 though earlier attempts had failed.
784 .SP
785 .BI "USER connect ping-timeout " peer " attempt " i " of " n
786 No reply was received to a
787 .B PING
788 sent to the
789 .IR peer .
790 So far,
791 .I i
792 .BR PING s
793 have been sent; if a total of
794 .I n
795 consecutive attempts time out, the
796 .B connect
797 service will take further action.
798 .SP
799 .B "USER connect reconnecting " peer
800 The dynamically connected
801 .I peer
802 seems to be unresponsive.  The
803 .B connect
804 service will attempt to reconnect.
805 .SP
806 .BI "USER connect " process\fR... " stderr " line
807 The
808 .I process
809 spawned by the
810 .B connect
811 service wrote
812 .I line
813 to its standard error.
814 .SP
815 .BI "USER connect " process\fR... " exit-nonzero " code
816 The
817 .I process
818 spawned by the
819 .B connect
820 service exited with the nonzero status
821 .IR code .
822 .SP
823 .BI "USER connect " process\fR... " exit-signal S" code
824 The
825 .I process
826 spawned by the
827 .B connect
828 service was killed by signal
829 .IR code .
830 Here,
831 .I code
832 is the numeric value of the fatal signal.
833 .SP
834 .BI "USER connect " process\fR... " exit-unknown " status
835 The
836 .I process
837 spawned by the
838 .B connect
839 service exited with an unknown
840 .IR status .
841 Here,
842 .I status
843 is the raw exit status, as returned by
844 .BR waitpid (2),
845 in hexadecimal.
846 .
847 .\"--------------------------------------------------------------------------
848 .SH "CHILD PROCESS IDENTIFIERS"
849 .
850 .\"* 50 Child process identifiers
851 Some of the warnings and notifications refer to processes spawned by
852 .B connect
853 under various circumstances.  The process identifiers are as follows.
854 .SP
855 .BI "connect " peer
856 A child spawned in order to establish a dynamic connection with
857 .IR peer .
858 .SP
859 .BI "disconnect " peer
860 A child spawned in order to shut down a dynamic connection with
861 .IR peer .
862 .SP
863 .BI "ifdown " peer
864 A child spawned to deconfigure the network interface for
865 .IR peer .
866 .SP
867 .BI "ifup " peer
868 A child spawned to configure the network interface for
869 .IR peer .
870 .
871 .\"--------------------------------------------------------------------------
872 .SH "SUMMARY"
873 .
874 .\"= summary
875 .
876 .\"--------------------------------------------------------------------------
877 .SH "SEE ALSO"
878 .
879 .BR tripe-service (7),
880 .BR peers.in (5),
881 .BR tripe (8).
882 .
883 .\"--------------------------------------------------------------------------
884 .SH "AUTHOR"
885 .
886 Mark Wooding, <mdw@distorted.org.uk>
887 .
888 .\"----- That's all, folks --------------------------------------------------