ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/doc/gvpe.protocol.7
Revision: 1.10
Committed: Mon Sep 1 06:06:11 2008 UTC (15 years, 8 months ago) by pcg
Branch: MAIN
CVS Tags: rel-2_21, rel-2_22
Changes since 1.9: +46 -39 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.10 .\" Automatically generated by Pod::Man 2.16 (Pod::Simple 3.05)
2 pcg 1.1 .\"
3     .\" Standard preamble:
4     .\" ========================================================================
5     .de Sh \" Subsection heading
6     .br
7     .if t .Sp
8     .ne 5
9     .PP
10     \fB\\$1\fR
11     .PP
12     ..
13     .de Sp \" Vertical space (when we can't use .PP)
14     .if t .sp .5v
15     .if n .sp
16     ..
17     .de Vb \" Begin verbatim text
18     .ft CW
19     .nf
20     .ne \\$1
21     ..
22     .de Ve \" End verbatim text
23     .ft R
24     .fi
25     ..
26     .\" Set up some character translations and predefined strings. \*(-- will
27     .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
28 pcg 1.8 .\" double quote, and \*(R" will give a right double quote. \*(C+ will
29     .\" give a nicer C++. Capital omega is used to do unbreakable dashes and
30     .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
31     .\" nothing in troff, for use with C<>.
32     .tr \(*W-
33 pcg 1.1 .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
34     .ie n \{\
35     . ds -- \(*W-
36     . ds PI pi
37     . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
38     . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
39     . ds L" ""
40     . ds R" ""
41     . ds C`
42     . ds C'
43     'br\}
44     .el\{\
45     . ds -- \|\(em\|
46     . ds PI \(*p
47     . ds L" ``
48     . ds R" ''
49     'br\}
50     .\"
51 pcg 1.10 .\" Escape single quotes in literal strings from groff's Unicode transform.
52     .ie \n(.g .ds Aq \(aq
53     .el .ds Aq '
54     .\"
55 pcg 1.1 .\" If the F register is turned on, we'll generate index entries on stderr for
56     .\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
57     .\" entries marked with X<> in POD. Of course, you'll have to process the
58     .\" output yourself in some meaningful fashion.
59 pcg 1.10 .ie \nF \{\
60 pcg 1.1 . de IX
61     . tm Index:\\$1\t\\n%\t"\\$2"
62     ..
63     . nr % 0
64     . rr F
65     .\}
66 pcg 1.10 .el \{\
67     . de IX
68     ..
69     .\}
70 pcg 1.1 .\"
71     .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
72     .\" Fear. Run. Save yourself. No user-serviceable parts.
73     . \" fudge factors for nroff and troff
74     .if n \{\
75     . ds #H 0
76     . ds #V .8m
77     . ds #F .3m
78     . ds #[ \f1
79     . ds #] \fP
80     .\}
81     .if t \{\
82     . ds #H ((1u-(\\\\n(.fu%2u))*.13m)
83     . ds #V .6m
84     . ds #F 0
85     . ds #[ \&
86     . ds #] \&
87     .\}
88     . \" simple accents for nroff and troff
89     .if n \{\
90     . ds ' \&
91     . ds ` \&
92     . ds ^ \&
93     . ds , \&
94     . ds ~ ~
95     . ds /
96     .\}
97     .if t \{\
98     . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
99     . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
100     . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
101     . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
102     . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
103     . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
104     .\}
105     . \" troff and (daisy-wheel) nroff accents
106     .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
107     .ds 8 \h'\*(#H'\(*b\h'-\*(#H'
108     .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
109     .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
110     .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
111     .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
112     .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
113     .ds ae a\h'-(\w'a'u*4/10)'e
114     .ds Ae A\h'-(\w'A'u*4/10)'E
115     . \" corrections for vroff
116     .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
117     .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
118     . \" for low resolution devices (crt and lpr)
119     .if \n(.H>23 .if \n(.V>19 \
120     \{\
121     . ds : e
122     . ds 8 ss
123     . ds o a
124     . ds d- d\h'-1'\(ga
125     . ds D- D\h'-1'\(hy
126     . ds th \o'bp'
127     . ds Th \o'LP'
128     . ds ae ae
129     . ds Ae AE
130     .\}
131     .rm #[ #] #H #V #F C
132     .\" ========================================================================
133     .\"
134     .IX Title "GVPE.PROTOCOL 7"
135 pcg 1.10 .TH GVPE.PROTOCOL 7 "2008-09-01" "2.2" "GNU Virtual Private Ethernet"
136     .\" For nroff, turn off justification. Always turn off hyphenation; it makes
137     .\" way too many mistakes in technical documents.
138     .if n .ad l
139     .nh
140 pcg 1.2 .SH "The GNU-VPE Protocols"
141     .IX Header "The GNU-VPE Protocols"
142     .SH "Overview"
143     .IX Header "Overview"
144     \&\s-1GVPE\s0 can make use of a number of protocols. One of them is the \s-1GNU\s0 \s-1VPE\s0
145     protocol which is used to authenticate tunnels and send encrypted data
146     packets. This protocol is described in more detail the second part of this
147     document.
148     .PP
149     The first part of this document describes the transport protocols which
150     are used by \s-1GVPE\s0 to send it's data packets over the network.
151 pcg 1.7 .SH "PART 1: Transport protocols"
152     .IX Header "PART 1: Transport protocols"
153 pcg 1.8 \&\s-1GVPE\s0 offers a wide range of transport protocols that can be used to
154     interchange data between nodes. Protocols differ in their overhead, speed,
155 pcg 1.3 reliability, and robustness.
156     .PP
157     The following sections describe each transport protocol in more
158     detail. They are sorted by overhead/efficiency, the most efficient
159 pcg 1.4 transport is listed first:
160 pcg 1.2 .Sh "\s-1RAW\s0 \s-1IP\s0"
161     .IX Subsection "RAW IP"
162 pcg 1.10 This protocol is the best choice, performance-wise, as the minimum
163 pcg 1.3 overhead per packet is only 38 bytes.
164     .PP
165 pcg 1.10 It works by sending the \s-1VPN\s0 payload using raw \s-1IP\s0 frames (using the
166 pcg 1.3 protocol set by \f(CW\*(C`ip\-proto\*(C'\fR).
167     .PP
168 pcg 1.10 Using raw \s-1IP\s0 frames has the drawback that many firewalls block \*(L"unknown\*(R"
169 pcg 1.3 protocols, so this transport only works if you have full \s-1IP\s0 connectivity
170     between nodes.
171 pcg 1.2 .Sh "\s-1ICMP\s0"
172     .IX Subsection "ICMP"
173 pcg 1.3 This protocol offers very low overhead (minimum 42 bytes), and can
174 pcg 1.8 sometimes tunnel through firewalls when other protocols can not.
175 pcg 1.3 .PP
176 pcg 1.8 It works by prepending an \s-1ICMP\s0 header with type \f(CW\*(C`icmp\-type\*(C'\fR and a code
177 pcg 1.3 of \f(CW255\fR. The default \f(CW\*(C`icmp\-type\*(C'\fR is \f(CW\*(C`echo\-reply\*(C'\fR, so the resulting
178     packets look like echo replies, which looks rather strange to network
179 pcg 1.10 administrators.
180 pcg 1.3 .PP
181 pcg 1.10 This transport should only be used if other transports (i.e. raw \s-1IP\s0) are
182 pcg 1.3 not available or undesirable (due to their overhead).
183 pcg 1.2 .Sh "\s-1UDP\s0"
184     .IX Subsection "UDP"
185 pcg 1.3 This is a good general choice for the transport protocol as \s-1UDP\s0 packets
186     tunnel well through most firewalls and routers, and the overhead per
187     packet is moderate (minimum 58 bytes).
188     .PP
189     It should be used if \s-1RAW\s0 \s-1IP\s0 is not available.
190 pcg 1.2 .Sh "\s-1TCP\s0"
191     .IX Subsection "TCP"
192 pcg 1.3 This protocol is a very bad choice, as it not only has high overhead (more
193     than 60 bytes), but the transport also retries on it's own, which leads
194     to congestion when the link has moderate packet loss (as both the \s-1TCP\s0
195     transport and the tunneled traffic will retry, increasing congestion more
196     and more). It also has high latency and is quite inefficient.
197     .PP
198     It's only useful when tunneling through firewalls that block better
199     protocols. If a node doesn't have direct internet access but a \s-1HTTP\s0 proxy
200     that supports the \s-1CONNECT\s0 method it can be used to tunnel through a web
201     proxy. For this to work, the \f(CW\*(C`tcp\-port\*(C'\fR should be \f(CW443\fR (\f(CW\*(C`https\*(C'\fR), as
202     most proxies do not allow connections to other ports.
203     .PP
204     It is an abuse of the usage a proxy was designed for, so make sure you are
205     allowed to use it for \s-1GVPE\s0.
206     .PP
207 pcg 1.8 This protocol also has server and client sides. If the \f(CW\*(C`tcp\-port\*(C'\fR is
208     set to zero, other nodes cannot connect to this node directly. If the
209 pcg 1.10 \&\f(CW\*(C`tcp\-port\*(C'\fR is non-zero, the node can act both as a client as well as a
210 pcg 1.8 server.
211 pcg 1.2 .Sh "\s-1DNS\s0"
212     .IX Subsection "DNS"
213 pcg 1.3 \&\fB\s-1WARNING:\s0\fR Parsing and generating \s-1DNS\s0 packets is rather tricky. The code
214     almost certainly contains buffer overflows and other, likely exploitable,
215     bugs. You have been warned.
216     .PP
217     This is the worst choice of transport protocol with respect to overhead
218     (overhead can be 2\-3 times higher than the transferred data), and latency
219     (which can be many seconds). Some \s-1DNS\s0 servers might not be prepared to
220     handle the traffic and drop or corrupt packets. The client also has to
221     constantly poll the server for data, so the client will constantly create
222     traffic even if it doesn't need to transport packets.
223     .PP
224     In addition, the same problems as the \s-1TCP\s0 transport also plague this
225     protocol.
226     .PP
227     It's only use is to tunnel through firewalls that do not allow direct
228     internet access. Similar to using a \s-1HTTP\s0 proxy (as the \s-1TCP\s0 transport
229     does), it uses a local \s-1DNS\s0 server/forwarder (given by the \f(CW\*(C`dns\-forw\-host\*(C'\fR
230     configuration value) as a proxy to send and receive data as a client,
231 pcg 1.8 and an \f(CW\*(C`NS\*(C'\fR record pointing to the \s-1GVPE\s0 server (as given by the
232 pcg 1.3 \&\f(CW\*(C`dns\-hostname\*(C'\fR directive).
233     .PP
234     The only good side of this protocol is that it can tunnel through most
235 pcg 1.8 firewalls mostly undetected, iff the local \s-1DNS\s0 server/forwarder is sane
236 pcg 1.10 (which is true for most routers, wireless \s-1LAN\s0 gateways and nameservers).
237 pcg 1.8 .PP
238 pcg 1.10 Fine-tuning needs to be done by editing \f(CW\*(C`src/vpn_dns.C\*(C'\fR directly.
239 pcg 1.2 .SH "PART 2: The GNU VPE protocol"
240     .IX Header "PART 2: The GNU VPE protocol"
241     This section, unfortunately, is not yet finished, although the protocol
242     is stable (until bugs in the cryptography are found, which will likely
243     completely change the following description). Nevertheless, it should give
244     you some overview over the protocol.
245 pcg 1.1 .Sh "Anatomy of a \s-1VPN\s0 packet"
246     .IX Subsection "Anatomy of a VPN packet"
247     The exact layout and field lengths of a \s-1VPN\s0 packet is determined at
248 pcg 1.10 compile time and doesn't change. The same structure is used for all
249     transport protocols, be it \s-1RAWIP\s0 or \s-1TCP\s0.
250 pcg 1.1 .PP
251     .Vb 3
252 pcg 1.8 \& +\-\-\-\-\-\-+\-\-\-\-\-\-+\-\-\-\-\-\-\-\-+\-\-\-\-\-\-+
253 pcg 1.1 \& | HMAC | TYPE | SRCDST | DATA |
254 pcg 1.8 \& +\-\-\-\-\-\-+\-\-\-\-\-\-+\-\-\-\-\-\-\-\-+\-\-\-\-\-\-+
255 pcg 1.1 .Ve
256     .PP
257     The \s-1HMAC\s0 field is present in all packets, even if not used (e.g. in auth
258     request packets), in which case it is set to all zeroes. The checksum
259 pcg 1.2 itself is calculated over the \s-1TYPE\s0, \s-1SRCDST\s0 and \s-1DATA\s0 fields in all cases.
260 pcg 1.1 .PP
261     The \s-1TYPE\s0 field is a single byte and determines the purpose of the packet
262     (e.g. \s-1RESET\s0, \s-1COMPRESSED/UNCOMPRESSED\s0 \s-1DATA\s0, \s-1PING\s0, \s-1AUTH\s0 \s-1REQUEST/RESPONSE\s0,
263     \&\s-1CONNECT\s0 \s-1REQUEST/INFO\s0 etc.).
264     .PP
265     \&\s-1SRCDST\s0 is a three byte field which contains the source and destination
266 pcg 1.8 node IDs (12 bits each).
267 pcg 1.1 .PP
268     The \s-1DATA\s0 portion differs between each packet type, naturally, and is the
269     only part that can be encrypted. Data packets contain more fields, as
270     shown:
271     .PP
272     .Vb 3
273 pcg 1.8 \& +\-\-\-\-\-\-+\-\-\-\-\-\-+\-\-\-\-\-\-\-\-+\-\-\-\-\-\-+\-\-\-\-\-\-\-+\-\-\-\-\-\-+
274 pcg 1.1 \& | HMAC | TYPE | SRCDST | RAND | SEQNO | DATA |
275 pcg 1.8 \& +\-\-\-\-\-\-+\-\-\-\-\-\-+\-\-\-\-\-\-\-\-+\-\-\-\-\-\-+\-\-\-\-\-\-\-+\-\-\-\-\-\-+
276 pcg 1.1 .Ve
277     .PP
278     \&\s-1RAND\s0 is a sequence of fully random bytes, used to increase the entropy of
279     the data for encryption purposes.
280     .PP
281     \&\s-1SEQNO\s0 is a 32\-bit sequence number. It is negotiated at every connection
282     initialization and starts at some random 31 bit value. \s-1VPE\s0 currently uses
283 pcg 1.2 a sliding window of 512 packets/sequence numbers to detect reordering,
284 pcg 1.8 duplication and replay attacks.
285     .Sh "The authentication protocol"
286     .IX Subsection "The authentication protocol"
287 pcg 1.10 Before nodes can exchange packets, they need to establish authenticity of
288     the other side and a key. Every node has a private \s-1RSA\s0 key and the public
289     \&\s-1RSA\s0 keys of all other nodes.
290 pcg 1.1 .PP
291 pcg 1.10 A host establishes a simplex connection by sending the other node an
292 pcg 1.1 \&\s-1RSA\s0 encrypted challenge containing a random challenge (consisting of
293     the encryption key to use when sending packets, more random data and
294 pcg 1.10 \&\s-1PKCS1_OAEP\s0 padding) and a random 16 byte \*(L"challenge-id\*(R" (used to detect
295     duplicate auth packets). The destination node will respond by replying
296 pcg 1.1 with an (unencrypted) \s-1RIPEMD160\s0 hash of the decrypted challenge, which
297 pcg 1.10 will authenticate that node. The destination node will also set the
298 pcg 1.8 outgoing encryption parameters as given in the packet.
299 pcg 1.1 .PP
300 pcg 1.10 When the source node receives a correct auth reply (by verifying the
301 pcg 1.1 hash and the id, which will expire after 120 seconds), it will start to
302 pcg 1.10 accept data packets from the destination node.
303 pcg 1.1 .PP
304 pcg 1.10 This means that a node can only initiate a simplex connection, telling the
305 pcg 1.1 other side the key it has to use when it sends packets. The challenge
306 pcg 1.2 reply is only used to set the current \s-1IP\s0 address of the other side and
307     protocol parameters.
308 pcg 1.1 .PP
309 pcg 1.2 This protocol is completely symmetric, so to be able to send packets the
310 pcg 1.10 destination node must send a challenge in the exact same way as already
311     described (so, in essence, two simplex connections are created per node
312 pcg 1.2 pair).
313 pcg 1.1 .Sh "Retrying"
314     .IX Subsection "Retrying"
315 pcg 1.10 When there is no response to an auth request, the node will send auth
316     requests in bursts with an exponential back-off. After some time it will
317 pcg 1.9 resort to \s-1PING\s0 packets, which are very small (8 bytes + protocol header)
318 pcg 1.10 and lightweight (no \s-1RSA\s0 operations required). A node that receives ping
319 pcg 1.9 requests from an unconnected peer will respond by trying to create a
320     connection.
321 pcg 1.1 .PP
322 pcg 1.10 In addition to the exponential back-off, there is a global rate-limit on
323 pcg 1.2 a per-IP base. It allows long bursts but will limit total packet rate to
324 pcg 1.1 something like one control packet every ten seconds, to avoid accidental
325 pcg 1.2 floods due to protocol problems (like a \s-1RSA\s0 key file mismatch between two
326 pcg 1.10 nodes).
327 pcg 1.9 .PP
328     The intervals between retries are limited by the \f(CW\*(C`max\-retry\*(C'\fR
329     configuration value. A node with \f(CW\*(C`connect\*(C'\fR = \f(CW\*(C`always\*(C'\fR will always retry,
330 pcg 1.10 a node with \f(CW\*(C`connect\*(C'\fR = \f(CW\*(C`ondemand\*(C'\fR will only try (and re-try) to connect
331 pcg 1.9 as long as there are packets in the queue, usually this limits the retry
332     period to \f(CW\*(C`max\-ttl\*(C'\fR seconds.
333     .PP
334     Sending packets over the \s-1VPN\s0 will reset the retry intervals as well, which
335     means as long as somebody is trying to send packets to a given node, \s-1GVPE\s0
336     will try to connect every few seconds.
337 pcg 1.1 .Sh "Routing and Protocol translation"
338     .IX Subsection "Routing and Protocol translation"
339 pcg 1.9 The \s-1GVPE\s0 routing algorithm is easy: there isn't much routing to speak
340     of: When routing packets to another node, \s-1GVPE\s0 trues the following
341     options, in order:
342 pcg 1.10 .IP "If the two nodes should be able to reach each other directly (common protocol, port known), then \s-1GVPE\s0 will send the packet directly to the other node." 4
343     .IX Item "If the two nodes should be able to reach each other directly (common protocol, port known), then GVPE will send the packet directly to the other node."
344 pcg 1.9 .PD 0
345     .ie n .IP "If this isn't possible (e.g. because the node doesn't have a \*(C`hostname\*(C' or known port), but the nodes speak a common protocol and a router is available, then \s-1GVPE\s0 will ask a router to ""mediate"" between both nodes (see below)." 4
346     .el .IP "If this isn't possible (e.g. because the node doesn't have a \f(CW\*(C`hostname\*(C'\fR or known port), but the nodes speak a common protocol and a router is available, then \s-1GVPE\s0 will ask a router to ``mediate'' between both nodes (see below)." 4
347     .IX Item "If this isn't possible (e.g. because the node doesn't have a hostname or known port), but the nodes speak a common protocol and a router is available, then GVPE will ask a router to mediate between both nodes (see below)."
348     .ie n .IP "If a direct connection isn't possible (no common protocols) or forbidden (\*(C`deny\-direct\*(C'\fR) and there are any routers, then \s-1GVPE\s0 will try to send packets to the router with the highest priority that is connected already \fIand is able (as specified by the config file) to connect directly to the target node." 4
349     .el .IP "If a direct connection isn't possible (no common protocols) or forbidden (\f(CW\*(C`deny\-direct\*(C'\fR) and there are any routers, then \s-1GVPE\s0 will try to send packets to the router with the highest priority that is connected already \fIand\fR is able (as specified by the config file) to connect directly to the target node." 4
350     .IX Item "If a direct connection isn't possible (no common protocols) or forbidden (deny-direct) and there are any routers, then GVPE will try to send packets to the router with the highest priority that is connected already and is able (as specified by the config file) to connect directly to the target node."
351     .IP "If no such router exists, then \s-1GVPE\s0 will simply send the packet to the node with the highest priority available." 4
352     .IX Item "If no such router exists, then GVPE will simply send the packet to the node with the highest priority available."
353     .IP "Failing all that, the packet will be dropped." 4
354     .IX Item "Failing all that, the packet will be dropped."
355     .PD
356 pcg 1.1 .PP
357     A host can usually declare itself unreachable directly by setting it's
358     port number(s) to zero. It can declare other hosts as unreachable by using
359 pcg 1.9 a config-file that disables all protocols for these other hosts. Another
360     option is to disable all protocols on that host in the other config files.
361 pcg 1.1 .PP
362     If two hosts cannot connect to each other because their \s-1IP\s0 address(es)
363 pcg 1.10 are not known (such as dial-up hosts), one side will send a \fImediated\fR
364 pcg 1.9 connection request to a router (routers must be configured to act as
365     routers!), which will send both the originating and the destination host
366     a connection info request with protocol information and \s-1IP\s0 address of the
367     other host (if known). Both hosts will then try to establish a direct
368     connection to the other peer, which is usually possible even when both
369     hosts are behind a \s-1NAT\s0 gateway.
370     .PP
371     Routing via other nodes works because the \s-1SRCDST\s0 field is not encrypted,
372     so the router can just forward the packet to the destination host. Since
373     each host uses it's own private key, the router will not be able to
374     decrypt or encrypt packets, it will just act as a simple router and
375     protocol translator.