Cjdns

Aus wiki.freifunk.net
Zur Navigation springenZur Suche springen

Cjdns ist ein Netzwerk Protokoll. Die Philosophy hinter cjdns ist ein Netzwerk, das einfach aufzusetzen ist, skaliert und komplett verschlüsselt ist.

Cjdns implementiert ein verschlüsselte IPv6 Netzwerk mit public key Krypto für address allocation und eine distributes hash table for routing.

Vorteile für Freifunk

  • Vollständige Ende-zu-Ende Verschlüsslung
  • Freifunk Dienste können auch aus dem Urlaub über eine sichere Verbindung erreicht werden

Nachteile

  • Der Adressbereich fc00::/8 kann nicht anderweitig verwendet werden

Addressbereich

Cjdns verwendet den Range fc00::/8 vollständig. Es darf keine andere Route für diesen Range verfügbar sein.

Adressbereich ist frei

Es kann ein vollständiger cjdns node betrieben werden. Es ist keine Änderung in der config notwendig. Der Node ist dazu in der Lage, traffic für andere zu routen, über seine fc adresse erreichbar und kann andere fc adressen erreichen.

Adressbereich ist in Verwendung

Cjdns kann legitlich als Router betrieben werden. Wird das tun device in der Config deaktiviert, wird keine route für diesen Bereich gesetzt und das Interface wird nicht aktiviert. Der Node ist in der Lage, traffic für andere Teilnehmer weiter zu leiten, ist selbst aber unter seiner fc Adresse nicht erreichbar und kann keine fc Adressen erreichen.

Konflikte mit Freifunk Ranges

(Todo: bisher keine)

Interessierte Communities/Personen

  • kpcyrd (freifunk hamburg)
  • larsg (freifunk berlin)
  • jcgruenhage (freifunk karlsruhe)

Installation auf Debian

# if you are running wheezy. skip this step on jessie
echo 'deb http://ftp.debian.org/debian wheezy-backports main' >> /etc/apt/sources.list
apt-get update
apt-get install nodejs build-essentials
cd /opt/
git clone https://github.com/cjdelisle/cjdns.git
cd cjdns/
./do
ln -s /opt/cjdns/cjdroute /usr/bin/
wget -O /etc/init.d/cjdns https://raw.githubusercontent.com/ProjectMeshnet/CJDNS-init.d-Script/master/cjdns.sh
chmod 0755 /etc/init.d/cjdns

Installation auf Ubuntu

apt-get install nodejs build-essentials
cd /opt/
git clone https://github.com/cjdelisle/cjdns.git
cd cjdns/
./do
cp contrib/upstart/cjdns.conf /etc/init/
ln -s /opt/cjdns/cjdroute /usr/bin/

Installation auf Fedora

dnf install cjdns cjdns-tools cjdns-selinux

Installation auf anderen Geräten

Peering konfigurieren

Ausgehende Verbindungen

Der einfachste Weg einen peer hinzuzufügen ist es, eine ausgehende Verbindung zu jemandem aufzubauen. So bedarf es keiner konfiguration des Systems für eingehende Verbindungen aus dem Internet. Obwohl es sich hierbei um eine ausgehende Verbindung handelt, können Daten in beide Richtungen übertragen werden, dein Computer ist nur der iniziierende Knoten.

Um eine ausgehende Verbindung aufzubauen brauchst du 3 Dinge: Die IPv4/IPv6 Adresse und den Port, zu dem kommunizoert werden soll, der public key um den entfernten Konten zu authentifizieren, ein shared secret password, das dem entfernten Knoten zeigt, dass du authorisiert bist, dich zu verbinden. Diese Informationen sehen so aus:

"70.201.219.150:7883":
{
    "publicKey":"8hgr60p781kbswugxjyymhhywt62yllxxkz254hqtzbb5rpzc5j0.k",
    "password":"HJSHDF80234nsdkk9KJjf090(((a;djf",
}

Du musst die peer Defintion in deine Konfiguration eintragen, um deinem Knoten zu sagen, dass er sich zu dem anderen Knoten verbinden soll.

Suche nach diesem Teil in deiner Konfiguration:

      // Nodes to connect to.
      "connectTo":
      {
          // Add connection credentials here to join the network
          // Ask somebody who is already connected.
      }

Als nächstes, nimm die Knoten, zu denen du sich verbinden möchtest und füge sie so ein:

      // Nodes to connect to.
      "connectTo":
      {
           "0.1.2.3:45678":
           {
               "password": "password",
               "publicKey": "key.k"
           },
           "0.1.2.3:45678":
           {
               "password": "password",
               "publicKey": "key.k"
           },
           "0.1.2.3:45678":
           {
               "password": "password",
               "publicKey": "key.k"
           }
      }

Wichtig:

  • Ein paar Personen können dir zusätzliche Werte mitgeben als nur das password und den public key. Obwohl diese nicht notwendig sind, stellen sie kein Problem dar. Unbenutzte Werte werden ignoriert. Möglicherweise möchtest du deine eigenen Werte oder Kommentare hinzufügen, damit du dir merken kannst, welcher Knoten welcher ist.

Incoming Connections

Of course, if you can connect to people by making outgoing connections, they must have a way to accept incoming connections, right?

In order to reliably accept incoming peer connections, you need to do a bit of setup. You have set up your router or firewall or whatever stands between you and the Internet to allow incoming connections to to cjdns on the port you are using. If you are using the most common home network setup (a standard consumer wireless router between you and the Internet), you need to configure port forwarding to allow incoming connections. See below for instructions on how to find the port number to forward.

Note that most residential Internet connections have dynamic IP addresses, which periodically change. This causes problems with incoming peer connections: if you tell peers to connect to you at a certain IP address, and your IP address changes, they will no longer be able to find you and connect. Talk with your ISP about getting a static IP address.

If you are unable to obtain a static IP address from your ISP, it is possible to use a dynamic IP address from services such as NO-IP in its place, given that you have this updating on your router or as a service/daemon on the system running Cjdns.

To add a new incoming peer, first find the section of your configuration file that looks like this:

   // Anyone connecting and offering these passwords on connection will be allowed.
   //
   // WARNING: Currently there is no key derivation done on the password field,
   //          DO NOT USE A PASSWORD HERE use something which is truly random and
   //          cannot be guessed.
   // Including a username in the beginning of the password string is encouraged
   // to aid in remembering which users are who.
   //
   "authorizedPasswords":
   [
      // There may already be some stuff here. That is OK.
   ]

Between the square brackets, you should place a comma-separated list of secret connection passwords, thusly:

   "authorizedPasswords":
   [
       {
           // It's good practice to note which peer you have assigned which password to.
           "password": "asdhkjauiawyhajhsf+64987654**&#$*7922-asf"
       },
       {
           // Each peer ought to have its own password, so you can revoke access if necessary.
           "password": "aslrhjfjsdfar2347889023745()@;;;tdfgjh"
       }
   ]

The actual password can be anything; it just has to be hard to guess. Remember that \ is an escape character.

Find the part of your configuration file that looks like this:

   "publicKey": "nu8yx4ht958wqlvvxj7fgfq7l5yq13cc9ycnr8sfjtzm3zjlxhm0.k",

This gives your node's public key, which incoming peers need to connect.

Finally, find the part of your config file that looks like this:

       "UDPInterface":
       {
           // Bind to this port.
           "bind": "0.0.0.0:40941",

This gives the port that your cjdns node is listening on (in this example, 40941).

Make sure that you know your Internet-facing IPv4 address (which you can get here). For this example, assume it is "59.202.17.33".

Once you have all that, construct a peer configuration section and give it to your peer to insert into their configuration file:

"59.202.17.33:40941":
{
    "publicKey":"nu8yx4ht958wqlvvxj7fgfq7l5yq13cc9ycnr8sfjtzm3zjlxhm0.k",
    "password":"asdhkjauiawyhajhsf+64987654**&#$*7922-asf"
}

Send this information to your peer, and have them insert it into their configuration file as an outgoing connection, as described above.

Weblinks