Bestimmen von benutzten fastd pubkeys ?

wie bestimmt ihr die fastd Keys zu bestimmten Routern die im Betrieb sind? gibt es einen einfachen Weg von den Supernodes aus?
bzw. wie werden Router ggf. „blacklisted“ in eurem fastd/supernode setting?

Hi,

dazu muss man den Socket auslesen. Ich weiß nicht mehr wer es erstellt hat, aber dazu kursiert ein kurzes Skript: https://github.com/FreiFunkMuenster/ansible-ffms/blob/master/roles/fastd/files/status.pl

Dieses braucht als Parameter den Socket. Der liegt normaler Weise in /tmp/fastdirgendwas.

Dann bekommst du alle Infos als Json und kannst dieses mit jd parsen, durchsuchen oder einfach nur ausgeben.

Grüße
Matthias

Siehe status.c oder status.pl in doc/examples in den Quellen.

Sperrung erfolgt mit der on verify Direktive. Es wird ein Skript ausgeführt, in dem nachgeschaut wird, ob der öffentliche Schlüssel des zu sperrenden Knotens sich in einer Liste befindet.

on verify "
    /etc/fastd/sperrskript.sh $PEER_KEY
";

Bei normaler Ausführung erfolgt eine Verbindung, bei einer fehlerhaften Ausführung wird eben keine Verbindung zugelassen. (siehe on verify in der Anleitung)

#!/bin/bash
PEER_KEY=$1

if /bin/grep -Fq $PEER_KEY /etc/fastd/sperrliste.txt; then
    exit 1
else
    exit 0
fi

Ich brauche da nochmal kurz einen Tipp, wie ich von einer NodeID zu dem fastd-pubkey komme.
Vermutlich setze ich den grep nicht richtig an.

Da hampel ich auch schon ewig mit rum, die Doku von jq ist da leider mehr als dürftig:

./status.pl /tmp/fastd-status | jq '.peers[] | if ."connection"."mac_addresses" == "c6:ed:84:b5:ea:10" then (.) else select(false) end | .connection'

Irgendwie so müsste es gehen, aber es klappt nicht.

Ich hab mir dazu das durchgelesen: Are wildcard values possible? · Issue #82 · jqlang/jq · GitHub

/edit:

Also eine Ebene Höhe nach address kann man z. B. so filtern:

./status.pl /tmp/fastd-status | jq '.peers[] | select( ."address" == "1.1.1.1:45838")'

Gibt folgendes aus:

{
  "name": null,
  "address": "1.1.1.1:45838",
  "connection": {
    "established": 20012871,
    "method": "salsa2012+umac",
    "statistics": {
      "rx": {
        "packets": 474829,
        "bytes": 89692792
      },
      "rx_reordered": {
        "packets": 5,
        "bytes": 574
      },
      "tx": {
        "packets": 1050458,
        "bytes": 176870399
      },
      "tx_dropped": {
        "packets": 10,
        "bytes": 756
      },
      "tx_error": {
        "packets": 0,
        "bytes": 0
      }
    },
    "mac_addresses": [
      "<Datenschutz>"
    ]
  }
}

Aber es gelingt mir nicht nach mac_addresses zu filtern.

For the record: Das auslesen geht auch relativ einfach mit Hausmitteln.

In der /etc/fastd/fastd.conf (o.ä.) gibt man per Option den Control-Socket an:

status socket "/tmp/fastd-server-02.sock";

Dies ist ein normaler Unix-Socket, auf den man sich als root per netcat verbinden kann. Es wird sofort der Status als JSON ausgegeben:

{ "uptime": 552646619, "statistics": .....```
4 Likes

Hier die Lösung für Automatisierung.
Bei „contains“ gibt man die hinteren 3 Byte der MAC-Adresse an, die man auf der Karte/Statusseite/nodelist sieht. Es kann sein, dass diese Methode mit einem topaktuellen gluon nicht mehr funktioniert, dann muss man noch die richtige MAC mit dem respondd-Client abfragen - aber das ist eine andere Story.

  1. mit Debian netcat-openbsd (nicht netcat-traditional , das kennt -U nicht)

    nc -U /tmp/fastd.sock | jq '.peers | to_entries | . | select( .value.connection.mac_addresses | contains(„aa:bb:cc“) ) | .key ’

  2. mit status.pl

    ./status.pl /tmp/fastd.sock | jq '.peers | to_entries | . | select( .value.connection.mac_addresses | contains(„aa:bb:cc“) ) | .key ’

Man kann natürlich das " | .key" am Ende wegmachen, wenn man alle Informationen über den Peer möchte, nicht nur den Publiy-Key.

3 Likes