Technische Information: Unterschied zwischen den Versionen

Aus Freifunk Dresden - Anwender-Wiki
Zur Navigation springen Zur Suche springen
(registierung)
(IP Berechnung added)
Zeile 51: Zeile 51:
 
Jeder Freifunk Knoten, ob Original Firmware oder Alternativknoten '''muss''', sich regelmäßig registrieren.<br/>Die Registrierung sorgt für die Reservierung der Knotennummer für aktuelle die nächsten 4 Wochen. Nach dieser Zeit wird diese Knotennummer wieder frei und kann an andere Knoten vergeben werden.<br/>Das Interval für eine Registrierung ist 1h-5h zur vorhergehenden Registration.<br/>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 Internet auf den Registrierungsservice zu greifen.
 
Jeder Freifunk Knoten, ob Original Firmware oder Alternativknoten '''muss''', sich regelmäßig registrieren.<br/>Die Registrierung sorgt für die Reservierung der Knotennummer für aktuelle die nächsten 4 Wochen. Nach dieser Zeit wird diese Knotennummer wieder frei und kann an andere Knoten vergeben werden.<br/>Das Interval für eine Registrierung ist 1h-5h zur vorhergehenden Registration.<br/>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 Internet auf den Registrierungsservice zu greifen.
  
  '''URL:'''http://register.ddmesh.de/bot.php?registerkey=
+
  '''URL:''' http://register.freifunk-dresden.de/bot.php?registerkey=
 +
 
 +
registerkey ist wiefolgt definiert: ([0-9a-f][0-9a-f]:){32}<br/>
 +
(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.
  
Der registerkey ist wiefolgt definiert: ([0-9a-f][0-9a-f]:){32}<br/>
 
Dieser '''MUSS''' im gesamten Freifunknetz von Dresden eindeutig sein. In der Firmware wird dieser aus dem ssh-fingerprint und der md5sum der Netzwerk Informationen erzeugt.
 
<code>
 
 
<code>
 
<code>
 +
key1=$(dropbearkey -y -f /etc/dropbear/dropbear_dss_host_key |
 +
sed -n '/Fingerprint/{s#.* \([a-f0-9:]\+\)#\1#;p}')<br/>
 +
 +
key2=$(ip link | grep ether | md5sum | cut -d' ' -f1 | sed 's#\(..\)#\1:#g')<br/>
 +
key="$key2$key1"
 +
</code>
 +
 +
 +
 +
== 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.
 +
 +
<pre>
 +
#!/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"
  
== Berechnung IP Adressen ==
+
        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"\""
 +
}
  
Jede Knotennummer, welche durch die Registrierung
+
BEGIN {
 +
        if(arg1=="-n")
 +
                lookup_node(arg2)
 +
        else
 +
                lookup_ip(arg1)
 +
        exit 0;
 +
}
 +
'
 +
</pre>

Version vom 14. April 2015, 20:26 Uhr

Technische Informationen liefern Antworten für den Aufbau eigner Knoten.

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.


Knotennummer durch Registrierung eines Knotens anfordern

Im Freifunk Netz Dresden muss ich ein Knoten automatisch und regelmäßig am Registrierungsservice melden.
Die Knotennummern sind in Nutzungsbereiche unterteilt:

Start End Nutzungsbereich
0 99 VServer fest vergeben (derzeit 0-15)
100 spezial: temporäre Knotennummer (derzeit von 16-99)
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
51000 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 für aktuelle 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 Internet auf den Registrierungsservice zu greifen.

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=$(dropbearkey -y -f /etc/dropbear/dropbear_dss_host_key | sed -n '/Fingerprint/{s#.* \([a-f0-9:]\+\)#\1#;p}')

key2=$(ip link | grep ether | md5sum | cut -d' ' -f1 | sed 's#\(..\)#\1:#g')
key="$key2$key1"


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;
 }
'