Technische Information
Technische Informationen liefern Antworten für den Aufbau eigner Knoten.
Inhaltsverzeichnis
Allgemeines
Falls ein Knoten nicht Kriterien erfüllt, kann dieser das Freifunk Netz erheblich stören.
Da das Netz möglichst offen bleiben soll, ist ein Knotenauschluss nicht so leicht möglich. Ansonsten wären wir gezwungen Registrierungsmaßnahmen vorzusehen, so dass kein Knoten unerlaubt teilnehmen kann. Das würde aber den Ausbau des Netzes erheblich behindern.
- Kanalwahl
- Knoten Spezifikation Soll ein eigner Knoten aufgebaut werden, so muss dieser die Knoten Spezifikation erfüllen, um ihn im Freifunk Dresden Netzwerk einbinden zu dürfen.
Knotennummer durch Registrierung eines Knotens anfordern
Im Freifunknetz Dresden muss sich ein Knoten automatisch und regelmäßig am Registrierungsservice melden.
Die Knotennummern sind in Nutzungsbereiche unterteilt:
(siehe ddmesh-ipcalc.sh)
Start | End | Nutzungsbereich |
---|---|---|
0 | 256 | VServer fest vergeben |
900 | 999 | spezial: temporäre Knotennummer |
1000 | spezial: Startpunkterkennung für Registration Service | |
1001 | 50999 | Knotennummer für Offizielle Firmware: Vergeben durch Registration Service |
51000 | spezial: Startpunkterkennung für Registration Service | |
51001 | 59999 | Knotennummer für alternative Knoten oder eigengebaute Firmware |
60000 | 65278 | Reserviert |
65279 | broadcast (10.200.255.255) |
- Temporäre Knoten
Die Firmware verwendet temporäre Knoten, die sich die Firmware nach dem erstmaligem Start selber zufällig erzeugt. Damit kann diese am Freifunknetz teilnehmen und eine Registrierung über das Netz selber durch führen.
Diese Knotennummer sollte aber die Zeiten der Registrierungspflicht nicht überschreiten.
- Erstmalige Knotennummer
Nach der Registrierung erhält der Freifunk Knoten eine freie Knotennummer. Abhängig davon, ob die Registrierung durch die Originalfirmware oder einem alternativen Aufbau erfolgt, wird eine Knotennummer aus unterschiedlichen Bereichen vergeben. Dieses dient zur Verbesserung der Störanfälligkeit. Alternative Knoten (oder selbst erzeugte Firmware aus dem GitHub-Repository) dürfen nur Nummern ab 51000 verwenden.
- Automatische Neuzuweisung
Knotennummern können jederzeit neu zugewiesen werden. In diesem Fall ist es absolut notwendig, dass die daraus resultierende Neuberechung der IP-Bereiche (Adressen) sofort erfolgt und angewendet wird.
Bei Verschiebungen von Knotenbereichen, kann somit das Netz ohne Nutzereingriff umgeordnet werden. Dies war bereits notwendig.
Daraus ergibt sich die Notwendigkeit der regelmäßigen Regiestrierung eines Freifunk Knotens.
- Regelmäßige Registrierungsplicht
Jeder Freifunk Knoten, ob Original Firmware oder Alternativknoten muss, sich regelmäßig registrieren.
Die Registrierung sorgt für die Reservierung der Knotennummer aktuell für die nächsten 4 Wochen. Nach dieser Zeit wird diese Knotennummer wieder frei und kann an andere Knoten vergeben werden.
Das Interval für eine Registrierung ist 1h-5h zur vorhergehenden Registration.
Ein Knoten, der somit eine bereits vergebene Knotennummer verwendet, erlangt keinen Zugang zum Netz, da ein IP Konflikt eintreten würde. In diesem Fall muss der Knoten über das eigene Internet (nicht über das Freifunknetz) auf den Registrierungsservice zu greifen.
Sysinfo
Der aktuelle Zustand eines Routers kann über die folgende URL abgefragt werden.
http://<router-ip>/sysinfo-json.cgi
Diese json Datenstruktur wird unter anderem vom Freifunkserver (freifunk-dresden.de) abgefragt, um die Hotspot-Liste und Kartendaten zu generieren.
Diese API kann ebenso verwendet werden, um eigene Anwendungen zu entwickeln. Zur Unterscheidung verschiedener Versionen dieser Datenstruktur dient das Versions-Feld.
Detailierte Informationen sind in sysinfo-json zu finden.
Übertragungsgeschwindigkeiten
Backbone (fastd)
fastd ist ein VPN Dienst, welcher für die Backbone-Verbindung zwischen Router-Server, Server-Server oder Router-Router verwendet wird. Die folgenden Werte Router (von Fastd-Projekt entnommen) wurden auf Routern mit Openwrt ermittelt, wobei ausschließlich fastd lief, um die maximale Geschwindigkeit zu ermitteln. Da die Freifunk-Firmware weitere Komponenten (Firewall,Routing,...) beinhaltet, sind diese Werte niedriger. Bei einer schmalen Internetanbindung wird die Geschwindigkeit weiter beschränkt.
- Router (nur als fastd Dienst)
TL-WR841N/ND v9 | TL-WR1043ND v1 | TL-WDR3600 v1 | TL-WR1043ND v2 | Netcup-Server |
---|---|---|---|---|
35.5 Mbits/sec | 42.1 Mbits/sec | 50.3 Mbits/sec | 62.0 Mbits/sec | 14.2 Mbits/sec |
- Freifunk Server-Server fastd - Verbindungen (Werte in Klammern sind direkte Verbindungen zwischen Servern)
Rx | Tx | |
---|---|---|
VPN7(OVH) / VPN1(MyLoc) | 45 (98) Mbits/sec | 93 (96) Mbits/sec |
VPN7(OVH) / VPN5(Netcup-Server) | 18 (65) Mbits/sec | 20 (66) Mbits/sec |
VPN5(Netcup-Server) / VPN1(MyLoc) | 21 (65) Mbits/sec | 22 (66) Mbits/sec |
VPN1/VPN1 (Linux Container) | 531 Mbits/sec | 528 Mbits/sec |
Infrastruktur
- Infrastruktur aktuell ist es eine lose Sammlung von Stichpunkten, welche nach und nach in eine Dokumentation der Firmware/Server Infrastruktur verwandelt wird. Diese Dokumentation beschreibt die externen Abhängigkeiten, das Zusammenspiel der Freifunkkomponenten (Server,Router,Dienste...).
Registrierung
URL: http://register.freifunk-dresden.de/bot.php?registerkey=
registerkey ist wiefolgt definiert: ([0-9a-f][0-9a-f]:){32}
(Beispiel: 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff)
Dieser Key MUSS im gesamten Freifunknetz von Dresden eindeutig sein. In der Firmware wird dieser aus dem ssh-fingerprint und der md5sum der Netzwerk Informationen erzeugt.
key1=$(dd if=/dev/urandom bs=16 count=1 2>/dev/null | hexdump -e '16/1 "%02x:"' | sed 's#:$##')
key2=$(ip link | grep ether | md5sum | cut -d' ' -f1 | sed 's#\(..\)#\1:#g;s#:$##')
key="$key1:$key2"
key1 wird vom Randomgenerator erzeugt, welcher ziemlich eindeutig sein sollte. Falls es aber bei gleichen Routertypen doch zu gleichen Werten kommen sollte, wird der key2 über die Netzwerkkonfiguration ermittelt, welches die die MAC der Netzwerkkarten einschließt. Da jeder Router eine andere MAC besitzt, wird hier eine garantierte Eindeutigkeit erreicht.
Berechnung IP Adressen
Die Berechnung der IP Adressen erfolgt in der Firmware mit nachfolgendem AWK-Script. Damit ist es möglich für eine Knotennummer alle notwendigen IP Adressen zuberechnen. Ebenso ist es möglich via Freifunk IP die Knotennummer zu ermitteln.
#!/bin/sh # # 0 - 99 vserver # 1000 spezial:start point for registrator # 1001 - 50999 Knotennummer für Firmware: vergeben durch registrator # 51000 - 59999 Knotennummer für eigen Aufgebaute Knoten # 60000 - 65278 Reserviert # 65279 broadcast (10.200.255.255) ############################################## export NODE_MIN=1001 export NODE_MAX=59999 export ARG1="$1" export ARG2="$2" if [ "$ARG1" = "" ] then echo "" echo "ddmesh-ipcalc.sh (awk) Stephan Enderlein (c) 2015 V4" echo "" echo "Calculates all the addresses for the ddmesh freifunk node" echo "usage: ddmesh-ipcalc.sh [-t] [-n node] | [ipv4 ip]" echo "-t run ipcalc test" echo "-n node 0- calulate ip" echo "<ipv4 ip> caluclate node" echo "" exit 1 fi if [ "$ARG1" = "-t" ]; then eval $($0 -n 0) n=0 echo "Testing nodes $n-$_ddmesh_max" _ddmesh_max=10 while [ $n -le $_ddmesh_max ] do eval $($0 -n $n) r=$($0 $_ddmesh_ip) echo "$n - $_ddmesh_ip - $r" if [ $n -ne $r ]; then echo "ERROR" exit 1 fi n=$(($n + 1)) done exit 0 fi awk -v arg1="$ARG1" -v arg2="$ARG2" ' function lookup_ip(ip) { #parameter check if(!match(ip,/^10\.20[0-1]\.[0-9]+\.[0-9]+$/)) { print "invalid ip"; exit 1 } split(ip,a,".") node=a[3]*255 + a[4] - 1 if(node > ENVIRON["NODE_MAX"]) { print "Invalid IP"; exit 1 } print node } function lookup_node(node) { #parameter check if(!match(node,/^[0-9]+$/) || node > ENVIRON["NODE_MAX"] ) { print "invalid node"; exit 1 } domain = "freifunk-dresden.de" _primary_major = 200 _nonprimary_major = 201 _middle = int(node / 255) % 256 _minor = (node % 255) + 1 _meshnet = "10" nodeip = _meshnet "." _primary_major "." _middle "." _minor nonprimary_ip = _meshnet "." _nonprimary_major "." _middle "." _minor meshpre = 16 meshnetmask = "255.255.0.0" meshbroadcast = "10.255.255.255" mesh6pre = "48" mesh6net = "fd11:11ae:7466::" # client range mesh6nodenet = "fd11:11ae:7466:" sprintf("%x", node) "::" mesh6ip = mesh6nodenet "1" mesh6nodepre = "64" print "export _ddmesh_min=\""ENVIRON["NODE_MIN"]"\"" print "export _ddmesh_max=\""ENVIRON["NODE_MAX"]"\"" print "export _ddmesh_node=\""node"\"" print "export _ddmesh_domain=\""domain"\"" print "export _ddmesh_hostname=\"r"node"\"" print "export _ddmesh_ip=\""nodeip"\"" print "export _ddmesh_nonprimary_ip=\""nonprimary_ip"\"" print "export _ddmesh_netpre=\""meshpre"\"" print "export _ddmesh_netmask=\""meshnetmask"\"" print "export _ddmesh_broadcast=\""meshbroadcast"\"" print "export _ddmesh_mesh6net=\""mesh6net"\"" if(!match(ip,/^10\.20[0-1]\.[0-9]+\.[0-9]+$/)) { print "invalid ip"; exit 1 } split(ip,a,".") node=a[3]*255 + a[4] - 1 if(node > ENVIRON["NODE_MAX"]) { print "Invalid IP"; exit 1 } print node } function lookup_node(node) { #parameter check if(!match(node,/^[0-9]+$/) || node > ENVIRON["NODE_MAX"] ) { print "invalid node"; exit 1 } domain = "freifunk-dresden.de" _primary_major = 200 _nonprimary_major = 201 _middle = int(node / 255) % 256 _minor = (node % 255) + 1 _meshnet = "10" nodeip = _meshnet "." _primary_major "." _middle "." _minor nonprimary_ip = _meshnet "." _nonprimary_major "." _middle "." _minor meshpre = 16 meshnetmask = "255.255.0.0" meshbroadcast = "10.255.255.255" mesh6pre = "48" mesh6net = "fd11:11ae:7466::" # client range mesh6nodenet = "fd11:11ae:7466:" sprintf("%x", node) "::" mesh6ip = mesh6nodenet "1" mesh6nodepre = "64" print "export _ddmesh_min=\""ENVIRON["NODE_MIN"]"\"" print "export _ddmesh_max=\""ENVIRON["NODE_MAX"]"\"" print "export _ddmesh_node=\""node"\"" print "export _ddmesh_domain=\""domain"\"" print "export _ddmesh_hostname=\"r"node"\"" print "export _ddmesh_ip=\""nodeip"\"" print "export _ddmesh_nonprimary_ip=\""nonprimary_ip"\"" print "export _ddmesh_netpre=\""meshpre"\"" print "export _ddmesh_netmask=\""meshnetmask"\"" print "export _ddmesh_broadcast=\""meshbroadcast"\"" print "export _ddmesh_mesh6net=\""mesh6net"\"" print "export _ddmesh_mesh6pre=\""mesh6pre"\"" print "export _ddmesh_mesh6nodenet=\""mesh6nodenet"\"" print "export _ddmesh_mesh6ip=\""mesh6ip"\"" print "export _ddmesh_mesh6nodepre=\""mesh6nodepre"\"" } BEGIN { if(arg1=="-n") lookup_node(arg2) else lookup_ip(arg1) exit 0; } '