Freifunk Firmware NRW/Gateway/Grundinstallation

Aus wiki.freifunk.net
Zur Navigation springenZur Suche springen
    Info       Einrichtung       Konfiguration       Häufige Fragen       Unterstützte Geräte       Technische Details       ▼Firmware▼       ▼Gateway▼       Weitere Infos    


    Übersicht       Voraussetzungen       Grundinstallation       Weitere Dienste       Fehleranalyse       Häufige Fehler       Handbuch       InterCity VPN       Community gründen    


Dieser Artikel oder Abschnitt wird gerade bearbeitet. Warte bitte mit Änderungen, bis diese Markierung entfernt ist, oder wende dich an den Bearbeiter, um Bearbeitungskonflikte zu vermeiden.

Dieser Baustein sollte nur für kurze Zeit – in der Regel ein oder wenige Tag(e) – eingesetzt und dann wieder entfernt werden. Kontinuierliche Weiterarbeit am Artikel sollte erkennbar sein. Nach spätestens 24 Stunden ist dieser Baustein wieder zu entfernen, sonst ist er obsolet.

Annahmen für diese Anleitung

  • Netzwerkinterface des Servers $eth z.B. eth0.
  • Servername als $Servername z.B. alpha
  • Die IP von $eth ist $PublicIP z.B. 1.2.3.4 bzw. $PublicIPv6
  • Stadt ist $Stadt z.B. Musterstadt
  • Kürzel der Stadt ist $sd z.B. MS für Musterstadt
  • IP-Bereich ist $IPBereich z.B. 16
  • Subnetzmaske ist $SubnetzMaske z.B. 255.255.0.0
  • NBetzadresse ist $Netzaddresse z.B. 10.0.0.0
  • IP vom Gateway $GatewayIP ist z.B. 10.0.0.1
  • MAC vom Gateway-Interface im Freifunk ist e6:64:e1:dd:e8:60
    Generiert mit MAC-Generator
  • IPv6 Netz ist $IPv6NET z.B. fd11:1111:1111:1234::
  • IPv6 ULA ist $IPv6ULA z.B. fd11:1111:1111:1234::/64

Installation der Software

Nach der Installation von Arch-Linux nach der Anleitung in der Arch-Linux-Wiki wird die, für das Gateway benötigte Software, installiert.

# pacman -S iproute2 base-devel net-tools bird bird6 dhcp radvd bind openvpn haveged bridge-utils tinc


yaourt -S fastd batctl batman-adv


Konfiguration

fastd

Wir erstellen einen Benutzer für fastd
# useradd --system --no-create-home --shell /bin/false fastd


Wir erstellen eine Konfigurationsdatei für fastd
# mkdir -p /var/log/fastd/


# mkdir -p /etc/fastd/$Stadt/nodes


# cd /etc/fastd/$Stadt/


Secret-Key erstellen und den Secret xxx speichern wir in der Datei secret.conf.
# fastd --generate-key


<pre<noinclude></noinclude> style="margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;"># nano secret.conf</pre<noinclude></noinclude>> <pre<noinclude></noinclude> style="margin-top: 0; border-top-style:dashed; padding-top: 0.8em;">secret "xxx"; # Das Secret von 'fastd --generate-key'</pre<noinclude></noinclude>>


fastd.conf erstellen:
<pre<noinclude></noinclude> style="margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;"># nano fastd.conf</pre<noinclude></noinclude>> <pre<noinclude></noinclude> style="margin-top: 0; border-top-style:dashed; padding-top: 0.8em;">bind $PublicIP:15000; bind [$PublicIPv6]:15000; mode tap; interface "ff$sd-mesh-vpn"; log to syslog level error;

  1. log to "/var/log/fastd/$Stadt-vpn.log" level debug; #enable for debug-logging

user "fastd"; method "salsa2012+gmac"; include "secret.conf";

  1. public

mtu 1426; secure handshakes yes;

include peers from "nodes";

on up "

   ip link set up dev $INTERFACE
   batctl -m mesh-$sd if add $INTERFACE
   ip link set up dev mesh-$sd
   batctl -m mesh-$sd it 5000
   batctl -m mesh-$sd nc 0
   batctl -m mesh-$sd dat 1
   echo '120' > /sys/class/net/mesh-$sd/mesh/hop_penalty
   ip rule add iif freifunk-$sd lookup 42
   brctl addif freifunk-$sd mesh-$sd

";

on down "

   sudo /usr/bin/brctl delif freifunk-$sd mesh-$sd
   sudo /usr/bin/batctl -m mesh-$sd if del $INTERFACE

";</pre<noinclude></noinclude>>


Nun erstellen wir im Verzeichnis nodes die Serverdatei $Servername.server und tragen dort ein:
<pre<noinclude></noinclude> style="margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;"># nano nodes/$Servername.server</pre<noinclude></noinclude>> <pre<noinclude></noinclude> style="margin-top: 0; border-top-style:dashed; padding-top: 0.8em;">key "yyy"; #public key remote [$ipv6]:15000; remote $ipv4:15000;</pre<noinclude></noinclude>>


Zum automatischen Start wird fastd nun noch per systemctl aktiviert:

# systemctl enable fastd@$Stadt


BATMAN

Wir fügen der Datei modules.conf das Batman-Modul an.
# echo 'batman-adv' >> /etc/modules-load.d/modules.conf


systemd-networkd

Nun kümmern wir uns um die Netzwerkgeräte die wir für unser Gateway benötigen. Zuerst definieren wir für ensN, im Beispiel ens3, eine fixe IP, damit diese nicht beim booten per DHCP bezogen werden muss. Die IP von ens3, sowie die Subnetzmaske finden wir per ifconfig, das Gateway per route.

Wir versichern uns das systemd-networkd gestartet wird via

# systemctl enable systemd-networkd.service


<pre<noinclude></noinclude> style="margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;"># nano /etc/systemd/network/10-ens3.network</pre<noinclude></noinclude>> <pre<noinclude></noinclude> style="margin-top: 0; border-top-style:dashed; padding-top: 0.8em;">[Match] Name=ens3 [Network] Address=xx.xx.xx.xx/nn Gateway=xx.xx.xx.xx DNS=127.0.0.1 DNS=::1 Address=xyz:xyz:xyz:xyz::n/64 Gateway=fe80::1 [Route] Gateway=xx.xx.xx.xx</pre<noinclude></noinclude>>


Nun deaktivieren wir den DHCP-Client Daemon mit einem der beiden folgenden Kommandos:

# systemctl disable dhcpcd


# systemctl disable dhcpcd@ens3


Wir setzen vorübergehend 8.8.8.8 als Nameserver... <pre<noinclude></noinclude> style="margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;"># nano /etc/resolv.conf</pre<noinclude></noinclude>> <pre<noinclude></noinclude> style="margin-top: 0; border-top-style:dashed; padding-top: 0.8em;">nameserver 8.8.8.8</pre<noinclude></noinclude>>


<pre<noinclude></noinclude> style="margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;"># nano /etc/systemd/network/freifunk-$sd.netdev</pre<noinclude></noinclude>> <pre<noinclude></noinclude> style="margin-top: 0; border-top-style:dashed; padding-top: 0.8em;"> [NetDev] Name=freifunk-gro.netdev Kind=bridge </pre<noinclude></noinclude>>


<pre<noinclude></noinclude> style="margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;"># nano /etc/systemd/network/20-freifunk-$sd.network</pre<noinclude></noinclude>> <pre<noinclude></noinclude> style="margin-top: 0; border-top-style:dashed; padding-top: 0.8em;"> [Match] Name=freifunk-gro [Network] Address=$GatewayIP/$IPBereich Address=$IPv6NETc01/64 </pre<noinclude></noinclude>>


<pre<noinclude></noinclude> style="margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;"># nano /etc/network.d/mesh-$sd</pre<noinclude></noinclude>> <pre<noinclude></noinclude> style="margin-top: 0; border-top-style:dashed; padding-top: 0.8em;">CONNECTION='ethernet' DESCRIPTION='mesh-$sd' INTERFACE='mesh-$sd' PRE_UP=("ip link set address e6:64:e1:dd:e8:60 dev $INTERFACE") IP='static' IPCFG=("addr flush dev $INTERFACE") POST_UP=("brctl addif freifunk-$sd $INTERFACE") PRE_DOWN=("brctl delif freifunk-$sd $INTERFACE || true")</pre<noinclude></noinclude>>


Zusätzlich erstellen wir noch zwei andere benötigte Dateien:

<pre<noinclude></noinclude> style="margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;"># nano /etc/systemd/system/netcfg-freifunk@.service</pre<noinclude></noinclude>> <pre<noinclude></noinclude> style="margin-top: 0; border-top-style:dashed; padding-top: 0.8em;">[Unit] Description=Freifunk mesh networking service for interface %I BindsTo=sys-subsystem-net-devices-%i.device [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/netcfg check-iface %I ExecStop=-/usr/bin/netcfg down %I KillMode=none</pre<noinclude></noinclude>>


<pre<noinclude></noinclude> style="margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;"># nano /etc/udev/rules.d/99-freifunk-netcfg-auto.rules</pre<noinclude></noinclude>> <pre<noinclude></noinclude> style="margin-top: 0; border-top-style:dashed; padding-top: 0.8em;">ACTION=="remove", GOTO="netcfg_auto_end" SUBSYSTEM=="net", KERNEL=="mesh-$sd", TAG+="systemd", ENV{SYSTEMD_WANTS}+="netcfg-freifunk@mesh\x2d$sd.service" LABEL="netcfg_auto_end"</pre<noinclude></noinclude>>


Nun müssen wir noch Konfigurieren welche Interfaces gestartet werden sollen.

<pre<noinclude></noinclude> style="margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;"># nano /etc/conf.d/netcfg</pre<noinclude></noinclude>> <pre<noinclude></noinclude> style="margin-top: 0; border-top-style:dashed; padding-top: 0.8em;"># Enable these netcfg profiles at boot time. # Network profiles are found in /etc/network.d NETWORKS=(eth0 freifunk-$sd) # Specify the name of your wired interface for net-auto-wired #WIRED_INTERFACE="eth0" # Specify the name of your wireless interface for net-auto-wireless #WIRELESS_INTERFACE="wlan0"</pre<noinclude></noinclude>>


# systemctl enable netcfg


Durch die beiden Dateien wird das Netzwerkinterface mesh-ms immer wenn es nötig ist neu konfiguriert.

Es sollte nun ff$sd-mesh-vpn in ifconfig erscheinen.

dhcp

Wir erstellen eine Konfiguration für den ISC-DHCP-Server:

<pre<noinclude></noinclude> style="margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;"># nano /etc/dhcpd.conf</pre<noinclude></noinclude>> <pre<noinclude></noinclude> style="margin-top: 0; border-top-style:dashed; padding-top: 0.8em;"># configuration for server.$Stadt.freifunk.net

ddns-update-style none;

  1. options

server-identifier server; ignore client-updates;

  1. security options

deny declines; one-lease-per-client true;

  1. ignore network boot requests

ignore bootp;

default-lease-time 600; max-lease-time 3600;

authoritative;

log-facility local7;

  1. $Stadt.freifunk.net subnet and dhcp range for server

subnet $Netzaddresse netmask $SubnetzMaske {

 range x.x.0.2 x.x.5.255; //mit $Netzaddresse ersetzen
 option broadcast-address x.x.255.255; //mit $Netzaddresse ersetzen
 option routers $GatewayIP;
 option domain-name "server.town.freifunk.net";
 option domain-name-servers $GatewayIP;
 option ntp-servers $GatewayIP;
 interface freifunk-$sd;

}

  1. example
  1. host examplehost {
  2. hardware ethernet 28:00:02:8D:44:22;
  3. fixed-address x.x.0.24; //mit $Netzaddresse ersetzen
  4. option host-name "examplehost";
  5. </pre<noinclude></noinclude>>

}

Zum automatischen Start wird dhcpd nun noch per systemctl aktiviert:

# systemctl enable dhcpd4


radvd

<pre<noinclude></noinclude> style="margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;"># nano /etc/radvd.conf</pre<noinclude></noinclude>> <pre<noinclude></noinclude> style="margin-top: 0; border-top-style:dashed; padding-top: 0.8em;">interface freifunk-$sd #$Stadt {

   AdvSendAdvert on;
   IgnoreIfMissing on;
   MaxRtrAdvInterval 200;
   prefix $IPv6ULA
   {
   };
   RDNSS $IPv6NETc01
  {
   };

};</pre<noinclude></noinclude>>


Zum automatischen Start wird radvd nun noch per systemctl aktiviert:

# systemctl enable radvd


iptables

Hiermit machen wir Masquerading vom Traffic auf Interface tun-vpn-01.

<pre<noinclude></noinclude> style="margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;"># nano /etc/iptables/iptables.rules</pre<noinclude></noinclude>> <pre<noinclude></noinclude> style="margin-top: 0; border-top-style:dashed; padding-top: 0.8em;">*filter

INPUT ACCEPT [11844:1916189]
FORWARD ACCEPT [0:0]
OUTPUT ACCEPT [6263:1020836]

COMMIT

  • mangle
PREROUTING ACCEPT [174173:29763433]
INPUT ACCEPT [173743:29726484]
FORWARD ACCEPT [0:0]
OUTPUT ACCEPT [95448:18280029]
POSTROUTING ACCEPT [95459:18280541]

COMMIT

  • nat
PREROUTING ACCEPT [516:46790]
INPUT ACCEPT [80:9421]
OUTPUT ACCEPT [48:3433]
POSTROUTING ACCEPT [47:3349]

-A POSTROUTING -o tun-vpn-01 -j MASQUERADE COMMIT</pre<noinclude></noinclude>>


# systemctl enable iptables


Und wir aktivieren das Forwarding im Kernel in dem wir folgende Zeile auf 1 setzen.

<pre<noinclude></noinclude> style="margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;"># nano /etc/sysctl.d/99-sysctl.conf</pre<noinclude></noinclude>> <pre<noinclude></noinclude> style="margin-top: 0; border-top-style:dashed; padding-top: 0.8em;">net.ipv4.ip_forward = 1</pre<noinclude></noinclude>>


OpenVPN

Erstellen eines Systembenutzers für OpenVPN:
# useradd --system --no-create-home --shell /bin/false openvpn


Wir erstellen eine Konfiguration für das VPN-Interface tun-vpn-01.

<pre<noinclude></noinclude> style="margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;"># nano /etc/openvpn/tun-01.conf</pre<noinclude></noinclude>> <pre<noinclude></noinclude> style="margin-top: 0; border-top-style:dashed; padding-top: 0.8em;">client dev tun-vpn-01 dev-type tun

Hole keine Routen vom Server

route-nopull proto udp user openvpn group openvpn remote remote.host.com portnumber cipher AES-128-CBC resolv-retry infinite nobind persist-key persist-tun mute-replay-warnings ca ./tun-01.pem verb 3 auth-user-pass ./tun-01_pass.txt

aktivieren wenn Hoster Kompression unterstützt
comp-lzo

reneg-sec 0 script-security 2

up ./tun-01_up.sh down ./tun-01_down.sh</pre<noinclude></noinclude>>


Wir erstellen das Up-Script:

Hinweis: $5 ist richtig wenn der fünfte Parameter beim Aufruf die Remote-Adresse ist, ist Parameter 5 eine Subnetzmaske muss $4 verwendet werden.

<pre<noinclude></noinclude> style="margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;"># nano /etc/openvpn/tun-01_up.sh</pre<noinclude></noinclude>> <pre<noinclude></noinclude> style="margin-top: 0; border-top-style:dashed; padding-top: 0.8em;">#!/bin/sh ip route replace 0.0.0.0/1 via $5 table 42 ip route replace 128.0.0.0/1 via $5 table 42 exit 0</pre<noinclude></noinclude>>


Wir benötigen kein Downscript.

Wir müssen die Up/Down-Scripte ausführbar machen:

# chmod +x /etc/openvpn/tun-01_up.sh


# chmod +x /etc/openvpn/tun-01_down.sh


In der tun-vpn-01_pass.txt muss der Benutzername und das Passwort hinterlegt werden:
<pre<noinclude></noinclude> style="margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;"># nano /etc/openvpn/tun-01_pass.txt</pre<noinclude></noinclude>> <pre<noinclude></noinclude> style="margin-top: 0; border-top-style:dashed; padding-top: 0.8em;">user password</pre<noinclude></noinclude>>


Zum automatischen Start wird OpenVPN nun noch per systemctl aktiviert:

# systemctl enable openvpn@tun-01


dns

Wir richten bind9 ein nur auf netzinterne Anfragen zu reagieren und alle anderen Anfragen zu ignorieren. Selbst definierte Domains liefert bind9 in der Konfiguration trotzdem ins Internet aus.

<pre<noinclude></noinclude> style="margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;"># nano /etc/named.conf</pre<noinclude></noinclude>> <pre<noinclude></noinclude> style="margin-top: 0; border-top-style:dashed; padding-top: 0.8em;">// // /etc/named.conf // options { directory "/var/named"; pid-file "/run/named/named.pid"; auth-nxdomain yes; datasize default; interface-interval 0; // Uncomment these to enable IPv6 connections support // IPv4 will still work: listen-on-v6 { any; }; // IPv4 listen-on { any; }; ### hiermit kann das selbstständige Auflösen deaktiviert werden #forwarders { 8.8.8.8; 8.8.4.4; }; #forward only; ### // Default security settings. allow-recursion { freifunk; ownserver; }; allow-transfer { none; }; allow-update { none; }; allow-query { any; }; version none; hostname none; server-id none; }; acl freifunk { 127.0.0.1; 10.0.0.0/8; 172.16.0.0/12; 192.168.0.0/16; }; acl ownserver { #hier muss ein zweiter DNS-Server der Zugriff auf die eigenen Definitionen haben darf abgelegt werden xx.xx.xx.xx; }; zone "localhost" IN { type master; file "localhost.zone"; allow-transfer { any; }; }; zone "0.0.127.in-addr.arpa" IN { type master; file "127.0.0.zone"; allow-transfer { any; }; }; zone "." IN { type hint; file "root.hint"; }; ### Beispieldefinition #zone "ms.freifunk.net" { # type master; # file "ms.freifunk.net.zone"; # allow-transfer { ownserver; }; #}; # #zone "musterstadt.freifunk.net" { # type master; # file "musterstadt.freifunk.net.zone"; # allow-transfer { ownserver; }; #}; logging { channel xfer-log { file "/var/log/named.log"; print-category yes; print-severity yes; print-time yes; severity info; }; category xfer-in { xfer-log; }; category xfer-out { xfer-log; }; category notify { xfer-log; }; };</pre<noinclude></noinclude>>


Nun aktivieren wir unseren bind9-Server.

# systemctl enable named


Gateway Check

Hiermit prüft man per Cronjob periodisch ob die OpenVPN-Verbindung funktioniert, wenn nicht startet er diese neu:

<pre<noinclude></noinclude> style="margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;"># nano /usr/local/bin/tun-vpn-01_check.sh</pre<noinclude></noinclude>> <pre<noinclude></noinclude> style="margin-top: 0; border-top-style:dashed; padding-top: 0.8em;">#!/bin/bash INTERFACE=tun-vpn-01 shopt -s nullglob ping -q -I $INTERFACE 8.8.8.8 -c 4 -i 1 -W 5 >/dev/null 2>&1 if test $? -eq 0; then NEW_STATE=server else NEW_STATE=off fi if [ "$NEW_STATE" == "off" ]; then logger "try a restart of openvpn via systemctl" systemctl restart openvpn@tun-01 fi MESH=mesh-$sd OLD_STATE="$(cat /sys/class/net/$MESH/mesh/gw_mode)" [ "$OLD_STATE" == "$NEW_STATE" ] && exit if [ "$NEW_STATE" == "off" ]; then logger "stop dhcpd: uplink dead" systemctl stop dhcpd4 elif [ "$NEW_STATE" == "server" ]; then logger "start dhcpd: uplink ready" systemctl start dhcpd4 fi echo $NEW_STATE > /sys/class/net/$MESH/mesh/gw_mode echo 96MBit/96MBit > /sys/class/net/$MESH/mesh/gw_bandwidth logger "batman gateway mode for $sd changed to $NEW_STATE" </pre<noinclude></noinclude>>


Wir machen das Script wieder ausführbar:

# chmod +x /usr/local/bin/tun-vpn-01_check.sh


Um dieses Script nun per Cron auszuführen muss dies konfiguriert werden:

<pre<noinclude></noinclude> style="margin-bottom: 0; border-bottom:none; padding-bottom:0.8em;"># export EDITOR=nano; export VISUAL=nano; crontab -e</pre<noinclude></noinclude>> <pre<noinclude></noinclude> style="margin-top: 0; border-top-style:dashed; padding-top: 0.8em;">*/1 * * * * /usr/local/bin/tun-vpn-01_check.sh</pre<noinclude></noinclude>>


Die OpenVPN-Verbindung wird nun jede Minuten (*/1 *) geprüft.

Wir deaktiveren noch rp_filter mittels:

# touch /etc/sysctl.d/50-default.conf


Danach starten wir den Server neu.