====== Gateway Installationsanleitung für Debian 12 ======
Diese Anleitung soll zeigen wie ein Gateway unter Debian 12 installiert wird. Die Anleitung basiert auf der [[gateway_installation|alten Anleitung zur Installation unter Debian 9]]. Der Teufel liegt allerdings oft im Detail, und über die Debian Versionen haben sich manche Details geändert.
**!!! WORK IN PROGRESS !!!**
Die anleitung geht davon aus das wir bereits mit root rechten unterwegs sind.
Die wichtigsten Pakete aus den Paketquellen installieren.
apt-get install isc-dhcp-server radvd bridge-utils iptables-persistent libcap2-bin haveged ntp incron sudo vnstat vnstati bind9 lsb-release sysstat iotop rsync
Zusätzlich brauchen wir noch einen http Server. Falls nur gateway betrieb gewünscht ist, und sonst nichts übers web gemacht wird, genügt lighttpd. ''apt-get install lighttpd''
Wenn noch andere Webtools genutzt werden sollen, empfiehlt sich Apache2 ''apt-get install apache2''
In dieser Anleitung wird öfters auf das Netzwerk Interface ''enp0s1'' verwiesen. Je nach Server kann die genaue Bezeichnung jedoch variieren. Prüfe vorab mit ''ip a'' wie das Interface bei dir heißt, und passe die Konfigurationen entsprechend an.
===== NTP =====
[[ntp|Zeitservice]] (NTP) auf spezielle Schnittstellen beschränken
Bearbeite die Datei ''/etc/ntp.conf'' und füge folgende zeilen hinzu.
interface listen lo
interface listen enp0s1
interface listen br-ffpi
===== Routing =====
Siehe auch [[Routing]]
[...]
42 freifunk
===== Alfred =====
Daten für die Karte (Meshviewer) bereitstellen (alfred-announced)
mkdir /etc/alfred
Beispielhafte json Datei, bitte Werte entsprechend anpassen.
{
"node": {
"node_id": "gate03",
"hostname": "Thesdorfer Tor",
"location": {
"longitude": "11.612279",
"latitude": "50.949691"
},
"owner": {
"contact": "Havelock"
},
"system": {
"site_code": "ffpi",
"role": "gate"
}
},
"statistics": {
"node_id": "gate03"
}
}
===== Mesh-VPN mit fastd =====
Fastd kann aus den Paketen von Debian installiert werden.
''apt-get install fastd''
==== Konfigurationsschritte ====
Nutzer für fastd anlegen
adduser --system --group --uid 300 --shell /bin/sh --disabled-password --gecos 'Fast and Secure Tunneling Daemon' --no-create-home --home /etc/fastd fastd
Ordner und blanko Dateien für SSH anlegen
mkdir /etc/fastd
mkdir /etc/fastd/.ssh
chmod 700 /etc/fastd/.ssh
touch /etc/fastd/.ssh/authorized_keys
chmod 600 /etc/fastd/.ssh/authorized_keys
fastd Verzeichnisstruktur erstellen
mkdir -p /etc/fastd/ffpi/peers
mkdir /etc/fastd/ffpi/backbone
chown -R fastd:fastd /etc/fastd
fastd keys generieren
fastd --generate-key > /etc/fastd/keys
chmod 600 /etc/fastd/keys
Nun die Konfiguration für fastd erstellen.
log level warn;
log to syslog level info;
interface "mesh-vpn";
method "salsa2012+umac";
method "salsa2012+gmac";
bind 0.0.0.0:10000;
include "secret.conf";
secure handshakes yes;
mtu 1426;
user "fastd";
group "fastd";
hide ip addresses yes;
hide mac addresses yes;
include peers from "backbone";
include peers from "peers";
peer limit 200;
status socket "/var/run/fastd/ffpi.sock";
on up "
# ip link set dev $INTERFACE address
ip link set up dev $INTERFACE
/usr/sbin/batctl if add $INTERFACE
";
Die auskommentierte Zeile mit der Fehlenden MAC-Adresse lassen wir für den ersten Start so. fastd generiert dann selber eine MAC-Adresse welche wir im späteren verlauf dann dort eintragen.
Da wir in der fastd.conf die Zeile ''include "secret.conf";'' haben, müssen wir diese Datei noch erstellen.
Dazu lesen wir zuerst die Keys aus der ''/etc/fastd/keys'' Datei aus. Wir benötigen vorerst nur den Secret.
cat /etc/fastd/keys
Danach können wir die Datei dann wie folgt erstellen (* bitte durch echten Secret ersetzen)
secret "****************************************";
Damit fastd die ebenfalls oben konfigurierte socket Datei anlegen kann, müssen wir noch dafür sorgen das der Ordner existiert, und fastd dort schreiben darf.
mkdir -p /var/run/fastd/
chown fastd:fastd /var/run/fastd/
Damit wir nach dem anlegen neuer Peers nicht jedes mal manuell fastd neu laden müssen, überwachen wir den Ordner mit incron.
/etc/fastd/ffpi/peers IN_CREATE pkill -HUP fastd
In der Standard Konfigurationen muss man fastd sagen welche Konfiguration geladen werden soll, wir ändern es so das einfach alle Konfigurationen geladen werden.
In der Datei ''/etc/default/fastd'' ändern wir ''AUTOSTART="none"'' zu ''AUTOSTART="all"''
# This is the configuration file for /etc/init.d/fastd
#
# This configuration file is DEPRECATED! Please set autostart to "none" in
# this file and use the instanced systemd unit fastd@.service
#
#
# Start only these VPNs automatically via init script.
# Allowed values are "all", "none" or space separated list of
# names of the VPNs. If empty, "all" is assumed.
#
AUTOSTART="all"
Nun können wir den fastd service noch automatisch beim booten starten lassen.
systemctl enable fastd
===== ffpi-tools =====
Die [[ffpi-tools|ffpi-tools]] sind eine kleine Sammlung von Scripten welche das administrieren eines Gateways vereinfachen sollen.
[[https://github.com/freifunk-pinneberg/ffpi-tools]]
wir clonen das Repository
git clone https://github.com/freifunk-pinneberg/ffpi-tools.git ~/ffpi-tools
Nun am besten durch alle Scripte gucken, ob das soweit plausibel aussieht. Für ffgate-check sollte in Zeile 18 bei TESTIP die IP eines anderen aktiven Gateways eingetragen werden.
Wenn alles passt können wir die Tools installieren.
~/ffpi-tools/install-tools.sh
===== A.L.F.R.E.D =====
//A.L.F.R.E.D - Almighty Lightweight Fact Remote Exchange Daemon//
Mit alfred tauschen die Knoten (und Gateways) allgemeine Informationen aus. Einige der Daten sind im Meshviwer sichtbar.
Wir installieren alfred einfach aus den Paketquellen.
apt-get install alfred
Spezielle Gatewaydaten für [[Alfred]] bereitstellen. Das Programm alfred-announce.py muss zuvor natürlich auf dem Gateway eingespielt worden sein, es ist teil der oben genannten ffpi-tools.
Voraussetzung:
apt-get install python-daemon ethtool
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
*/2 * * * * root /usr/local/bin/alfred-announce.py
===== B.A.T.M.A.N. =====
B.A.T.M.A.N., kurz für "Better Approach To Mobile Adhoc Networking", ist ein Mesh-Protokoll für Layer-2-Netzwerke, das sowohl für stationäre Systeme funktioniert als auch Funktionen wie Knoten-zu-Knoten- und Knoten-zu-Netz-Verbindungen, VLAN-Bridging über Mesh-Netzwerke und Robustheit gegenüber Topologieänderungen bietet, jedoch keine Verschlüsselung oder Authentifizierung bereitstellt.
Wir nutzen die etwas neuere batman-adv Variante welche im Kernel läuft.
batman-adv wird mit dem Kommando batctl gesteuert. Das muss entsprechend installiert werden.
apt-get install batctl
===== Netzwerkkonfiguration =====
Die folgende Datei muß mit den jew. eigenen Adressen konfiguriert werden. Dieses Beispiel ist von gate03 abgeleitet. Solange batadv-vis und alfred noch nicht konfiguriert sind, sollten die beiden betreffenden Zeilen auskommentiert werden.
''enp0s1'' muss gegebenefalls durch das korrekte physische interface ausgetauscht werden. Mittels ''ip a'' kann man sich alle verfügbaren Interfaces anzeigen lassen.
auto lo enp0s1
iface lo inet loopback
iface enp0s1 inet static
address 91.143.81.176
netmask 255.255.255.0
broadcast 91.143.81.255
gateway 91.143.81.1
iface enp0s1 inet6 static
address 2a02:0180:1:1::5b8f:51b0
netmask 64
gateway 2a02:0180:1:1::1
# Freifunk Pinneberg Bridge-Interface (IPv4 und IPv6)
# - bridge_ports none sorgt dafür, daß die Brücke auch ohne Interface erstellt wird
auto br-ffpi
iface br-ffpi inet6 static
bridge-ports none
address fde8:21c6:9d82::0c01
netmask 64
iface br-ffpi inet static
address 10.137.12.1
netmask 255.255.0.0
# BATMAN Interface
allow-hotplug bat0
iface bat0 inet6 manual
pre-up modprobe batman-adv
pre-up batctl if add mesh-vpn
up ip link set $IFACE up
post-up brctl addif br-ffpi $IFACE
post-up batctl it 10000
post-up batctl gw_mode server 1000mbit/1000mbit
post-up /sbin/ip rule add from all fwmark 0x1 table 42
post-up start-stop-daemon -b --start --exec /usr/local/sbin/batadv-vis -- -i $IFACE -s
post-up start-stop-daemon -b --start --exec /usr/local/sbin/alfred -- -i br-ffpi -b $IFACE
pre-down /sbin/ip rule del from all fwmark 0x1 table 42
pre-down brctl delif br-ffpi $IFACE || true
down ip link set $IFACE down
Firewall initialisieren. Die NAT-Regel für das Exit-VPN wird von den
Pinneberger up- und down-Scripten aus der OpenVPN-Konfiguration gesteuert
und ist deshalb an dieser Stelle entfallen.
Alle eingehenden Pakete auf dem Interface br-ffpi mit dem Wert 0x1 markieren.
iptables -t mangle -A PREROUTING -i br-ffpi -j MARK --set-xmark 0x1/0xffffffff
cd /etc/iptables
iptables-save > rules.v4
TODO Wofür ist die markierung?
[...]
# Freifunk specific settings
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.bridge.bridge-nf-call-arptables = 0
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.all.autoconf = 0
net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.enp0s1.autoconf = 0
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0
net.ipv6.conf.enp0s1.accept_ra = 0
Neuladen mit ''sysctl -p''
/sbin/ip route add unreachable default table freifunk
/sbin/ip rule add from all fwmark 0x1 table freifunk
exit 0
===== Exit-VPN (OpenVPN) =====
Über das Exit-VPN wird der Traffic der Clients ins Internet ausgeleitet.
Dafür wird zumeist [[openvpn|OpenVPN]] genutzt. In diesem Beispiel wird als VPN Provider Mullvad verwendet.
Falls noch nicht geschehen installieren wird OpenVPN aus den Paketquellen
apt-get install openvpn
==== Konfiguration ====
* Der zu verwendende Exit wird in ''/etc/default/openvpn'' festgelegt
* Der dort eingetragene Name kennzeichnet die Konfigurationsdatei unter ''etc/openvpn'', für die zu verwendende Datei wird das Suffix ''.conf'' angehängt
* Jedes ExitVPN wird in einem eigenen Unterverzeichnis verwaltet, unter ''/etc/openvpn'' befinden sich nur Links zu den jew. Konfiguraionsdateien
* Das Land und der Server für das ExitVPN sind von Bedeutung, können jedoch nicht automatisch ermittelt werden. Die passende Stelle für die Erfassung dieser Daten ist die Konfigurtionsdatei für den jeweiligen OpenVPN-Tunnel.
* In der ersten Zeile der Konfigurationsdatei wird das verwendete Land eingetragen. Das ist dann für Scripte auswertbar, z.B. für Alfred. In der zweiten Zeile wird der Name des Servers angegeben.
Wir erstellen eine config für mullvad
**Wichtiger Hinweis:**
Immer sicherstellen, daß in der Konfiguration die Option ''**route-noexec**''
eingestellt ist. Damit wird insbesondere keine Default-Route über das Exit-VPN
gesetzt. Vergißt man die Einstellung und startet die VPN-Verbindung, so schließt
man sich vom Server aus. Dann hilft meistens nur noch Booten in den Rettungsmodus.
## ExitCountry = NL
## ExitServer = NL4
client
dev-type tun
dev mullvad
proto udp
remote no.mullvad.net 1197
cipher AES-256-CBC
resolv-retry infinite
nobind
persist-key
persist-tun
#comp-lzo
verb 3
remote-cert-tls server
ping-restart 60
sndbuf 524288
rcvbuf 524288
fast-io
script-security 2
route-noexec
up /etc/openvpn/exitvpn-up
down /etc/openvpn/exitvpn-down
ping 10
ca /etc/openvpn/mullvad/mullvad_ca.crt
auth-user-pass /etc/openvpn/mullvad/mullvad_userpass.txt
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA
In der Konfiguration wird auf 4 Dateien verwiesen.
* /etc/openvpn/exitvpn-up
* /etc/openvpn/exitvpn-down
* /etc/openvpn/mullvad/mullvad_ca.crt
* /etc/openvpn/mullvad/mullvad_userpass.txt
Die mullvad_ca und mullvad_userpass werden von mullvad bereit gestellt, und sind für jeden vpn zugang individuell.
Das exitvpn-up script sieht wie folgt aus.
#!/bin/bash
# Freifunk Community Pinneberg
# Automatisierung Exit-VPN
ip route replace 0.0.0.0/1 via $4 table freifunk
ip route replace 128.0.0.0/1 via $4 table freifunk
# Prüfe, ob der Parameter angegeben sind. $1 ist der Provider.
# Falls nicht, versuche den Provider aus der Konfiguration zu ermitteln
if [ $# -eq 0 ]; then
VPNCONF=$(grep -e "^AUTOSTART=" /etc/default/openvpn)
PROVIDER=$(sed -e 's/^"//' -e 's/"$//' <<< ${VPNCONF#*=})
else
PROVIDER=$1
fi
# Masquerading Regel überprüfen und ggf. korrigieren
FWRULE=$(iptables --line-numbers -t nat -vnL | grep MASQUERADE | head -n 1 | awk '{$1=$1};1')
NATIF=$(echo "$FWRULE" | cut -d' ' -f 8)
RULENO=$(echo "$FWRULE" | cut -d' ' -f 1)
if [ "$NATIF" != "$PROVIDER" ]; then
logger -t exitvpn[$$] "change firewall interface from '$NATIF' to '$PROVIDER' (rule #$RULENO)"
iptables -t nat -D POSTROUTING $RULENO
iptables -t nat -A POSTROUTING -o $PROVIDER -j MASQUERADE
fi
exit 0
und das exitvpn-down script
#!/bin/bash
# Prüfe, ob Parameter angegeben sind. $1 ist der Provider.
# Falls nicht, versuche den Provider aus der Konfiguration zu ermitteln
if [ $# -eq 0 ]; then
VPNCONF=$(grep -e "^AUTOSTART=" /etc/default/openvpn)
PROVIDER=$(sed -e 's/^"//' -e 's/"$//' <<< ${VPNCONF#*=})
else
PROVIDER=$1
fi
# Masquerading Regel entfernen
FWRULE=$(iptables --line-numbers -t nat -vnL | grep MASQUERADE | head -n 1 | awk '{$1=$1};1')
NATIF=$(echo "$FWRULE" | cut -d' ' -f 8)
RULENO=$(echo "$FWRULE" | cut -d' ' -f 1)
if [ "$NATIF" == "$PROVIDER" ]; then
# TODO logger benutzen
logger -t exitvpn[$$] "removing firewall interface '$NATIF' (rule #$RULENO)"
iptables -t nat -D POSTROUTING $RULENO
fi
exit 0
===== Erster Start =====
Nun fastd starten
systemctl start fastd
und die MAC-Adresse auslesen.
cat /sys/class/net/mesh-vpn/address
Sollte das auslesen fehlschlagen ist dies ein zeichen das fastd nicht die ffpi config geladen hat. Als workaround kann man expliziet mit der Config starten.
systemctl start fastd@ffpi
Sollte es weiterhin fehlschlagen kann man zu debug zwecken fastd auch im vordergrund manuell starten
fastd --config /etc/fastd/ffpi/fastd.conf --log-level debug
Die MAC-Adresse des mesh-vpn-Interfaces kopieren und in die fastd.conf-Datei einbauen.
===== DHCP =====
Wir verwenden den ISC DHCP Server.
apt-get install isc-dhcp-server
mkdir -p /etc/dhcp/static
chgrp fastd /etc/dhcp/static
chmod g+w /etc/dhcp/static
touch /etc/dhcp/static/static.conf
touch /etc/dhcp/static/blacklist.conf
chown fastd:fastd /etc/dhcp/static/*.conf
Beispielkonfiguration für gate04, auf anderen Gateways muss die Konfiguration entsprechend angepasst werden, insbesondere auch die Standardroute und die zu verwendenden DNS-Server.
Infos zu den IP Adressen bieten die Wiki Seite [[netzwerk|netzwerk]].
#
# Configuration file for ISC dhcpd for Debian
#
server-name "gate04";
ddns-update-style none;
default-lease-time 300;
max-lease-time 600;
log-facility local7;
subnet 10.137.0.0 netmask 255.255.0.0 {
authoritative;
option domain-name "ffpi";
pool {
range 10.137.13.10 10.137.13.254;
option routers 10.137.13.1;
}
pool {
range 10.137.10.10 10.137.10.254;
deny all clients;
}
pool {
range 10.137.12.10 10.137.12.254;
deny all clients;
}
pool {
range 10.137.14.10 10.137.14.254;
deny all clients;
}
option domain-name-servers 10.137.13.1, 10.137.10.1, 10.137.12.1;
option ntp-servers 10.137.13.1, 10.137.10.1, 10.137.14.1;
}
include "/etc/dhcp/static/static.conf";
DHCP auf das Bridge-Interface beschränken
[...]
INTERFACES-v4="br-ffpi"
Und wir möchte noch das der DHCP bei änderungen der Konfiguration automatisch neu startet
/etc/dhcp/static IN_CREATE,IN_NO_LOOP /etc/init.d/isc-dhcp-server restart
chmod +x /etc/incron.d/dhcpd
===== DNS =====
TODO
===== Protokollierung =====
===== Statistiken =====
Öffentliche [[statistik|Statistiken]] werden mit ''vnstat'' zusammengestellt. Über einen Webserver können diese direkt per HTTP angesehen werden. Wir haben beides bereits im ersten Schritt dieser Anleitung installiert. Es muss daher nur noch konfiguriert werden.
Log Ordner vorbereiten
mkdir -p /var/log/vnstat
chown vnstat:vnstat /var/log/vnstat
Mittels ''vnstat --iflist'' prüfen ob alle Netzwerk Interfaces vorhanden sind. Falls welche fehlen, diese wie in folgenden Beispielen hinzufügen.
vnstat --add -i bat0
vnstat --add -i br-ffpi
vnstat --add -i mesh-vpn
vnstat --add -i mullvad
Nun kümmern wir uns noch um die Konfigurations- Datei.
öffne ''/etc/vnstat.conf'' in deinem favorisierten Editor und setzte in der Konfigurationsdatei folgende Einstellung
BandwidthDetection 0
MaxBandwidth 1000
1000 steht für 1 Gbit, sollte der Server mehr oder weniger haben sollte auch der Wert entsprechend angepasst werden.
Sollte es in generierten Graphiken zu Problemen mit Umlauten oder Sonderzeichen kommen, kann das setzen eins anderen Encondings helfen. Zum Beispiel
Locale "de_DE.ISO-8859-1"
Nun kommt noch eins von den ffpi-tools zum Einsatz, und zwar ''/usr/local/bin/vnstati.sh''
Das script ruft vnstat und vnstati auf um Bilder zu generieren, und baut dazu eine ganz einfache html Seite.
Prüfe in dem Script den wert ''TARGET'', dieser gibt an wo die Grafiken und das HTML gespeichert werden sollen, und sollte auf den document root des Webservers/vhost zeigen.
''IFACES'' hat möglicherweise noch einen ls befehl zugewiesen, welcher so in neueren vnstat versionen nicht mehr funktioniert. Ersetze es mit ''$(sqlite3 /var/lib/vnstat/vnstat.db "select name from interface where active=1;")''
Beispiel
IFACES=$(sqlite3 /var/lib/vnstat/vnstat.db "select name from interface where active=1;")
TARGET=/var/www/vhosts/gate07.pinneberg.freifunk.net/
Nun möchten wir natürlich noch das die Statistiken auch regelmäßig generiert werden, dazu legen wir einen cron an.
#!/bin/sh
# Gateway Statistiken
/usr/local/bin/vnstati.sh