Freifunk-Gateway aufsetzen/VPN/fastd: Unterschied zwischen den Versionen
Miki (Diskussion | Beiträge) (→fastd: Kommentar ergänzt, "secure handshakes no" ab fastd v19 wirkungslos.) |
|||
(18 dazwischenliegende Versionen von 5 Benutzern werden nicht angezeigt) | |||
Zeile 52: | Zeile 52: | ||
on down "/etc/fastd/down.sh"; | on down "/etc/fastd/down.sh"; | ||
# Deprecated and has no effect with fastd v19 | |||
secure handshakes no; | secure handshakes no; | ||
Zeile 124: | Zeile 125: | ||
</pre> | </pre> | ||
Mit netcat kann man die Daten daraus abfragen. | Mit netcat kann man die Daten daraus abfragen. Es wird das Paket nc.openbsd benötigt. netcat6 (braucht man für den babelsocket) und nc.traditional können nicht aus Unix-sockets lesen. | ||
<pre> | <pre> | ||
nc -U /run/fastd-HOOD.sock | nc -U /run/fastd-HOOD.sock | ||
Zeile 141: | Zeile 142: | ||
nc -U /run/fastd-HOOD.sock | jq .peers[].address | nc -U /run/fastd-HOOD.sock | jq .peers[].address | ||
</pre> | </pre> | ||
==== Script um über alle Sockets nach einer Mac Adresse zu suchen ==== | |||
Hierfür wird jedoch vorausgesetzt das alle Sockets unter /run/ liegen, mit fastd beginnen sowie mit .sock enden. | |||
<pre> | |||
for file in /run/fastd*.sock | |||
do | |||
echo $file | |||
nc -U $file | jq -r '.peers | keys[] as $k | "\(.[$k] | .connection.mac_addresses[]) \(.[$k] | .address) \($k)"' | grep $1 | |||
done | |||
</pre> | |||
Aufgerufen werden kann das Script mit '''./fastd_cat.sh 11:22:33:44:55:66''' | |||
== Einzelne Router sperren == | == Einzelne Router sperren == | ||
Folgende Variablen | Folgende Variablen sind in der fastd config verfügbar: | ||
* LOCAL_ADDRESS: the local IP address | * LOCAL_ADDRESS: the local IP address | ||
* LOCAL_PORT: the local UDP port | * LOCAL_PORT: the local UDP port | ||
Zeile 151: | Zeile 165: | ||
* PEER_KEY: the peer’s public key | * PEER_KEY: the peer’s public key | ||
In der fastd.conf folgende Zeile ändern: | |||
<pre> | |||
on verify "/etc/fastd/blacklist.sh $PEER_KEY $PEER_ADDRESS"; | |||
</pre> | |||
Folgende Datei anlegen: /etc/fastd/blacklist.sh | |||
<pre> | <pre> | ||
#!/bin/sh | |||
key=$1 | |||
addr=$2 | |||
timestamp() { | |||
date +"%Y-%m-%d %H:%M:%S" | |||
} | |||
if grep -q "$key" /etc/fastd/key.blacklist; then | |||
echo "$(timestamp)\t$key\t$addr\tblocked" >> /var/log/fastd.blacklist; | |||
exit 1; | |||
else | |||
exit 0; | |||
fi | |||
</pre> | </pre> | ||
Wenn fastd als systemd Dienst eingerichtet ist, kann man die Sperr-Einträge auch einfach an die jeweiligen Logs anhängen; dafür muss statt in eine Log-Datei einfach in stdout/stderr geschrieben werden. Dies hat insbesondere den Vorteil, dass bei mehreren Sperren die Log-Einträge den Hoods zugeordnet werden: | |||
<pre> | <pre> | ||
#!/bin/ | #!/bin/sh | ||
key=$1 | |||
if | addr=$2 | ||
if grep -q "$key" /etc/fastd/key.blacklist; then | |||
echo "Blocked by keylist: $addr $key" | |||
exit 1; | |||
else | else | ||
exit 0; | |||
fi | fi | ||
</pre> | </pre> | ||
Und anschließend ausführbar machen: | |||
<pre> | |||
chmod a+x /etc/fastd/blacklist.sh | |||
</pre> | |||
Leere Dateien anlegen: | |||
<pre> | |||
touch /etc/fastd/key.blacklist | |||
touch /var/log/fastd.blacklist | |||
</pre> | |||
Nun können in der Datei "key.blacklist" die vorher ermittelten problematischen Keys eingetragen werden. Die Formatierung ist egal, es kann beliebiger Text ergänzt werden, wie zum Beispiel Datum des Fundes und was für eine Störung beobachtet wurde. | |||
=== Zuordnung === | === Zuordnung === | ||
Zeile 171: | Zeile 221: | ||
IP zu MAC lässt sich über Ping + ip -4/-6 neigh zuordnen. | IP zu MAC lässt sich über Ping + ip -4/-6 neigh zuordnen. | ||
Die in der Hood sichtbaren Gateways können mit folgendem Befehl angezeigt werden. Außer dem Partner-Gateway sollte dort kein weiterer Eintrag erscheinen, wenn alles gut ist. | |||
<pre> | |||
batctl -m <batX> gwl | |||
</pre> | |||
Manchmal ist schon der "Next Hop" der Verursacher (wenn es kein Gateway ist), sonst kann es helfen die Batman-Traceroutes der verdächtigen Verbindungen zu vergleichen. | |||
<pre> | |||
batctl -m <batX> traceroute <MAC-Adresse> | |||
</pre> | |||
== Mit globaler Blacklist arbeiten == | |||
Mit der globalen Blacklist kannst du alle gemeldeten Router sperren die gerade bekannt sind. | |||
Hierunter fallen eigentlich nur Router welche das Netz massiv stören und wo der Fehler nicht abgestellt werden kann. | |||
Jetzt legt ihr noch einen Cronjob an, um die Blacklist aus dem vorherigen Abschnitt automatisch von einem zentraleren Server aktualisieren zu lassen: | |||
<pre> | |||
#Load fastd blacklist | |||
*/5 * * * * wget -O /etc/fastd/key.blacklist https://fff.itstall.de/blocklist.php?cron=1 2>&1 | |||
</pre> | |||
fastd muss bei aktualisieren der blacklist file neu geladen oder neu gestartet (aktuell unklar) werden. | |||
== Mit Whitelist arbeiten == | |||
Hier können nur explizit freigegebene Router die Hood betreten | |||
'''ACHTUNG''' | |||
'''Die folgende Beschreibung sollte keinesfalls ohne Rücksprache mit der Community bei dem zentralen Keyxchange umgesetzt werden, da es dort zu unvorhersehbaren Problemen kommen kann''' | |||
In der fastd.conf muss folgende Zeile geändert werden (anstelle "hood1" den Namen des fastd-Hoodordners angeben): | |||
<pre> | |||
on verify "/etc/fastd/fastd-keylist.sh hood1 $PEER_KEY"; | |||
</pre> | |||
Das Script fastd-keylist.sh kann so aussehen (durch die $hood-Variable kann dasselbe Skript für mehrere Hoods verwendet werden): | |||
<pre> | |||
#!/bin/bash | |||
hood=$1 | |||
key=$2 | |||
if grep -q "$key" /etc/fastd/$hood/whitelist.key; then | |||
exit 0; | |||
else | |||
exit 1; | |||
fi | |||
</pre> | |||
in der whitelist.key müssen dann alle Keys eingefügt werden, welche die Hood betreten dürfen. Ein neuer Key kann ohne fastd restart hinzugefügt werden, wird ein key entfernt bleibt der Router allerdings bis zu einem fastd restart (evtl. reicht reload?) verbunden. Um die whitelist.key zwischen mehreren Servern zu synchronisieren kann z.b. ein Git verwendet werden. | |||
Das auslesen des Keys aus einem Router kann folgendermaßen geschehen: | |||
<pre> | |||
echo "secret \"$(uci get fastd.fff.secret)\";" > /tmp/sec && fastd --show-key -c /tmp/sec | |||
</pre> | |||
Achtung der Router muss dazu schon irgendwohin eine fastd Verbindung aufgebaut haben. Internet an WAN stecken und 5 Minuten warten sollte reichen. | |||
Achtung der Key ist nicht updatefest und ändert sich nach einem Update. Er muss dann neu in der list.key hinzugefügt werden |
Aktuelle Version vom 19. Oktober 2021, 01:37 Uhr
Funktion
fastd ist eine Möglichkeit die Freifunk Knoten per Tunnel mit dem Gateway zu verbinden.
fastd wird bei uns Punkt-zu-Multipunkt (PtMP) verwendet, daher wird am Server nur ein Interface für alle Clients einer Hood benötigt.
fastd wird komplett anders als früher konfiguriert.
Das früher nötige Verwaltungsscript darf KEINESFALLS(!!) ausgeführt werden, auch der Cronjob ist nicht mehr nötig. Falls die IP des Gateways noch im alten KeyXchange eingetragen ist, sollte sie unbedingt entfernt werden (KeyXchange Admin fragen)
Installation
fastd kann aus den Paketquellen installiert werden
Debian:
apt install fastd
Konfiguation
fastd
Für jede Hood muss eine eigene fastd Konfiguration in einem eigenen Unterordner in /etc/fastd/<hoodname>/fastd.conf angelegt werden.
Die Konfiguration sollte etwa so aussehen:
# Log errors to stderr log level error; # Log warnings to a log file log to syslog as "fastd-nuernberg" level warn; # Set the interface name interface "fastd-nuernberg"; # Disable encryption method "null"; # Bind to any IPv4 and IPv6 address with a fixed port bind any:10004; # fastd needs a key despite the disabled encryption. generate with "fastd --generate-key" # # Der öffentliche Schlüssel für die KeyXchange Admins kann # mit "fastd -c /etc/fastd/<hoodname>/fastd.conf --show-key" angezeigt werden. secret "c00a286249ef5dc5506945f8a3b413c0928850214661aab866715203b4f2e86a"; # See https://fastd.readthedocs.io/en/v18/manual/mtu.html # Must not be changed! It has to be the same for both server and all clients. mtu 1426; # Skript starten, sobald fastd Interface angelegt ist. Damit wird es zu batman hinzugefügt. on up "/etc/fastd/up.sh"; on down "/etc/fastd/down.sh"; # Deprecated and has no effect with fastd v19 secure handshakes no; on verify "/etc/fastd/verify.sh";
/etc/fastd/down.sh
#!/bin/sh /sbin/ifdown $INTERFACE
/etc/fastd/up.sh
#!/bin/sh /sbin/ifup $INTERFACE
/etc/fastd/verify.sh
#!/bin/sh return 0
Die Skripte müssen ausführbar gemacht werden:
chmod +x /etc/fastd/*.sh
fastd ifupdown
Zudem muss eine passende ifupdown Interfacekonfiguration angelegt werden, die das fastd-Interface zu batman-adv hinzufügt.
(vgl. Freifunk-Gateway_aufsetzen/Batman-adv#Konfiguration)
# Fastd Interface iface fastd-nuernberg inet manual pre-up batctl -m bat-nuernberg if add $IFACE post-down batctl -m bat-nuernberg if del $IFACE up ip link set up $IFACE down ip link set down $IFACE
Hinweis: Die MTU des fastd Interfaces darf nicht verstellt (vergrößert) werden, diesbezügliche Laufzeitmeldungen von batman_adv müssen ignorieret werden. Weil durch das Internet nur 1500 Byte MTU durchpassen und man daher den Tunnel nicht größer machen kann, bleiben für batman-adv leider nur 1500 - $Tunneloverhead Bytes übrig.
fastd Dienst
Dann muss für jede Hood der fastd-Dienst aktiviert und gestartet werden.
systemctl enable fastd@<hoodname> systemctl start fastd@<hoodname>
Testen der Konfiguration
nachdem der Service gestartet ist, sollte mit
ip -c link show
Sowohl das Batman als auch das VPN Interface zu sehen sein.
fastd socket
fastd bietet die Möglichkeit den Status über einen Socket abzufragen.
Dazu in der Konfigurationsdatei folgende Zeile einfügen:
status socket "/run/fastd-HOOD.sock";
Mit netcat kann man die Daten daraus abfragen. Es wird das Paket nc.openbsd benötigt. netcat6 (braucht man für den babelsocket) und nc.traditional können nicht aus Unix-sockets lesen.
nc -U /run/fastd-HOOD.sock
JSON-Parser
Mit dem Tool jq (apt install jq) kann das json geparsed werden.
Suche nach einem Key
nc -U /run/fastd-HOOD.sock | jq . | grep -A35 1f5111cfa36b11
Anzeigen der Adressen aller aktuell verbundenen Clients
nc -U /run/fastd-HOOD.sock | jq .peers[].address
Script um über alle Sockets nach einer Mac Adresse zu suchen
Hierfür wird jedoch vorausgesetzt das alle Sockets unter /run/ liegen, mit fastd beginnen sowie mit .sock enden.
for file in /run/fastd*.sock do echo $file nc -U $file | jq -r '.peers | keys[] as $k | "\(.[$k] | .connection.mac_addresses[]) \(.[$k] | .address) \($k)"' | grep $1 done
Aufgerufen werden kann das Script mit ./fastd_cat.sh 11:22:33:44:55:66
Einzelne Router sperren
Folgende Variablen sind in der fastd config verfügbar:
- LOCAL_ADDRESS: the local IP address
- LOCAL_PORT: the local UDP port
- PEER_ADDRESS: the peer’s IP address
- PEER_PORT: the peer’s UDP port
- PEER_NAME: the peer’s name in the local configuration
- PEER_KEY: the peer’s public key
In der fastd.conf folgende Zeile ändern:
on verify "/etc/fastd/blacklist.sh $PEER_KEY $PEER_ADDRESS";
Folgende Datei anlegen: /etc/fastd/blacklist.sh
#!/bin/sh key=$1 addr=$2 timestamp() { date +"%Y-%m-%d %H:%M:%S" } if grep -q "$key" /etc/fastd/key.blacklist; then echo "$(timestamp)\t$key\t$addr\tblocked" >> /var/log/fastd.blacklist; exit 1; else exit 0; fi
Wenn fastd als systemd Dienst eingerichtet ist, kann man die Sperr-Einträge auch einfach an die jeweiligen Logs anhängen; dafür muss statt in eine Log-Datei einfach in stdout/stderr geschrieben werden. Dies hat insbesondere den Vorteil, dass bei mehreren Sperren die Log-Einträge den Hoods zugeordnet werden:
#!/bin/sh key=$1 addr=$2 if grep -q "$key" /etc/fastd/key.blacklist; then echo "Blocked by keylist: $addr $key" exit 1; else exit 0; fi
Und anschließend ausführbar machen:
chmod a+x /etc/fastd/blacklist.sh
Leere Dateien anlegen:
touch /etc/fastd/key.blacklist touch /var/log/fastd.blacklist
Nun können in der Datei "key.blacklist" die vorher ermittelten problematischen Keys eingetragen werden. Die Formatierung ist egal, es kann beliebiger Text ergänzt werden, wie zum Beispiel Datum des Fundes und was für eine Störung beobachtet wurde.
Zuordnung
IP zu MAC lässt sich über Ping + ip -4/-6 neigh zuordnen.
Die in der Hood sichtbaren Gateways können mit folgendem Befehl angezeigt werden. Außer dem Partner-Gateway sollte dort kein weiterer Eintrag erscheinen, wenn alles gut ist.
batctl -m <batX> gwl
Manchmal ist schon der "Next Hop" der Verursacher (wenn es kein Gateway ist), sonst kann es helfen die Batman-Traceroutes der verdächtigen Verbindungen zu vergleichen.
batctl -m <batX> traceroute <MAC-Adresse>
Mit globaler Blacklist arbeiten
Mit der globalen Blacklist kannst du alle gemeldeten Router sperren die gerade bekannt sind.
Hierunter fallen eigentlich nur Router welche das Netz massiv stören und wo der Fehler nicht abgestellt werden kann.
Jetzt legt ihr noch einen Cronjob an, um die Blacklist aus dem vorherigen Abschnitt automatisch von einem zentraleren Server aktualisieren zu lassen:
#Load fastd blacklist */5 * * * * wget -O /etc/fastd/key.blacklist https://fff.itstall.de/blocklist.php?cron=1 2>&1
fastd muss bei aktualisieren der blacklist file neu geladen oder neu gestartet (aktuell unklar) werden.
Mit Whitelist arbeiten
Hier können nur explizit freigegebene Router die Hood betreten
ACHTUNG
Die folgende Beschreibung sollte keinesfalls ohne Rücksprache mit der Community bei dem zentralen Keyxchange umgesetzt werden, da es dort zu unvorhersehbaren Problemen kommen kann
In der fastd.conf muss folgende Zeile geändert werden (anstelle "hood1" den Namen des fastd-Hoodordners angeben):
on verify "/etc/fastd/fastd-keylist.sh hood1 $PEER_KEY";
Das Script fastd-keylist.sh kann so aussehen (durch die $hood-Variable kann dasselbe Skript für mehrere Hoods verwendet werden):
#!/bin/bash hood=$1 key=$2 if grep -q "$key" /etc/fastd/$hood/whitelist.key; then exit 0; else exit 1; fi
in der whitelist.key müssen dann alle Keys eingefügt werden, welche die Hood betreten dürfen. Ein neuer Key kann ohne fastd restart hinzugefügt werden, wird ein key entfernt bleibt der Router allerdings bis zu einem fastd restart (evtl. reicht reload?) verbunden. Um die whitelist.key zwischen mehreren Servern zu synchronisieren kann z.b. ein Git verwendet werden.
Das auslesen des Keys aus einem Router kann folgendermaßen geschehen:
echo "secret \"$(uci get fastd.fff.secret)\";" > /tmp/sec && fastd --show-key -c /tmp/sec
Achtung der Router muss dazu schon irgendwohin eine fastd Verbindung aufgebaut haben. Internet an WAN stecken und 5 Minuten warten sollte reichen. Achtung der Key ist nicht updatefest und ändert sich nach einem Update. Er muss dann neu in der list.key hinzugefügt werden