Freifunk-Gateway aufsetzen/VPN/fastd: Unterschied zwischen den Versionen

Aus Freifunk Franken
Wechseln zu:Navigation, Suche
(25 dazwischenliegende Versionen von 6 Benutzern werden nicht angezeigt)
Zeile 18: Zeile 18:
== Konfiguation ==
== Konfiguation ==


In diesem Beispiel sind wir das Gateway "ffffuerthVPN".
=== fastd ===
Für jede Hood muss eine eigene fastd Konfiguration in einem eigenen Unterordner in '''/etc/fastd/<hoodname>/fastd.conf''' angelegt werden.


Es ergibt Sinn für jede Hood einen eigenen Unterordner in ''/etc/fastd/[Deine Hood]'' anzulegen!
Die Konfiguration sollte etwa so aussehen:
 
 
/etc/fastd/[ffffuerthVPN]/fastd.conf
<pre>
<pre>
# Log errors to stderr
# Log errors to stderr
Zeile 29: Zeile 27:


# Log warnings to a log file
# Log warnings to a log file
log to syslog as "ffffuerthVPN" level warn;
log to syslog as "fastd-nuernberg" level warn;


# Set the interface name
# Set the interface name
interface "ffffuerthVPN";
interface "fastd-nuernberg";


# Disable encryption
# Disable encryption
method "null";
method "null";


# Bind to a fixed port
# Bind to any IPv4 and IPv6 address with a fixed port
bind any:10004 default ipv6;
bind any:10004;


# fastd needs a key: generate by "fastd --generate-key"
# fastd needs a key despite the disabled encryption. generate with "fastd --generate-key"
# private 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";
secret "c00a286249ef5dc5506945f8a3b413c0928850214661aab866715203b4f2e86a";
# to show the public key for the keyxchange Admin use:
# fastd -c /etc/fastd/bla/bla.conf --show-key


# Set the interface MTU for TAP mode with xsalsa20/aes128 over IPv4 with a base MTU of 1492 (PPPoE)
# See https://fastd.readthedocs.io/en/v18/manual/mtu.html
# (see MTU selection documentation)
# Must not be changed! It has to be the same for both server and all clients.
mtu 1426;
mtu 1426;


on up "/etc/fastd/[ffffuerthVPN]/up.sh";
# Skript starten, sobald fastd Interface angelegt ist. Damit wird es zu batman hinzugefügt.
on down "/etc/fastd/[ffffuerthVPN]/down.sh";
on up "/etc/fastd/up.sh";
on down "/etc/fastd/down.sh";


secure handshakes no;
secure handshakes no;


on verify "/etc/fastd/[ffffuerthVPN]/verify.sh";
on verify "/etc/fastd/verify.sh";
</pre>
</pre>




/etc/fastd/[ffffuerthVPN]/down.sh
/etc/fastd/down.sh
<pre>
<pre>
#!/bin/sh
#!/bin/sh
Zeile 66: Zeile 65:




/etc/fastd/[ffffuerthVPN]/up.sh
/etc/fastd/up.sh
<pre>
<pre>
#!/bin/sh
#!/bin/sh
Zeile 73: Zeile 72:




/etc/fastd/[ffffuerthVPN]/verify.sh  
/etc/fastd/verify.sh
<pre>
<pre>
#!/bin/sh
#!/bin/sh
Zeile 80: Zeile 79:




danach:
Die Skripte müssen ausführbar gemacht werden:
<pre>
chmod +x /etc/fastd/*.sh
</pre>
 
=== fastd ifupdown ===
Zudem muss eine passende ifupdown Interfacekonfiguration angelegt werden, die das fastd-Interface zu batman-adv hinzufügt.</br>
(vgl. [[Freifunk-Gateway_aufsetzen/Batman-adv#Konfiguration]])
<pre>
# 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
</pre>
 
<i>Hinweis:</i> 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.
<br>
 
=== fastd Dienst ===
Dann muss für jede Hood der fastd-Dienst aktiviert und gestartet werden.
<pre>
systemctl enable fastd@<hoodname>
systemctl start fastd@<hoodname>
</pre>
 
== Testen der Konfiguration ==
 
nachdem der Service gestartet ist, sollte mit
<pre>
ip -c link show
</pre>
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:
<pre>
status socket "/run/fastd-HOOD.sock";
</pre>
 
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>
nc -U /run/fastd-HOOD.sock
</pre>
 
=== JSON-Parser ===
Mit dem Tool jq (apt install jq) kann das json geparsed werden.
 
==== Suche nach einem Key ====
<pre>
nc -U /run/fastd-HOOD.sock | jq . | grep -A35 1f5111cfa36b11
</pre>


Scripte ausführbar machen:
==== Anzeigen der Adressen aller aktuell verbundenen Clients ====
<pre>
<pre>
chmod +x /etc/fastd/[Deine-Hood]/*.sh
nc -U /run/fastd-HOOD.sock | jq .peers[].address
</pre>
</pre>
Dienst aktivieren und starten (ohne ".service")
 
==== 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>
<pre>
systemctl enable fastd@[Hood]
for file in /run/fastd*.sock
systemctl start fastd@[Hood]
do
        echo $file
        nc -U $file | jq -r '.peers | keys[] as $k | "\(.[$k] | .connection.mac_addresses[]) \(.[$k] | .address) \($k)"' | grep $1
done
</pre>
</pre>
Aufgerufen werden kann das Script mit '''./fastd_cat.sh 11:22:33:44:55:66'''


== Einzelne Router sperren ==
== Einzelne Router sperren ==
Folgende Variablen werden in die fastd config übertragen:
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 101: Zeile 164:
* PEER_KEY: the peer’s public key
* PEER_KEY: the peer’s public key


Diese können am on-verify angehangen werden z.b.:
In der fastd.conf folgende Zeile ändern:
<pre>
<pre>
on verify "/etc/fastd/fff.bat3/fastd-blacklist.sh $PEER_KEY $PEER_ADDRESS";
on verify "/etc/fastd/blacklist.sh $PEER_KEY $PEER_ADDRESS";
</pre>
</pre>
das fastd-blacklist.sh kann dann z.b. so aussehen:
 
Folgende Datei anlegen: /etc/fastd/blacklist.sh
<pre>
<pre>
#!/bin/bash
#!/bin/sh
echo $1 >> /tmp/bla
 
echo $2 >> /tmp/bla
key=$1
if [ $1 == xxx ]; then
addr=$2
  exit 1
 
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
else
  exit 0
        exit 0;
fi
fi
</pre>
</pre>


Somit erhält man in /tmp/bla eine File mit fastd keys (die man leider zu gar nix zuordnen kann und daher auch keine bösen Router darüber finden kann) und eine Reihe IP Adressen die man leider auch zu keinen Router zu ordnen kann.
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:
Wenn man nun einen bösen Router im fastd sperren will, kann man nun einzeln die IPs per iptables vom Server sperren und im Batman gucken ob er weg ist. Alles unschön aber einen besseren Weg hab ich bisher nicht gefunden. $PEER_NAME ist leider leer und kann auch für nichts verwendet werden...
<pre>
Allgemein ist das Problem, das man eine Batman-adv MAC nirgens zu einer fastd MAC oder irgendwas zuordnen kann. Daher ist aktuell der einzige Weg ausprobieren...
#!/bin/sh
mit exit != 0 kann man Router auch direkt im fastd sperren, dies erledigt das Script auch, wenn man xxx durch den Routerkey anpasst
 
key=$1
addr=$2


== Testen der Konfiguration ==
if grep -q "$key" /etc/fastd/key.blacklist; then
        echo "Blocked by keylist: $addr $key"
        exit 1;
else
        exit 0;
fi
</pre>
 
Und anschließend ausführbar machen:
<pre>
chmod a+x /etc/fastd/blacklist.sh
</pre>


nachdem der Service gestartet ist, sollte mit
Leere Dateien anlegen:
<pre>
<pre>
ip -c link show
touch /etc/fastd/key.blacklist
touch /var/log/fastd.blacklist
</pre>
</pre>
Sowohl das Batman als auch das VPN Interface zu sehen sein.


== fastd socket ==
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.
<pre>
batctl -m <batX> gwl
</pre>


fastd bietet die Möglichkeit den Status über einen Socket abzufragen.
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.


Dazu in der Konfigurationsdatei folgende Zeile einfügen:
<pre>
<pre>
status socket "/run/fastd-HOOD.sock";
batctl -m <batX> traceroute <MAC-Adresse>
</pre>
</pre>
In den Sources unter doc/examples/ findet man ein kleines Perlskript status.pl, mit dem man das Socket auslesen kann.  
 
== 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>
<pre>
#!/usr/bin/perl -w
#Load fastd blacklist
*/5 * * * * wget -O /etc/fastd/key.blacklist https://fff.itstall.de/blocklist.php?cron=1 2>&1
</pre>


use strict;
fastd muss bei aktualisieren der blacklist file neu geladen oder neu gestartet (aktuell unklar) werden.


use IO::Socket::UNIX qw( SOCK_STREAM );
== Mit Whitelist arbeiten ==


$ARGV[0] or die("Usage: status.pl <socket>\n");
Hier können nur explizit freigegebene Router die Hood betreten


my $socket = IO::Socket::UNIX->new(
'''ACHTUNG'''
  Type => SOCK_STREAM,
  Peer => $ARGV[0],
)
  or die("Can't connect to server: $!\n");


foreach my $line (<$socket>) {
'''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'''
print $line;
 
}
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>
</pre>


Mit dem tool jq (apt install jq) Kann man sich die Ausgabe leserlich anzeigen lassen und im json suchen.
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:


Beispiel; Suche nach einem Key:
<pre>
<pre>
status.pl /run/fastd-HOOD.sock | jq . | grep -A35 1f5111cfa36b11
echo "secret \"$(uci get fastd.fff.secret)\";" > /tmp/sec && fastd --show-key -c /tmp/sec
</pre>
</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

Version vom 13. Januar 2020, 15:26 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";

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