DNS Namen für die Freifunk Knoten

Wir bieten seit einiger Zeit eine interne DNS Auflösung für alle Knoten im Freifunk Aachen Netz an. Insbesondere da ja die iPv6 Adressen nicht gleich bleiben wenn ein Knoten zwischen den Segmenten verschoben wird wollte ich das hier nochmal bekannt machen:

<knotenname>.nodes.ffac

Also beispielsweise:

IHK-Aachen.nodes.ffac

Naturlich auch:
http://IHK-Aachen.nodes.ffac

3 „Gefällt mir“

Könntest du/ihr noch erklären wie die Auflösung technisch umgesetzt ist?

In unserer Community (FFWP) kamen wir diese Woche ebenfalls auf dieses Thema.

Aus den Karten Daten wird eine config datei für bind generiert, details dazu hat am besten @monty

Interne Dienste haben sich bisher nicht ergeben.

Ehm ja :smile:.
Also wir nutzen aktuell Hopglass als Karten-Backend und realisieren die DNS-Auflösung mittels dnsmasq (da man dort einfach eine hosts-Datei angeben kann, die bei Änderungen automatisch neu geladen wird).
Anfragen an unsere DNS-Server auf den Supernodes (aus dem Freifunk-Netz heraus, bind9) deligieren „*.nodes.ffac“-Anfragen dann an unseren Monitoring/Map-Server (dort läuft dnsmasq).

Die entsprechenden Scripts / Config sehen bei uns so aus:

# Cronjob
/usr/bin/curl -s --globoff "http://[::1]:4000/hosts" | grep -E "^2a03:2260:114" | sed -e 's/$/.nodes.ffac/' > /opt/freifunk/data/hosts

# /etc/dnsmasq.d/freifunk
no-negcache
interface=br-aachen
no-dhcp-interface=br-aachen
bind-interfaces
addn-hosts=/opt/freifunk/data/hosts

Mit Meshviewer sah das ganze ähnlich aus, da könnte ich die Config bei Bedarf noch mal raussuchen.

Achja, wichtig ist noch, wenn Ihr dnsmasq verwenden möchtet, dass ihr die Default-Config deaktiviert, da Ihr sonst noch 'nen weiteren DHCP-Server habt (glaube ich zumindest) ;-).

4 „Gefällt mir“

Cool, danke! Bei der Meshviewer config ändert sich vermutlich nur die Erstellung der Hosts Datei oder?

@monty wir haben einen knoten mit _ im Namen, alle die hinter ihm auftauchen lassen sich nicht mehr auflösen:

ffac-haus_fuer_guerzenich.nodes.ffac

Das wird wohl nicht mehr korrekt abgefangen.

Genau, die haben wir mit den Informationen aus der nodes.json und mit Hilfe von jq erstellt:

jq -r '.nodes[]|.nodeinfo|select(.network.addresses|length > 0)|.network.addresses[] +" " +.hostname +".nodes.ffac"|.' nodes.json | grep -E "^2a03:2260:114" > /opt/freifunk/data/hosts

Ne, das hier ist das Problem:

Fehlerhafter Name in /opt/freifunk/data/hosts Zeile 1118:
2a03:2260:114:7:16cc:20ff:fee1:ae52 praxis-fuer-physiotherapie-und-osteopathie-eijgenraam-und-pracht.nodes.ffac

Ich schau mir mal das RFC an und entferne alle nicht validen Hostnamen.

So, läuft wieder:

jq -r '.nodes[]|.nodeinfo|select(.network.addresses|length > 0)|.network.addresses[] +" " +.hostname +".nodes.ffac"|.' nodes.json | grep -E "^2a03:2260:114" | grep -P ' (?!\-)(?:[a-zA-Z\d\-_]{0,62}[a-zA-Z\d]\.){1,126}(?!\d+)[a-zA-Z\d]{1,63}$' > /opt/freifunk/data/hosts

1 „Gefällt mir“

Was das automatische Neuladen angeht, bin ich mir nicht mehr so sicher :smile:
Im Zweifel hilft aber ein kill -SIGHUP $(pidof dnsmasq).

kannst du den regex mal erläutern?

bei mir sind da immer noch die knotennamen mit dem unterstrich drin

am besten man ersetzt alle nicht gültigen zeichen durch ein minus bevor man die rausschmeissst.

Ich habe jetzt ein neues script geschrieben, das automatisch aus einer nodes.json ein include file für bind erstellt:

NODES="https://mesh.freifunk.in-kiel.de/nodes.json"
TLD=ffki
NODESUB=knoten

IsValidHostname () {
  #[a-z] would include umlauts like äöü if LOCALE is set to german
  REGEX="^[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0-9-]+$"
  if [[ "$@" =~ $REGEX ]]; then return 0; else return 1; fi
}

wget $NODES -O nodes.json
jq -r '.nodes[]|.nodeinfo|select(.network.addresses|length > 0)|.network.addresses[] +" " +.hostname|.' nodes.json | grep -E "^fda1:384a:74de:4242" > knotenliste
echo "; \$ORIGIN $TLD." > db.$NODESUB.$TLD
echo "" > db.temp
cat knotenliste | while read k; do
  IP6="$(echo $k | cut -d" " -f1)"
  KNOTEN="$(echo $k | cut -d" " -f2-99|tr _ -|tr . -|tr " " -|tr '[:upper:]' '[:lower:]'|sed 's/ä/ae/;s/ö/oe/;s/ü/ue/;s/ß/ss/g')"
  IsValidHostname "$KNOTEN"
  if [ $? == 0 ]; then
    echo -e "$KNOTEN \t\t\t\t\t86400 \tIN \tAAAA \t$IP6" >> db.temp
  fi
done
sort db.temp >> db.$NODESUB.$TLD
echo "output file: db.$NODESUB.$TLD"

Habe das hier gehostet jetzt: https://github.com/freifunk-kiel/nodes-bind/blob/master/createdb.sh

2 „Gefällt mir“