ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/connection.C
Revision: 1.87
Committed: Fri Nov 12 18:39:33 2010 UTC (13 years, 6 months ago) by pcg
Content type: text/plain
Branch: MAIN
Changes since 1.86: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 /*
2 connection.C -- manage a single connection
3 Copyright (C) 2003-2008 Marc Lehmann <gvpe@schmorp.de>
4
5 This file is part of GVPE.
6
7 GVPE is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 3 of the License, or (at your
10 option) any later version.
11
12 This program is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15 Public License for more details.
16
17 You should have received a copy of the GNU General Public License along
18 with this program; if not, see <http://www.gnu.org/licenses/>.
19
20 Additional permission under GNU GPL version 3 section 7
21
22 If you modify this Program, or any covered work, by linking or
23 combining it with the OpenSSL project's OpenSSL library (or a modified
24 version of that library), containing parts covered by the terms of the
25 OpenSSL or SSLeay licenses, the licensors of this Program grant you
26 additional permission to convey the resulting work. Corresponding
27 Source for a non-source form of such a combination shall include the
28 source code for the parts of OpenSSL used as well as that of the
29 covered work.
30 */
31
32 #include "config.h"
33
34 #include <list>
35 #include <queue>
36 #include <utility>
37
38 #include <openssl/rand.h>
39 #include <openssl/evp.h>
40 #include <openssl/rsa.h>
41 #include <openssl/err.h>
42
43 #include "conf.h"
44 #include "slog.h"
45 #include "device.h"
46 #include "vpn.h"
47 #include "connection.h"
48
49 #include "netcompat.h"
50
51 #if !HAVE_RAND_PSEUDO_BYTES
52 # define RAND_pseudo_bytes RAND_bytes
53 #endif
54
55 #define MAGIC_OLD "vped\xbd\xc6\xdb\x82" // 8 bytes of magic (still used in the protocol)
56 #define MAGIC "gvpe\xbd\xc6\xdb\x82" // 8 bytes of magic (understood but not generated)
57
58 #define ULTRA_FAST 1
59 #define HLOG 15
60 #include "lzf/lzf.h"
61 #include "lzf/lzf_c.c"
62 #include "lzf/lzf_d.c"
63
64 //////////////////////////////////////////////////////////////////////////////
65
66 static std::queue< std::pair<run_script_cb *, const char *> > rs_queue;
67 static ev::child rs_child_ev;
68
69 void // c++ requires external linkage here, apparently :(
70 rs_child_cb (ev::child &w, int revents)
71 {
72 w.stop ();
73
74 if (rs_queue.empty ())
75 return;
76
77 pid_t pid = run_script (*rs_queue.front ().first, false);
78 if (pid)
79 {
80 w.set (pid);
81 w.start ();
82 }
83 else
84 slog (L_WARN, rs_queue.front ().second);
85
86 delete rs_queue.front ().first;
87 rs_queue.pop ();
88 }
89
90 // despite the fancy name, this is quite a hack
91 static void
92 run_script_queued (run_script_cb *cb, const char *warnmsg)
93 {
94 rs_queue.push (std::make_pair (cb, warnmsg));
95
96 if (!rs_child_ev.is_active ())
97 {
98 rs_child_ev.set<rs_child_cb> ();
99 rs_child_ev ();
100 }
101 }
102
103 //////////////////////////////////////////////////////////////////////////////
104
105 struct crypto_ctx
106 {
107 EVP_CIPHER_CTX cctx;
108 HMAC_CTX hctx;
109
110 crypto_ctx (const rsachallenge &challenge, int enc);
111 ~crypto_ctx ();
112 };
113
114 crypto_ctx::crypto_ctx (const rsachallenge &challenge, int enc)
115 {
116 EVP_CIPHER_CTX_init (&cctx);
117 require (EVP_CipherInit_ex (&cctx, CIPHER, 0, &challenge[CHG_CIPHER_KEY], 0, enc));
118 HMAC_CTX_init (&hctx);
119 HMAC_Init_ex (&hctx, &challenge[CHG_HMAC_KEY], HMAC_KEYLEN, DIGEST, 0);
120 }
121
122 crypto_ctx::~crypto_ctx ()
123 {
124 require (EVP_CIPHER_CTX_cleanup (&cctx));
125 HMAC_CTX_cleanup (&hctx);
126 }
127
128 static void
129 rsa_hash (const rsaid &id, const rsachallenge &chg, rsaresponse &h)
130 {
131 EVP_MD_CTX ctx;
132
133 EVP_MD_CTX_init (&ctx);
134 require (EVP_DigestInit (&ctx, RSA_HASH));
135 require (EVP_DigestUpdate(&ctx, &chg, sizeof chg));
136 require (EVP_DigestUpdate(&ctx, &id, sizeof id));
137 require (EVP_DigestFinal (&ctx, (unsigned char *)&h, 0));
138 EVP_MD_CTX_cleanup (&ctx);
139 }
140
141 struct rsa_entry
142 {
143 tstamp expire;
144 rsaid id;
145 rsachallenge chg;
146 };
147
148 struct rsa_cache : list<rsa_entry>
149 {
150 inline void cleaner_cb (ev::timer &w, int revents); ev::timer cleaner;
151
152 bool find (const rsaid &id, rsachallenge &chg)
153 {
154 for (iterator i = begin (); i != end (); ++i)
155 {
156 if (!memcmp (&id, &i->id, sizeof id) && i->expire > ev_now ())
157 {
158 memcpy (&chg, &i->chg, sizeof chg);
159
160 erase (i);
161 return true;
162 }
163 }
164
165 if (!cleaner.is_active ())
166 cleaner.again ();
167
168 return false;
169 }
170
171 void gen (rsaid &id, rsachallenge &chg)
172 {
173 rsa_entry e;
174
175 RAND_bytes ((unsigned char *)&id, sizeof id);
176 RAND_bytes ((unsigned char *)&chg, sizeof chg);
177
178 e.expire = ev_now () + RSA_TTL;
179 e.id = id;
180 memcpy (&e.chg, &chg, sizeof chg);
181
182 push_back (e);
183
184 if (!cleaner.is_active ())
185 cleaner.again ();
186 }
187
188 rsa_cache ()
189 {
190 cleaner.set<rsa_cache, &rsa_cache::cleaner_cb> (this);
191 cleaner.set (RSA_TTL, RSA_TTL);
192 }
193
194 } rsa_cache;
195
196 void rsa_cache::cleaner_cb (ev::timer &w, int revents)
197 {
198 if (empty ())
199 w.stop ();
200 else
201 {
202 for (iterator i = begin (); i != end (); )
203 if (i->expire <= ev_now ())
204 i = erase (i);
205 else
206 ++i;
207 }
208 }
209
210 //////////////////////////////////////////////////////////////////////////////
211
212 pkt_queue::pkt_queue (double max_ttl, int max_queue)
213 : max_ttl (max_ttl), max_queue (max_queue)
214 {
215 queue = new pkt [max_queue];
216
217 i = 0;
218 j = 0;
219
220 expire.set<pkt_queue, &pkt_queue::expire_cb> (this);
221 }
222
223 pkt_queue::~pkt_queue ()
224 {
225 while (net_packet *p = get ())
226 delete p;
227
228 delete [] queue;
229 }
230
231 void pkt_queue::expire_cb (ev::timer &w, int revents)
232 {
233 ev_tstamp expire = ev_now () - max_ttl;
234
235 for (;;)
236 {
237 if (empty ())
238 break;
239
240 double diff = queue[j].tstamp - expire;
241
242 if (diff >= 0.)
243 {
244 w.start (diff > 0.5 ? diff : 0.5);
245 break;
246 }
247
248 delete get ();
249 }
250 }
251
252 void pkt_queue::put (net_packet *p)
253 {
254 ev_tstamp now = ev_now ();
255
256 // start expiry timer
257 if (empty ())
258 expire.start (max_ttl);
259
260 int ni = i + 1 == max_queue ? 0 : i + 1;
261
262 if (ni == j)
263 delete get ();
264
265 queue[i].pkt = p;
266 queue[i].tstamp = now;
267
268 i = ni;
269 }
270
271 net_packet *pkt_queue::get ()
272 {
273 if (empty ())
274 return 0;
275
276 net_packet *p = queue[j].pkt;
277 queue[j].pkt = 0;
278
279 j = j + 1 == max_queue ? 0 : j + 1;
280
281 return p;
282 }
283
284 struct net_rateinfo
285 {
286 u32 host;
287 double pcnt, diff;
288 tstamp last;
289 };
290
291 // only do action once every x seconds per host whole allowing bursts.
292 // this implementation ("splay list" ;) is inefficient,
293 // but low on resources.
294 struct net_rate_limiter : list<net_rateinfo>
295 {
296 # define NRL_ALPHA (1. - 1. / 600.) // allow bursts
297 # define NRL_CUTOFF 10. // one event every CUTOFF seconds
298 # define NRL_EXPIRE (NRL_CUTOFF * 30.) // expire entries after this time
299 # define NRL_MAXDIF (NRL_CUTOFF * (1. / (1. - NRL_ALPHA))) // maximum diff /count value
300
301 bool can (const sockinfo &si) { return can((u32)si.host); }
302 bool can (u32 host);
303 };
304
305 net_rate_limiter auth_rate_limiter, reset_rate_limiter;
306
307 bool net_rate_limiter::can (u32 host)
308 {
309 iterator i;
310
311 for (i = begin (); i != end (); )
312 if (i->host == host)
313 break;
314 else if (i->last < ev_now () - NRL_EXPIRE)
315 i = erase (i);
316 else
317 i++;
318
319 if (i == end ())
320 {
321 net_rateinfo ri;
322
323 ri.host = host;
324 ri.pcnt = 1.;
325 ri.diff = NRL_MAXDIF;
326 ri.last = ev_now ();
327
328 push_front (ri);
329
330 return true;
331 }
332 else
333 {
334 net_rateinfo ri (*i);
335 erase (i);
336
337 ri.pcnt = ri.pcnt * NRL_ALPHA;
338 ri.diff = ri.diff * NRL_ALPHA + (ev_now () - ri.last);
339
340 ri.last = ev_now ();
341
342 double dif = ri.diff / ri.pcnt;
343
344 bool send = dif > NRL_CUTOFF;
345
346 if (dif > NRL_MAXDIF)
347 {
348 ri.pcnt = 1.;
349 ri.diff = NRL_MAXDIF;
350 }
351 else if (send)
352 ri.pcnt++;
353
354 push_front (ri);
355
356 return send;
357 }
358 }
359
360 /////////////////////////////////////////////////////////////////////////////
361
362 unsigned char hmac_packet::hmac_digest[EVP_MAX_MD_SIZE];
363
364 void hmac_packet::hmac_gen (crypto_ctx *ctx)
365 {
366 unsigned int xlen;
367
368 HMAC_CTX *hctx = &ctx->hctx;
369
370 HMAC_Init_ex (hctx, 0, 0, 0, 0);
371 HMAC_Update (hctx, ((unsigned char *) this) + sizeof (hmac_packet),
372 len - sizeof (hmac_packet));
373 HMAC_Final (hctx, (unsigned char *) &hmac_digest, &xlen);
374 }
375
376 void
377 hmac_packet::hmac_set (crypto_ctx *ctx)
378 {
379 hmac_gen (ctx);
380
381 memcpy (hmac, hmac_digest, HMACLENGTH);
382 }
383
384 bool
385 hmac_packet::hmac_chk (crypto_ctx *ctx)
386 {
387 hmac_gen (ctx);
388
389 return !memcmp (hmac, hmac_digest, HMACLENGTH);
390 }
391
392 void vpn_packet::set_hdr (ptype type_, unsigned int dst)
393 {
394 type = type_;
395
396 int src = THISNODE->id;
397
398 src1 = src;
399 srcdst = ((src >> 8) << 4) | (dst >> 8);
400 dst1 = dst;
401 }
402
403 #define MAXVPNDATA (MAX_MTU - 6 - 6)
404 #define DATAHDR (sizeof (u32) + RAND_SIZE)
405
406 struct vpndata_packet : vpn_packet
407 {
408 u8 data[MAXVPNDATA + DATAHDR]; // seqno
409
410 void setup (connection *conn, int dst, u8 *d, u32 len, u32 seqno);
411 tap_packet *unpack (connection *conn, u32 &seqno);
412 private:
413
414 const u32 data_hdr_size () const
415 {
416 return sizeof (vpndata_packet) - sizeof (net_packet) - MAXVPNDATA - DATAHDR;
417 }
418 };
419
420 void
421 vpndata_packet::setup (connection *conn, int dst, u8 *d, u32 l, u32 seqno)
422 {
423 EVP_CIPHER_CTX *cctx = &conn->octx->cctx;
424 int outl = 0, outl2;
425 ptype type = PT_DATA_UNCOMPRESSED;
426
427 #if ENABLE_COMPRESSION
428 u8 cdata[MAX_MTU];
429
430 if (conn->features & FEATURE_COMPRESSION)
431 {
432 u32 cl = lzf_compress (d, l, cdata + 2, (l - 2) & ~7);
433
434 if (cl)
435 {
436 type = PT_DATA_COMPRESSED;
437 d = cdata;
438 l = cl + 2;
439
440 d[0] = cl >> 8;
441 d[1] = cl;
442 }
443 }
444 #endif
445
446 require (EVP_EncryptInit_ex (cctx, 0, 0, 0, 0));
447
448 struct {
449 #if RAND_SIZE
450 u8 rnd[RAND_SIZE];
451 #endif
452 u32 seqno;
453 } datahdr;
454
455 datahdr.seqno = ntohl (seqno);
456 #if RAND_SIZE
457 RAND_pseudo_bytes ((unsigned char *) datahdr.rnd, RAND_SIZE);
458 #endif
459
460 require (EVP_EncryptUpdate (cctx,
461 (unsigned char *) data + outl, &outl2,
462 (unsigned char *) &datahdr, DATAHDR));
463 outl += outl2;
464
465 require (EVP_EncryptUpdate (cctx,
466 (unsigned char *) data + outl, &outl2,
467 (unsigned char *) d, l));
468 outl += outl2;
469
470 require (EVP_EncryptFinal_ex (cctx, (unsigned char *) data + outl, &outl2));
471 outl += outl2;
472
473 len = outl + data_hdr_size ();
474
475 set_hdr (type, dst);
476
477 hmac_set (conn->octx);
478 }
479
480 tap_packet *
481 vpndata_packet::unpack (connection *conn, u32 &seqno)
482 {
483 EVP_CIPHER_CTX *cctx = &conn->ictx->cctx;
484 int outl = 0, outl2;
485 tap_packet *p = new tap_packet;
486 u8 *d;
487 u32 l = len - data_hdr_size ();
488
489 require (EVP_DecryptInit_ex (cctx, 0, 0, 0, 0));
490
491 #if ENABLE_COMPRESSION
492 u8 cdata[MAX_MTU];
493
494 if (type == PT_DATA_COMPRESSED)
495 d = cdata;
496 else
497 #endif
498 d = &(*p)[6 + 6 - DATAHDR];
499
500 /* this overwrites part of the src mac, but we fix that later */
501 require (EVP_DecryptUpdate (cctx,
502 d, &outl2,
503 (unsigned char *)&data, len - data_hdr_size ()));
504 outl += outl2;
505
506 require (EVP_DecryptFinal_ex (cctx, (unsigned char *)d + outl, &outl2));
507 outl += outl2;
508
509 seqno = ntohl (*(u32 *)(d + RAND_SIZE));
510
511 id2mac (dst () ? dst() : THISNODE->id, p->dst);
512 id2mac (src (), p->src);
513
514 #if ENABLE_COMPRESSION
515 if (type == PT_DATA_COMPRESSED)
516 {
517 u32 cl = (d[DATAHDR] << 8) | d[DATAHDR + 1];
518
519 p->len = lzf_decompress (d + DATAHDR + 2, cl < MAX_MTU ? cl : 0,
520 &(*p)[6 + 6], MAX_MTU)
521 + 6 + 6;
522 }
523 else
524 p->len = outl + (6 + 6 - DATAHDR);
525 #endif
526
527 return p;
528 }
529
530 struct ping_packet : vpn_packet
531 {
532 void setup (int dst, ptype type)
533 {
534 set_hdr (type, dst);
535 len = sizeof (*this) - sizeof (net_packet);
536 }
537 };
538
539 struct config_packet : vpn_packet
540 {
541 // actually, hmaclen cannot be checked because the hmac
542 // field comes before this data, so peers with other
543 // hmacs simply will not work.
544 u8 prot_major, prot_minor, randsize, hmaclen;
545 u8 flags, challengelen, features, pad3;
546 u32 cipher_nid, digest_nid, hmac_nid;
547
548 void setup (ptype type, int dst);
549 bool chk_config () const;
550
551 static u8 get_features ()
552 {
553 u8 f = 0;
554 #if ENABLE_COMPRESSION
555 f |= FEATURE_COMPRESSION;
556 #endif
557 #if ENABLE_ROHC
558 f |= FEATURE_ROHC;
559 #endif
560 #if ENABLE_BRIDGING
561 f |= FEATURE_BRIDGING;
562 #endif
563 return f;
564 }
565 };
566
567 void config_packet::setup (ptype type, int dst)
568 {
569 prot_major = PROTOCOL_MAJOR;
570 prot_minor = PROTOCOL_MINOR;
571 randsize = RAND_SIZE;
572 hmaclen = HMACLENGTH;
573 flags = 0;
574 challengelen = sizeof (rsachallenge);
575 features = get_features ();
576
577 cipher_nid = htonl (EVP_CIPHER_nid (CIPHER));
578 digest_nid = htonl (EVP_MD_type (RSA_HASH));
579 hmac_nid = htonl (EVP_MD_type (DIGEST));
580
581 len = sizeof (*this) - sizeof (net_packet);
582 set_hdr (type, dst);
583 }
584
585 bool config_packet::chk_config () const
586 {
587 if (prot_major != PROTOCOL_MAJOR)
588 slog (L_WARN, _("major version mismatch (remote %d <=> local %d)"), prot_major, PROTOCOL_MAJOR);
589 else if (randsize != RAND_SIZE)
590 slog (L_WARN, _("rand size mismatch (remote %d <=> local %d)"), randsize, RAND_SIZE);
591 else if (hmaclen != HMACLENGTH)
592 slog (L_WARN, _("hmac length mismatch (remote %d <=> local %d)"), hmaclen, HMACLENGTH);
593 else if (challengelen != sizeof (rsachallenge))
594 slog (L_WARN, _("challenge length mismatch (remote %d <=> local %d)"), challengelen, sizeof (rsachallenge));
595 else if (cipher_nid != htonl (EVP_CIPHER_nid (CIPHER)))
596 slog (L_WARN, _("cipher mismatch (remote %x <=> local %x)"), ntohl (cipher_nid), EVP_CIPHER_nid (CIPHER));
597 else if (digest_nid != htonl (EVP_MD_type (RSA_HASH)))
598 slog (L_WARN, _("digest mismatch (remote %x <=> local %x)"), ntohl (digest_nid), EVP_MD_type (RSA_HASH));
599 else if (hmac_nid != htonl (EVP_MD_type (DIGEST)))
600 slog (L_WARN, _("hmac mismatch (remote %x <=> local %x)"), ntohl (hmac_nid), EVP_MD_type (DIGEST));
601 else
602 return true;
603
604 return false;
605 }
606
607 struct auth_req_packet : config_packet
608 {
609 char magic[8];
610 u8 initiate; // false if this is just an automatic reply
611 u8 protocols; // supported protocols (will be patched on forward)
612 u8 pad2, pad3;
613 rsaid id;
614 rsaencrdata encr;
615
616 auth_req_packet (int dst, bool initiate_, u8 protocols_)
617 {
618 config_packet::setup (PT_AUTH_REQ, dst);
619 strncpy (magic, MAGIC_OLD, 8);
620 initiate = !!initiate_;
621 protocols = protocols_;
622
623 len = sizeof (*this) - sizeof (net_packet);
624 }
625 };
626
627 struct auth_res_packet : config_packet
628 {
629 rsaid id;
630 u8 pad1, pad2, pad3;
631 u8 response_len; // encrypted length
632 rsaresponse response;
633
634 auth_res_packet (int dst)
635 {
636 config_packet::setup (PT_AUTH_RES, dst);
637
638 len = sizeof (*this) - sizeof (net_packet);
639 }
640 };
641
642 struct connect_req_packet : vpn_packet
643 {
644 u8 id, protocols;
645 u8 pad1, pad2;
646
647 connect_req_packet (int dst, int id_, u8 protocols_)
648 : id(id_)
649 , protocols(protocols_)
650 {
651 set_hdr (PT_CONNECT_REQ, dst);
652 len = sizeof (*this) - sizeof (net_packet);
653 }
654 };
655
656 struct connect_info_packet : vpn_packet
657 {
658 u8 id, protocols;
659 u8 pad1, pad2;
660 sockinfo si;
661
662 connect_info_packet (int dst, int id_, const sockinfo &si_, u8 protocols_)
663 : id(id_)
664 , protocols(protocols_)
665 , si(si_)
666 {
667 set_hdr (PT_CONNECT_INFO, dst);
668
669 len = sizeof (*this) - sizeof (net_packet);
670 }
671 };
672
673 /////////////////////////////////////////////////////////////////////////////
674
675 void
676 connection::connection_established ()
677 {
678 slog (L_NOISE, _("%s: possible connection establish (ictx %d, octx %d)"), conf->nodename, !!ictx, !!octx);
679
680 if (ictx && octx)
681 {
682 // make sure rekeying timeouts are slightly asymmetric
683 ev::tstamp rekey_interval = ::conf.rekey + (conf->id > THISNODE->id ? 10 : 0);
684 rekey.start (rekey_interval, rekey_interval);
685 keepalive.start (::conf.keepalive);
686
687 // send queued packets
688 if (ictx && octx)
689 {
690 while (tap_packet *p = (tap_packet *)data_queue.get ())
691 {
692 if (p->len) send_data_packet (p);
693 delete p;
694 }
695
696 while (vpn_packet *p = (vpn_packet *)vpn_queue.get ())
697 {
698 if (p->len) send_vpn_packet (p, si, IPTOS_RELIABILITY);
699 delete p;
700 }
701 }
702
703 vpn->connection_established (this);
704 }
705 else
706 {
707 retry_cnt = 0;
708 establish_connection.start (5);
709 keepalive.stop ();
710 rekey.stop ();
711 }
712 }
713
714 void
715 connection::reset_si ()
716 {
717 if (vpn->can_direct (THISNODE, conf))
718 protocol = best_protocol (THISNODE->protocols & conf->connectable_protocols ());
719 else
720 {
721 slog (L_TRACE, _("%s: direct connection denied by config."), conf->nodename);
722 protocol = 0;
723 }
724
725 si.set (conf, protocol);
726
727 is_direct = si.valid ();
728 }
729
730 // ensure sockinfo is valid, forward if necessary
731 const sockinfo &
732 connection::forward_si (const sockinfo &si) const
733 {
734 if (!si.valid ())
735 {
736 connection *r = vpn->find_router_for (this);
737
738 if (r)
739 {
740 slog (L_DEBUG, _("%s: no common protocol, trying to route through %s."),
741 conf->nodename, r->conf->nodename);
742 return r->si;
743 }
744 else
745 slog (L_DEBUG, _("%s: node unreachable, no common protocol or no router available."),
746 conf->nodename);
747 }
748
749 return si;
750 }
751
752 void
753 connection::send_vpn_packet (vpn_packet *pkt, const sockinfo &si, int tos)
754 {
755 if (!vpn->send_vpn_packet (pkt, si, tos))
756 reset_connection ();
757 }
758
759 void
760 connection::send_ping (const sockinfo &si, u8 pong)
761 {
762 ping_packet *pkt = new ping_packet;
763
764 pkt->setup (conf->id, pong ? ping_packet::PT_PONG : ping_packet::PT_PING);
765
766 slog (L_TRACE, "%s << %s [%s]", conf->nodename, pong ? "PT_PONG" : "PT_PING", (const char *)si);
767
768 send_vpn_packet (pkt, si, IPTOS_LOWDELAY);
769
770 delete pkt;
771 }
772
773 void
774 connection::send_reset (const sockinfo &si)
775 {
776 if (reset_rate_limiter.can (si) && connectmode != conf_node::C_DISABLED)
777 {
778 config_packet *pkt = new config_packet;
779
780 pkt->setup (vpn_packet::PT_RESET, conf->id);
781 send_vpn_packet (pkt, si, IPTOS_MINCOST);
782
783 delete pkt;
784 }
785 }
786
787 void
788 connection::send_auth_request (const sockinfo &si, bool initiate)
789 {
790 auth_req_packet *pkt = new auth_req_packet (conf->id, initiate, THISNODE->protocols);
791
792 rsachallenge chg;
793 rsa_cache.gen (pkt->id, chg);
794 rsa_encrypt (conf->rsa_key, chg, pkt->encr);
795
796 slog (L_TRACE, "%s << PT_AUTH_REQ [%s]", conf->nodename, (const char *)si);
797
798 send_vpn_packet (pkt, si, IPTOS_RELIABILITY | IPTOS_LOWDELAY); // rsa is very very costly
799
800 delete pkt;
801 }
802
803 void
804 connection::send_auth_response (const sockinfo &si, const rsaid &id, const rsachallenge &chg)
805 {
806 auth_res_packet *pkt = new auth_res_packet (conf->id);
807
808 pkt->id = id;
809
810 rsa_hash (id, chg, pkt->response);
811
812 pkt->hmac_set (octx);
813
814 slog (L_TRACE, "%s << PT_AUTH_RES [%s]", conf->nodename, (const char *)si);
815
816 send_vpn_packet (pkt, si, IPTOS_RELIABILITY); // rsa is very very costly
817
818 delete pkt;
819 }
820
821 void
822 connection::send_connect_info (int rid, const sockinfo &rsi, u8 rprotocols)
823 {
824 slog (L_TRACE, "%s << PT_CONNECT_INFO(%s,%s)", conf->nodename,
825 vpn->conns[rid - 1]->conf->nodename, (const char *)rsi);
826
827 connect_info_packet *r = new connect_info_packet (conf->id, rid, rsi, rprotocols);
828
829 r->hmac_set (octx);
830 send_vpn_packet (r, si);
831
832 delete r;
833 }
834
835 inline void
836 connection::establish_connection_cb (ev::timer &w, int revents)
837 {
838 if (!ictx
839 && conf != THISNODE
840 && connectmode != conf_node::C_NEVER
841 && connectmode != conf_node::C_DISABLED
842 && !w.is_active ())
843 {
844 // a bit hacky, if ondemand, and packets are no longer queued, then reset the connection
845 // and stop trying. should probably be handled by a per-connection expire handler.
846 if (connectmode == conf_node::C_ONDEMAND && vpn_queue.empty () && data_queue.empty ())
847 {
848 reset_connection ();
849 return;
850 }
851
852 last_establish_attempt = ev_now ();
853
854 ev::tstamp retry_int = ev::tstamp (retry_cnt & 3
855 ? (retry_cnt & 3) + 1
856 : 1 << (retry_cnt >> 2));
857
858 reset_si ();
859
860 bool slow = si.prot & PROT_SLOW;
861
862 if (si.prot && !si.host && vpn->can_direct (THISNODE, conf))
863 {
864 /*TODO*/ /* start the timer so we don't recurse endlessly */
865 w.start (1);
866 vpn->send_connect_request (this);
867 }
868 else
869 {
870 if (si.valid ())
871 slog (L_DEBUG, _("%s: sending direct connection request to %s."),
872 conf->nodename, (const char *)si);
873
874 const sockinfo &dsi = forward_si (si);
875
876 slow = slow || (dsi.prot & PROT_SLOW);
877
878 if (dsi.valid () && auth_rate_limiter.can (dsi))
879 {
880 if (retry_cnt < 4)
881 send_auth_request (dsi, true);
882 else
883 send_ping (dsi, 0);
884 }
885 }
886
887 retry_int *= slow ? 8. : 0.9;
888
889 if (retry_int < conf->max_retry)
890 retry_cnt++;
891 else
892 retry_int = conf->max_retry;
893
894 w.start (retry_int);
895 }
896 }
897
898 void
899 connection::reset_connection ()
900 {
901 if (ictx && octx)
902 {
903 slog (L_INFO, _("%s(%s): connection lost"),
904 conf->nodename, (const char *)si);
905
906 if (::conf.script_node_down)
907 {
908 run_script_cb *cb = new run_script_cb;
909 cb->set<connection, &connection::script_node_down> (this);
910 run_script_queued (cb, _("node-down command execution failed, continuing."));
911 }
912 }
913
914 delete ictx; ictx = 0;
915 delete octx; octx = 0;
916 #if ENABLE_DNS
917 dnsv4_reset_connection ();
918 #endif
919
920 si.host = 0;
921
922 last_activity = 0.;
923 //last_si_change = 0.;
924 retry_cnt = 0;
925
926 rekey.stop ();
927 keepalive.stop ();
928 establish_connection.stop ();
929 }
930
931 void
932 connection::shutdown ()
933 {
934 if (ictx && octx)
935 send_reset (si);
936
937 reset_connection ();
938 }
939
940 // poor-man's rekeying
941 inline void
942 connection::rekey_cb (ev::timer &w, int revents)
943 {
944 reset_connection ();
945 establish_connection ();
946 }
947
948 void
949 connection::send_data_packet (tap_packet *pkt)
950 {
951 vpndata_packet *p = new vpndata_packet;
952 int tos = 0;
953
954 // I am not hilarious about peeking into packets, but so be it.
955 if (conf->inherit_tos && pkt->is_ipv4 ())
956 tos = (*pkt)[15] & IPTOS_TOS_MASK;
957
958 p->setup (this, conf->id, &((*pkt)[6 + 6]), pkt->len - 6 - 6, ++oseqno); // skip 2 macs
959 send_vpn_packet (p, si, tos);
960
961 delete p;
962
963 if (oseqno > MAX_SEQNO)
964 rekey ();
965 }
966
967 void
968 connection::post_inject_queue ()
969 {
970 // force a connection every now and when when packets are sent (max 1/s)
971 if (ev_now () - last_establish_attempt >= 0.95) // arbitrary
972 establish_connection.stop ();
973
974 establish_connection ();
975 }
976
977 void
978 connection::inject_data_packet (tap_packet *pkt)
979 {
980 if (ictx && octx)
981 send_data_packet (pkt);
982 else
983 {
984 data_queue.put (new tap_packet (*pkt));
985 post_inject_queue ();
986 }
987 }
988
989 void connection::inject_vpn_packet (vpn_packet *pkt, int tos)
990 {
991 if (ictx && octx)
992 send_vpn_packet (pkt, si, tos);
993 else
994 {
995 vpn_queue.put ((vpn_packet *)new data_packet (*(data_packet *)pkt));
996 post_inject_queue ();
997 }
998 }
999
1000 void
1001 connection::recv_vpn_packet (vpn_packet *pkt, const sockinfo &rsi)
1002 {
1003 last_activity = ev_now ();
1004
1005 slog (L_NOISE, "%s >> received packet type %d from %d to %d.",
1006 conf->nodename, pkt->typ (), pkt->src (), pkt->dst ());
1007
1008 if (connectmode == conf_node::C_DISABLED)
1009 return;
1010
1011 switch (pkt->typ ())
1012 {
1013 case vpn_packet::PT_PING:
1014 slog (L_TRACE, "%s >> PT_PING", conf->nodename);
1015
1016 // we send pings instead of auth packets after some retries,
1017 // so reset the retry counter and establish a connection
1018 // when we receive a ping.
1019 if (!(ictx && octx))
1020 {
1021 if (auth_rate_limiter.can (rsi))
1022 send_auth_request (rsi, true);
1023 }
1024 else
1025 // we would love to change thre socket address here, but ping's aren't
1026 // authenticated, so we best ignore it.
1027 send_ping (rsi, 1); // pong
1028
1029 break;
1030
1031 case vpn_packet::PT_PONG:
1032 slog (L_TRACE, "%s >> PT_PONG", conf->nodename);
1033 break;
1034
1035 case vpn_packet::PT_RESET:
1036 {
1037 reset_connection ();
1038
1039 config_packet *p = (config_packet *) pkt;
1040
1041 if (!p->chk_config ())
1042 {
1043 slog (L_WARN, _("%s(%s): protocol mismatch, disabling node."),
1044 conf->nodename, (const char *)rsi);
1045 connectmode = conf_node::C_DISABLED;
1046 }
1047 else if (connectmode == conf_node::C_ALWAYS)
1048 establish_connection ();
1049 }
1050 break;
1051
1052 case vpn_packet::PT_AUTH_REQ:
1053 if (auth_rate_limiter.can (rsi))
1054 {
1055 auth_req_packet *p = (auth_req_packet *) pkt;
1056
1057 slog (L_TRACE, "%s >> PT_AUTH_REQ(%s)", conf->nodename, p->initiate ? "initiate" : "reply");
1058
1059 if (p->chk_config ()
1060 && (!strncmp (p->magic, MAGIC_OLD, 8) || !strncmp (p->magic, MAGIC, 8)))
1061 {
1062 if (p->prot_minor != PROTOCOL_MINOR)
1063 slog (L_INFO, _("%s(%s): protocol minor version mismatch: ours is %d, %s's is %d."),
1064 conf->nodename, (const char *)rsi,
1065 PROTOCOL_MINOR, conf->nodename, p->prot_minor);
1066
1067 if (p->initiate)
1068 send_auth_request (rsi, false);
1069
1070 rsachallenge k;
1071
1072 if (!rsa_decrypt (::conf.rsa_key, p->encr, k))
1073 {
1074 slog (L_ERR, _("%s(%s): challenge illegal or corrupted (%s). mismatched key or config file?"),
1075 conf->nodename, (const char *)rsi, ERR_error_string (ERR_get_error (), 0));
1076 break;
1077 }
1078 else
1079 {
1080 delete octx;
1081
1082 octx = new crypto_ctx (k, 1);
1083 oseqno = ntohl (*(u32 *)&k[CHG_SEQNO]) & 0x7fffffff;
1084
1085 conf->protocols = p->protocols;
1086 features = p->features & config_packet::get_features ();
1087
1088 send_auth_response (rsi, p->id, k);
1089
1090 connection_established ();
1091
1092 break;
1093 }
1094 }
1095 else
1096 slog (L_WARN, _("%s(%s): protocol mismatch."),
1097 conf->nodename, (const char *)rsi);
1098
1099 send_reset (rsi);
1100 }
1101
1102 break;
1103
1104 case vpn_packet::PT_AUTH_RES:
1105 {
1106 auth_res_packet *p = (auth_res_packet *)pkt;
1107
1108 slog (L_TRACE, "%s >> PT_AUTH_RES", conf->nodename);
1109
1110 if (p->chk_config ())
1111 {
1112 if (p->prot_minor != PROTOCOL_MINOR)
1113 slog (L_INFO, _("%s(%s): protocol minor version mismatch: ours is %d, %s's is %d."),
1114 conf->nodename, (const char *)rsi,
1115 PROTOCOL_MINOR, conf->nodename, p->prot_minor);
1116
1117 rsachallenge chg;
1118
1119 if (!rsa_cache.find (p->id, chg))
1120 {
1121 slog (L_ERR, _("%s(%s): unrequested auth response, ignoring."),
1122 conf->nodename, (const char *)rsi);
1123 break;
1124 }
1125 else
1126 {
1127 crypto_ctx *cctx = new crypto_ctx (chg, 0);
1128
1129 if (!p->hmac_chk (cctx))
1130 {
1131 slog (L_ERR, _("%s(%s): hmac authentication error on auth response, received invalid packet\n"
1132 "could be an attack, or just corruption or a synchronization error."),
1133 conf->nodename, (const char *)rsi);
1134 break;
1135 }
1136 else
1137 {
1138 rsaresponse h;
1139
1140 rsa_hash (p->id, chg, h);
1141
1142 if (!memcmp ((u8 *)&h, (u8 *)p->response, sizeof h))
1143 {
1144 prot_minor = p->prot_minor;
1145
1146 delete ictx; ictx = cctx;
1147
1148 iseqno.reset (ntohl (*(u32 *)&chg[CHG_SEQNO]) & 0x7fffffff); // at least 2**31 sequence numbers are valid
1149
1150 si = rsi;
1151 protocol = rsi.prot;
1152
1153 slog (L_INFO, _("%s(%s): connection established (%s), protocol version %d.%d."),
1154 conf->nodename, (const char *)rsi,
1155 is_direct ? "direct" : "forwarded",
1156 p->prot_major, p->prot_minor);
1157
1158 connection_established ();
1159
1160 if (::conf.script_node_up)
1161 {
1162 run_script_cb *cb = new run_script_cb;
1163 cb->set<connection, &connection::script_node_up> (this);
1164 run_script_queued (cb, _("node-up command execution failed, continuing."));
1165 }
1166
1167 break;
1168 }
1169 else
1170 slog (L_ERR, _("%s(%s): sent and received challenge do not match."),
1171 conf->nodename, (const char *)rsi);
1172 }
1173
1174 delete cctx;
1175 }
1176 }
1177 }
1178
1179 send_reset (rsi);
1180 break;
1181
1182 case vpn_packet::PT_DATA_COMPRESSED:
1183 #if !ENABLE_COMPRESSION
1184 send_reset (rsi);
1185 break;
1186 #endif
1187
1188 case vpn_packet::PT_DATA_UNCOMPRESSED:
1189
1190 if (ictx && octx)
1191 {
1192 vpndata_packet *p = (vpndata_packet *)pkt;
1193
1194 if (!p->hmac_chk (ictx))
1195 slog (L_ERR, _("%s(%s): hmac authentication error, received invalid packet\n"
1196 "could be an attack, or just corruption or a synchronization error."),
1197 conf->nodename, (const char *)rsi);
1198 else
1199 {
1200 u32 seqno;
1201 tap_packet *d = p->unpack (this, seqno);
1202 int seqclass = iseqno.seqno_classify (seqno);
1203
1204 if (seqclass == 0) // ok
1205 {
1206 vpn->tap->send (d);
1207
1208 if (si != rsi)
1209 {
1210 // fast re-sync on source address changes, useful especially for tcp/ip
1211 //if (last_si_change < ev_now () + 5.)
1212 // {
1213 slog (L_INFO, _("%s(%s): changing socket address to %s."),
1214 conf->nodename, (const char *)si, (const char *)rsi);
1215
1216 si = rsi;
1217
1218 if (::conf.script_node_change)
1219 {
1220 run_script_cb *cb = new run_script_cb;
1221 cb->set<connection, &connection::script_node_change> (this);
1222 run_script_queued (cb, _("node-change command execution failed, continuing."));
1223 }
1224
1225 // }
1226 //else
1227 // slog (L_INFO, _("%s(%s): accepted packet from %s, not (yet) redirecting traffic."),
1228 // conf->nodename, (const char *)si, (const char *)rsi);
1229 }
1230 }
1231 else if (seqclass == 1) // far history
1232 slog (L_ERR, _("received very old packet (received %08lx, expected %08lx). "
1233 "possible replay attack, or just packet duplication/delay, ignoring."), seqno, iseqno.seq + 1);
1234 else if (seqclass == 2) // in-window duplicate, happens often on wireless
1235 slog (L_DEBUG, _("received recent duplicated packet (received %08lx, expected %08lx). "
1236 "possible replay attack, or just packet duplication, ignoring."), seqno, iseqno.seq + 1);
1237 else if (seqclass == 3) // reset
1238 {
1239 slog (L_ERR, _("received out-of-sync (far future) packet (received %08lx, expected %08lx). "
1240 "probably just massive packet loss, sending reset."), seqno, iseqno.seq + 1);
1241 send_reset (rsi);
1242 }
1243
1244 delete d;
1245 break;
1246 }
1247 }
1248
1249 send_reset (rsi);
1250 break;
1251
1252 case vpn_packet::PT_CONNECT_REQ:
1253 if (ictx && octx && rsi == si && pkt->hmac_chk (ictx))
1254 {
1255 connect_req_packet *p = (connect_req_packet *)pkt;
1256
1257 if (p->id > 0 && p->id <= vpn->conns.size ())
1258 {
1259 connection *c = vpn->conns[p->id - 1];
1260 conf->protocols = p->protocols;
1261
1262 slog (L_TRACE, "%s >> PT_CONNECT_REQ(%s) [%d]",
1263 conf->nodename, vpn->conns[p->id - 1]->conf->nodename, c->ictx && c->octx);
1264
1265 if (c->ictx && c->octx)
1266 {
1267 // send connect_info packets to both sides, in case one is
1268 // behind a nat firewall (or both ;)
1269 c->send_connect_info (conf->id, si, conf->protocols);
1270 send_connect_info (c->conf->id, c->si, c->conf->protocols);
1271 }
1272 else
1273 c->establish_connection ();
1274 }
1275 else
1276 slog (L_WARN,
1277 _("received authenticated connection request from unknown node #%d, config file mismatch?"),
1278 p->id);
1279 }
1280
1281 break;
1282
1283 case vpn_packet::PT_CONNECT_INFO:
1284 if (ictx && octx && rsi == si && pkt->hmac_chk (ictx))
1285 {
1286 connect_info_packet *p = (connect_info_packet *)pkt;
1287
1288 if (p->id > 0 && p->id <= vpn->conns.size ())
1289 {
1290 connection *c = vpn->conns[p->id - 1];
1291
1292 c->conf->protocols = p->protocols;
1293 protocol = best_protocol (c->conf->protocols & THISNODE->protocols & p->si.supported_protocols (c->conf));
1294 p->si.upgrade_protocol (protocol, c->conf);
1295
1296 slog (L_TRACE, "%s >> PT_CONNECT_INFO(%s,%s) [%d]",
1297 conf->nodename, vpn->conns[p->id - 1]->conf->nodename,
1298 (const char *)p->si, !c->ictx && !c->octx);
1299
1300 const sockinfo &dsi = forward_si (p->si);
1301
1302 if (dsi.valid ())
1303 c->send_auth_request (dsi, true);
1304 }
1305 else
1306 slog (L_WARN,
1307 _("received authenticated connection request from unknown node #%d, config file mismatch?"),
1308 p->id);
1309 }
1310
1311 break;
1312
1313 default:
1314 send_reset (rsi);
1315 break;
1316 }
1317 }
1318
1319 inline void
1320 connection::keepalive_cb (ev::timer &w, int revents)
1321 {
1322 if (ev_now () >= last_activity + ::conf.keepalive + 15)
1323 {
1324 reset_connection ();
1325 establish_connection ();
1326 }
1327 else if (ev_now () < last_activity + ::conf.keepalive)
1328 w.start (last_activity + ::conf.keepalive - ev::now ());
1329 else if (conf->connectmode != conf_node::C_ONDEMAND
1330 || THISNODE->connectmode != conf_node::C_ONDEMAND)
1331 {
1332 send_ping (si);
1333 w.start (3);
1334 }
1335 else if (ev_now () < last_activity + ::conf.keepalive + 10)
1336 // hold ondemand connections implicitly a few seconds longer
1337 // should delete octx, though, or something like that ;)
1338 w.start (last_activity + ::conf.keepalive + 10 - ev::now ());
1339 else
1340 reset_connection ();
1341 }
1342
1343 void connection::send_connect_request (int id)
1344 {
1345 connect_req_packet *p = new connect_req_packet (conf->id, id, conf->protocols);
1346
1347 slog (L_TRACE, "%s << PT_CONNECT_REQ(%s)",
1348 conf->nodename, vpn->conns[id - 1]->conf->nodename);
1349 p->hmac_set (octx);
1350 send_vpn_packet (p, si);
1351
1352 delete p;
1353 }
1354
1355 void connection::script_init_env (const char *ext)
1356 {
1357 char *env;
1358 asprintf (&env, "IFUPDATA%s=%s", ext, conf->if_up_data); putenv (env);
1359 asprintf (&env, "NODENAME%s=%s", ext, conf->nodename); putenv (env);
1360 asprintf (&env, "MAC%s=%02x:%02x:%02x:%02x:%02x:%02x", ext,
1361 0xfe, 0xfd, 0x80, 0x00, conf->id >> 8,
1362 conf->id & 0xff); putenv (env);
1363 }
1364
1365 void connection::script_init_connect_env ()
1366 {
1367 vpn->script_init_env ();
1368
1369 char *env;
1370 asprintf (&env, "DESTID=%d", conf->id); putenv (env);
1371 asprintf (&env, "DESTSI=%s", (const char *)si); putenv (env);
1372 asprintf (&env, "DESTNODE=%s", conf->nodename); putenv (env);
1373 asprintf (&env, "DESTIP=%s", si.ntoa ()); putenv (env);
1374 asprintf (&env, "DESTPORT=%d", ntohs (si.port)); putenv (env);
1375 }
1376
1377 inline const char *
1378 connection::script_node_up ()
1379 {
1380 script_init_connect_env ();
1381
1382 putenv ((char *)"STATE=up");
1383
1384 char *filename;
1385 asprintf (&filename,
1386 "%s/%s",
1387 confbase,
1388 ::conf.script_node_up ? ::conf.script_node_up : "node-up");
1389
1390 return filename;
1391 }
1392
1393 inline const char *
1394 connection::script_node_change ()
1395 {
1396 script_init_connect_env ();
1397
1398 putenv ((char *)"STATE=change");
1399
1400 char *filename;
1401 asprintf (&filename,
1402 "%s/%s",
1403 confbase,
1404 ::conf.script_node_change ? ::conf.script_node_change : "node-change");
1405
1406 return filename;
1407 }
1408
1409 inline const char *
1410 connection::script_node_down ()
1411 {
1412 script_init_connect_env ();
1413
1414 putenv ((char *)"STATE=down");
1415
1416 char *filename;
1417 asprintf (&filename,
1418 "%s/%s",
1419 confbase,
1420 ::conf.script_node_down ? ::conf.script_node_down : "node-down");
1421
1422 return filename;
1423 }
1424
1425 connection::connection (struct vpn *vpn, conf_node *conf)
1426 : vpn(vpn), conf(conf),
1427 #if ENABLE_DNS
1428 dns (0),
1429 #endif
1430 data_queue(conf->max_ttl, conf->max_queue + 1),
1431 vpn_queue(conf->max_ttl, conf->max_queue + 1)
1432 {
1433 rekey .set<connection, &connection::rekey_cb > (this);
1434 keepalive .set<connection, &connection::keepalive_cb > (this);
1435 establish_connection.set<connection, &connection::establish_connection_cb> (this);
1436
1437 last_establish_attempt = 0.;
1438 octx = ictx = 0;
1439
1440 if (!conf->protocols) // make sure some protocol is enabled
1441 conf->protocols = PROT_UDPv4;
1442
1443 connectmode = conf->connectmode;
1444
1445 // queue a dummy packet to force an initial connection attempt
1446 if (connectmode != conf_node::C_ALWAYS && connectmode != conf_node::C_DISABLED)
1447 vpn_queue.put (new net_packet);
1448
1449 reset_connection ();
1450 }
1451
1452 connection::~connection ()
1453 {
1454 shutdown ();
1455 }
1456
1457 void connection_init ()
1458 {
1459 auth_rate_limiter.clear ();
1460 reset_rate_limiter.clear ();
1461 }
1462