Inhaltsverzeichnis

Gateway Installationsanleitung

Ausgangspunkt ist eine Debian Minimalinstallation von Debian GNU/Linux Stretch 9.11.

aptitude install isc-dhcp-server radvd bridge-utils iptables-persistent \
    libcap2-bin haveged ntp incron sudo vnstat vnstati bind9 lsb-release \
    sysstat iotop lighttpd rsync

Zeitservice (NTP) auf spezielle Schnittstellen beschränken

/etc/ntp.conf
interface listen lo
interface listen eth0
interface listen br-ffpi

Routing

/etc/iproute2/rt_tables
[...]
42      freifunk

Daten für die Karte (Meshviewer) bereitstellen (alfred-announced)

mkdir /etc/alfred
/etc/alfred/statics.json
{
    "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

Das Programm fastd kann auch leicht aus den Quellen erstellt werden.

Konfigurationsschritte

adduser --system --group --uid 300 --shell /bin/sh --disabled-password \
    --gecos 'Fast and Secure Tunneling Daemon'\
    --no-create-home --home /etc/fastd fastd

# Schlüssel für die Übertragung der Peers
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

# Verzeichnisstruktur
mkdir -p /etc/fastd/ffpi/peers
mkdir /etc/fastd/ffpi/backbone

# Eigner einstellen
chown -R fastd. /etc/fastd

fastd --generate-key > /etc/fastd/keys
chmod 600 /etc/fastd/keys

cd /etc/fastd/ffpi

Die auskommentierte Zeile im up-Script kann erst nach dem 2. Start benutzt werden. Beim Starten wird eine MAC-Adresse für das Mesh-VPN Interface automatisch erzeugt, die dann in das Script übernommen werden muß.

fastd.conf
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 <HIER GENERIERTE MAC EINTRAGEN>
  ip link set up dev $INTERFACE
  /usr/local/sbin/batctl if add $INTERFACE
";

Den oben erzeugten privaten Schlüssel aus /etc/fastd/keys übernehmen:

secret.conf
secret "<privater schlüssel>";

Neue Peers automatisch aktivieren

/etc/incron.d/fastd_peers
/etc/fastd/ffpi/peers IN_CREATE pkill -HUP fastd

Abschließend fastd für den automatischen Start bei Systemstart eintragen. Am einfachsten mit sysv-rc-conf.

Batman

Die folgenden Software-Pakete sind nicht im Debian-Standard veraltet und ggf. fehlerhaft enthalten, wir kompilieren sie deshalb von Hand:

Homepage von Batman: https://www.open-mesh.org/projects/open-mesh/wiki

aptitude install build-essential pkg-config linux-headers-$(uname -r)

Batman-adv erstellen (optional)

Makefile anpassen, damit das DebugFS zur Verfügung steht. Benötigt z.B. für fastd-status:

Makefile
export CONFIG_BATMAN_ADV_DEBUGFS=y
cd /usr/local/src
wget http://downloads.open-mesh.org/batman/stable/sources/batman-adv/batman-adv-2017.1.tar.gz
tar xzf batman-adv-2017.1.tar.gz
cd batman-adv-2017.1/
make
make install

batctl erstellen

cd /usr/local/src
aptitude install libnl-3-dev libnl-genl-3-dev
wget http://downloads.open-mesh.org/batman/stable/sources/batctl/batctl-2017.1.tar.gz
tar xzf batctl-2017.1.tar.gz
cd batctl-2017.1
make
make install 

Das Kernel-Modul muß anschließend geladen werden

modprobe batman-adv

Zum automatischen Starten dann in /etc/modules eintragen

/etc/modules
[...]
batman-adv

Überprüfen ob alles soweit geklappt hat:

$ batctl -v
batctl 2017.1 [batman-adv: 2017.1]

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.

/etc/network/interfaces
auto lo eth0
iface lo inet loopback
iface eth0 inet static
	address 91.143.81.176
	netmask 255.255.255.0
	broadcast 91.143.81.255
	gateway 91.143.81.1
iface eth0 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 100mbit/100mbit
	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.

iptables -t mangle -A PREROUTING -i br-ffpi -j MARK --set-xmark 0x1/0xffffffff
cd /etc/iptables
iptables-save > rules.v4
/etc/sysctl.conf
[...]
# 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.eth0.autoconf = 0
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0
net.ipv6.conf.eth0.accept_ra = 0

Neuladen mit sysctl -p

/etc/rc.local
/sbin/ip route add unreachable default table freifunk
/sbin/ip rule add from all fwmark 0x1 table freifunk
exit 0

Erster Start

 /etc/init.d/fastd start
 cat /sys/class/net/mesh-vpn/address

Die MAC-Adresse des mesh-vpn-Interfaces kopieren und in die fastd.conf-Datei einbauen.

DHCP - IPv4-Adressen für Clients

Wir verwenden den ISC DHCP Server.

aptitude install isc-dhcp-server
mkdir /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. /etc/dhcp/static/*.conf

Beispielkonfiguration für gate04, auf anderen Gateways muß die Konfiguration entsprechend angepaßt werden, insbesondere auch die Standardroute und die zu verwendenden DNS-Server.

/etc/dhcp/dhcpd.conf
#
# 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

/etc/default/isc-dhcp-server
[...]
INTERFACES="br-ffpi"

DHCP Server neu starten nach Änderung der statischen Konfiguration

/etc/incron.d/dhcpd
/etc/dhcp/static IN_CREATE,IN_NO_LOOP /etc/init.d/isc-dhcp-server restart

Protokollierung

Um die detaillierte Protokollierung im Produktivbetrieb auszustellen ist local7.* durch local7.warn zu ersetzen, sowie die Ausgabe im „Catch-All“-Logfile messages zu unterdrücken.

/etc/rsyslog.conf
*.*;auth,authpriv,local7.none -/var/log/syslog
local7.warn -/var/log/dhcpd.log
mail,news,local7.none   -/var/log/messages
/etc/logrotate.d/dhcpd
/var/log/dhcpd.log {
    weekly
    rotate 12 
    compress
    delaycompress
    notifempty
    missingok
}

IPv6 Adressen

/etc/radvd.conf
interface br-ffpi
{
    AdvSendAdvert on;
    IgnoreIfMissing on;
    MaxRtrAdvInterval 900;
    AdvLinkMTU 1350;
 
    prefix fde8:21c6:9d82::/64
    {
        AdvValidLifetime 864000;
        AdvPreferredLifetime 172800;
    };
 
    RDNSS fde8:21c6:9d82::0c01 fde8:21c6:9d82::0d01 fde8:21c6:9d82::0a01
    {
        FlushRDNSS off;
    };
 
};

Benutzereinrichung

Die Administratoren werden als lokale Benutzer eingerichtet, mit sudo-Berechtigung. Der Zugriff auf das System erfolgt immer mit einem Schlüssel, der Zugang mit Kennwort ist nicht vorgesehen.

In /etc/adduser.conf sollte eingestellt werden: DIR_MODE=0750

Vorbereitung für den Ablageort der SSH-Schlüssel der Administratoren in deren neu zu erstellenden Home-Verzeichnissen:

mkdir /etc/skel/.ssh
chmod 700 /etc/skel/.ssh
touch /etc/skel/.ssh/authorized_keys
chmod 600 /etc/skel/.ssh/authorized_keys

Die Administratoren sollen sich mit Schlüsseln an ihren Account anmelden. Kommandos können dann mit sudo ausgeführt werden. Für Sudo wird allerdings ein Kennwort benötigt, was sich jeder Admin selbst vergeben soll.

Die folgende Befehlskette legt einen Benutzer an, als neues Kennwort wird ein Standardkennwort vergeben, welches gleich auf abgelaufen eingestellt wird. Nach erfolgreicher Verbindung mit SSH erscheint dann sofort der Dialog zur Kennwortänderung.

adduser <admin>
usermod -aG sudo <admin>
passwd -e <admin>

Öffentlichen Schlüssel des Administrators hinterlegen

joe -nobackups /home/<admin>/.ssh/authorized_keys

Sonstiges

Falls das DebugFS nicht gemountet ist, kann es manuell eingebunden werden:

mount -t debugfs none /sys/kernel/debug

permanent dass über /etc/fstab:

debugfs /sys/kernel/debug debugfs defaults 0 0

Alfred

Spezielle Gatewaydaten für Alfred bereitstellen. Das Programm alfred-announce.py muß zuvor natürlich auf dem Gateway eingespielt werden.

Voraussetzung:

apt-get install python-daemon ethtool
/etc/cron.d/alfred
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
 
*/2 *	* * *	root	/usr/local/bin/alfred-announce.py

Mail

Damit Mails versendet werden können Postfix installieren

apt-get install postfix

Bei der Installation erst einmal keine Konfiguration auswählen, anschließend so konfigurieren daß die Mail über gate04 versendet wird. Gate04 ist der zentrale Mailserver in ffpi.

/etc/postfix/main.cf
[...]
myhostname = gate03.ffpi
mydestination = gate03.pinneberg.freifunk.net, gate03.ffpi, localhost.ffpi, localhost
relayhost = gate04.ffpi
inet_interfaces = loopback-only
/etc/aliases
# /etc/aliases
mailer-daemon: postmaster
postmaster: root
nobody: root
hostmaster: root
usenet: root
news: root
webmaster: root
www: root
ftp: root
abuse: root
noc: root
security: root
root: hostmaster@pinneberg.freifunk.net

Abschließend dann noch

newaliases

Statistiken

Öffentliche Statistiken werden mit vnstat zusammengestellt. Damit sie direkt vom Gateway abgerufen werden können, wird der kleine Webserver lighttpd installiert. Dieser stellt die Statistikseite dann per HTTP zur Verfügung.