Hinweis |
---|
Wir verwendet seit geraumer Zeit Ansible zur Server Konfiguration und der Inhalt dieser Seite wurde nicht weiter gepflegt. |
In diesem Artikel wird beschrieben, wie du einen Server für Freifunk Münsterland als Gateway-Server einrichten kannst.
Für den Zugang zum Internet benötigen die meisten Freifunk-Netze mindestens zwei Serverdienste:
- Mindestens einen Zielserver für die VPN-Tunnel der Freifunk-Knoten (Oft Super-Node genannt)
- Mindestens ein Gateway um die Daten ins Internet zu leiten
Beim Freifunk Münsterland werden aktuell beide Dienste auf einem Server installiert. Daher ist der genutzte Begriff "Gateway-Server" technisch gesehen nicht ganz richtig.
Installation
Die Wahl der Linux-Distribution
Wir verwenden bisher auf unseren Gateways Debian Wheezy, haben daher auch die meiste Erfahrung damit, wie ein Gateway unter dieser Distribution zu betreiben ist. Es sollte aber auch möglich sein, nach dieser Anleitung ein Gateway unter Ubuntu einzurichten. Bei anderen Distributionen ist deutlich mehr eigene Recherche nötig.
Paketquellen
Wir verwenden folgende zusätzliche Paketquellen auf unseren Servern:
Codeblock |
---|
deb http://repo.universe-factory.net/debian/ sid main |
Codeblock |
---|
deb http://download.opensuse.org/repositories/home:/fusselkater:/ffms/Debian_7.0/ / |
Zusätzlich benötigen wir die wheezy-Backports für libjson-c2 (Abhängigkeit von fastd >= 15)
Codeblock |
---|
deb http://http.debian.net/debian wheezy-backports main |
Um die nötigen Schlüssel hinzuzufügen, mache folgendes:
Codeblock |
---|
gpg --keyserver pgpkeys.mit.edu --recv-key 16EF3F64CB201D9C gpg -a --export 16EF3F64CB201D9C | apt-key add - |
Codeblock |
---|
wget http://download.opensuse.org/repositories/home:fusselkater:ffms/Debian_7.0/Release.key apt-key add - < Release.key |
Nun sind die benötigten Repos eingetragen und du kannst mit
Codeblock |
---|
aptitude update |
die Paketquellen aktualisieren.
Notwendige Pakete
Folgende Pakete müssen nun auf deinem Gateway installiert werden:
Paket | Beschreibung |
---|---|
sudo | Ausführung von Befehlen mit Root-Rechten |
bridge-utils | Verwaltung von Netzwerkbrücken |
batctl=2013.4.0-1 | B.A.T.M.A.N. Verwaltungstools |
bird | BGP Routing |
haveged | Entropie |
fastd | VPN für Verbindung zu den Knoten |
radvd | IPv6 Router Advertisements |
isc-dhcp-server | DHCP Server |
bind9 | DNS Server |
git | Versionsverwaltungssystem |
alfred | A.L.F.R.E.D. Datenübertragung |
alfred-json | A.L.F.R.E.D. Datenausgabe |
batman-adv-dkms | Batman-Kernelmodul in Version 2013.04 |
nagios-nrpe-server | Statusüberwachung |
ntp | Zeitsynchronisation |
tinc | Inter-City VPN |
iptables | Paketfilter Userland |
Oder als ein Befehl:
Codeblock |
---|
aptitude install sudo bridge-utils batctl=2013.4.0-1 bird haveged fastd radvd isc-dhcp-server bind9 git alfred alfred-json batman-adv-dkms nagios-nrpe-server ntp |
Tinc wird in der Version 1.11~pre11 benötigt.
Eine für Debian Wheezy geeignete version muss entsprechend https://gist.github.com/mweinelt/efff4fb7eba1ee41ef2d
manuell Kompiliert werden.
Die Installation erfolgt ebenfalls manuell mittels dpkg -i <dateiname>.deb
IP Forwarding aktivieren
Konfigurationsdatei /etc/sysctl.d/forwarding.conf
<file - forwarding.conf>
- IPv4 Forwarding
net.ipv4.ip_forward=1
- IPv6 Forwarding
net.ipv6.conf.all.forwarding = 1
</file>
Jetzt solltest du noch einmal rebooten, um diese Änderung zu aktivieren.
batman-adv Kernelmodul automatisch laden
In die Datei /etc/modules
müssen die folgenden Zeilen ergänzt werden um das batman-adv Kernelmodul beim Start des Servers automatisch zu laden:
Codeblock |
---|
batman-adv |
batman-adv Version Prüfen
Nach dem Reboot solltest du die batman-adv Version prüfen. Diese muss derzeit 2013.4.0
sein.
Codeblock |
---|
modinfo batman-adv |
Netzwerkkonfiguration
Das Loopback Interface muss durch die öffentliche IP des Gateway Servers ergänzt werden
<file - interfaces>
- The loopback network interface
auto lo
iface lo inet loopback
Codeblock |
---|
up ip address add <öffentliche ipv4 die wir vom FF Rheinland erhalten>/32 dev lo |
</file>
Als nächstes brauchen wir eine Netzwerkbrücke, als Schnittstelle zwischen dem Mesh-Netz und dem Internet-Uplink.
Dazu füge in die Konfigurationsdatei /etc/network/interfaces
folgendes hinzu:
<file - interfaces>
- Netwerkbruecke fuer Freifunk
- - Hier laeuft der Traffic von den einzelnen Routern und dem externen VPN zusammen
- - Unter der hier konfigurierten IP ist der Server selber im Freifunk Netz erreichbar
- - bridge_ports none sorgt dafuer, dass die Bruecke auch ohne Interface erstellt wird
Codeblock |
---|
auto br0
iface br0 inet static
Codeblock |
---|
address 10.43.0.z netmask 255.255.0.0 bridge_ports none |
iface br0 inet6 static
Codeblock |
---|
address 2a03:2260:115::z netmask 48 |
</file>
Das z
ist hier gegen die Zahl zu ersetzen, die wir dem neuen Gateway geben möchten.
Als nächstes muss das bat0-Interface konfiguriert werden. Dazu bearbeitest du wieder die /etc/network/interfaces
<file - interfaces>
- Batman Interface
- - Erstellt das virtuelle Inteface fuer das Batman-Modul und bindet dieses an die Netzwerkbruecke
- - Die unten angelegte Routing-Tabelle wird spaeter fuer das Routing innerhalb von Freifunk (Router/VPN) verwendet
allow-hotplug bat0
iface bat0 inet6 manual
Codeblock |
---|
pre-up modprobe batman-adv post-up ip link set dev bat0 up post-up brctl addif br0 bat0 post-up batctl it 10000 post-up ip rule add from all fwmark 0x1 table 42 |
</file>
Zur Erklärung:
Bevor das Netzwerkinterface gestartet wird, wird zur Sicherheit nochmal batman-adv geladen.
Nachdem das Interface gestartet ist, wird eine IP-Regel angelegt, die besagt, dass alle Pakete, die über das bat0-Interface eingehen, und mit 0x1 markiert sind, über die Routing-Tabelle 42 geleitet werden. Dies ist wichtig, damit die Pakete aus dem Mesh-VPN wirklich über das MULLVAD-VPN wieder raus gehen, und nicht direkt über deinen Server.
Am Ende wird noch alfred und batadv-vis gestartet. Diese dienen zur Sammlung der Daten für die Knotenkarte.
Als nächstes müssen noch die GRE Tunnel zu den Servern des Rheinland Backbone erstellt werden.
Die zugewiesenen Daten stehen hier: intern:backbone_rheinland
Entsprechend der zugewiesenen Endpunkte werden pro Server zwei Tunnel erstellt.
<file - interfaces>
- GRE Tunnel zum Rheinland Backbone
- - Die Konfigurationsdaten werden vom Rheinland Backbone vergeben und zugewiesen
auto tun-ffrl-???
iface tun-ffrl-??? inet static
Codeblock |
---|
address <lokale IPv4 Adresse im Tunnel> netmask 255.255.255.254 pre-up ip tunnel add $IFACE mode gre local <IPv4 Adresse dieses Servers> remote <IPv4 Adresse der Gegenstelle> ttl 255 post-up ip link set $IFACE mtu 1400 post-down ip tunnel del $IFACE |
iface tun-ffrl-??? inet6 static
Codeblock |
---|
address <lokale IPv6 Adresse im Tunnel>/64 netmask 64 |
</file>
Um diese Änderung zu aktivieren, startest du das Netzwerk einmal per service networking restart
neu.
IPtables-Regeln
Nun brauchst du noch IPtables-Regeln. Lege dazu die Konfigurationsdatei /etc/iptables.up.rules
an, und trage folgendes ein.
Damit werden alle Pakete, die über die Bridge rein kommen, mit dem 0x1-Flag markiert, und damit über Routing-Tabelle 42 geschickt. Das bedeutet, diese gehen nicht über die standard Routing-Tabelle. Außerdem gibt es noch 2 Regeln für DNS, dass auch DNS-Pakete (Port 53 TCP/UDP) über die Tabelle 42 geschickt werden. Ansonsten würden DNS-Anfragen über deine normale Internetverbindung raus gehen.
Wiki-Markup |
---|
<file - iptables.up.rules> *filter :INPUT ACCEPT \[0:0] :FORWARD ACCEPT \[0:0] :OUTPUT ACCEPT \[0:0] COMMIT |
Wiki-Markup Regeln zum markieren eingehender Pakete *mangle :PREROUTING ACCEPT \[0:0] :INPUT ACCEPT \[0:0] :FORWARD ACCEPT \[0:0] :OUTPUT ACCEPT \[0:0] :POSTROUTING ACCEPT \[0:0] -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o tun-+ -j TCPMSS --set-mss 1280 -A PREROUTING -i br0 -j MARK --set-xmark 0x1/0xffffffff -A OUTPUT -o eth0 -p udp --dport 53 -j MARK --set-xmark 0x1/0xffffffff -A OUTPUT -o eth0 -p tcp --dport 53 -j MARK --set-xmark 0x1/0xffffffff COMMIT
Wiki-Markup Route nach extern per nat. *nat :PREROUTING ACCEPT \[0:0] :INPUT ACCEPT \[0:0] :OUTPUT ACCEPT \[0:0] :POSTROUTING ACCEPT \[0:0] -A POSTROUTING -o tun-+ -j SNAT --to-source <öffentliche IPv4 des Gateway> COMMIT </file>
Diese Regel sorgt dafür, dass dein Router auch das NAT übernimmt.
Als letztes musst du dafür sorgen, dass die IPtables-Regeln auch geladen werden. dazu erzeuge die Datei /etc/network/if-pre-up.d/iptables
mit folgendem Inhalt:
<file bash iptables>
#!/bin/sh
/sbin/iptables-restore < /etc/iptables.up.rules
</file>
Und mache sie danach ausführbar:
Codeblock |
---|
chmod +x /etc/network/if-pre-up.d/iptables |
Jetzt lädst du noch fix einmal die IPtables-Regeln via
Codeblock |
---|
iptables-restore < /etc/iptables.up.rules |
Einrichtung des BGP Daemon
Der Austausch von Routen mit dem Rheinland Backbone erfolgt über BGP.
Hierfür wird der Routing Daemon bird verwendet.
Es müssen die folgenden Konfigurationsdateien erstellt werden:
<file - /etc/bird.conf>
log syslog all;
router id <Freifunk Interne IPv4 des Servers, z.B. 10.43.0.5>;
protocol direct {
Codeblock |
---|
interface "*"; |
};
protocol kernel {
Codeblock |
---|
device routes; import all; export all; kernel table 42; |
};
protocol device {
Codeblock |
---|
scan time 8; |
};
function is_default() {
Codeblock |
---|
return (net ~ [0.0.0.0/0]); |
};
- own network
function is_self_net() {
Codeblock |
---|
return (net ~ [ 10.43.0.0/16+ ]); |
}
- freifunk ip ranges in general
function is_freifunk() {
Codeblock |
---|
return net ~ [ 10.0.0.0/8+, 104.0.0.0/8+ ]; |
}
filter hostroute {
Codeblock |
---|
if net ~ <Öffentliche IPv4 Adresse vom Rheinland Backbone, 185.66.193.48>/32 then accept; reject; |
};
- ibgp zwischen den gateways
template bgp internal {
Codeblock |
---|
local as <Unsere AS Nummer, 65251>; import filter { preference = 99; accept; }; export where source = RTS_BGP; gateway direct; next hop self; |
};
- hier jeweils ein Eintrag zu jedem der anderen Gateways
protocol bgp gw_??? from internal {
Codeblock |
---|
neighbor <IP-Adresse innerhalb des FF netztes, z.B. 10.43.0.4> as <Unsere AS Nummer, 65251>; |
};
- Uplink über ff Rheinland
template bgp uplink {
Codeblock |
---|
local as <Unsere AS Nummer, 65251>; import where is_default(); export filter hostroute; next hop self; multihop 64; default bgp_local_pref 200; |
};
protocol bgp ffrl_??? from uplink {
Codeblock |
---|
source address <Unsere IP in GRE Tunnel, 100.64.0.109>; neighbor <IP der Gegenstelle im GRE Tunnel, z.B. 100.64.0.108> as 201701; |
};
protocol bgp ffrl_??? from uplink {
Codeblock |
---|
source address <Unsere IP in GRE Tunnel, 100.64.0.109>; neighbor <IP der Gegenstelle im GRE Tunnel, z.B. 100.64.0.108> as 201701; |
};
- template for icvpn gateways of other cities
template bgp icvpn {
Codeblock |
---|
local as 65251; # ignore routes for our own network import where (is_freifunk() && !is_self_net()); export where is_freifunk(); route limit 10000; |
};
- generated icvpn config
include "/var/tmp/bird-icvpn.conf";
</file>
<file - /etc/bird6.conf>
/*
- This is an example configuration file.
- /
- Yes, even shell-like comments work...
- Configure logging
log syslog { debug, trace, info, remote, warning, error, auth, fatal, bug };
#log stderr all;
#log "tmp" all;
- Override router ID
router id <Freifunk Interne IPv4 des Servers, z.B. 10.43.0.5>;
protocol direct {
Codeblock |
---|
interface "*"; # Restrict network interfaces it works with |
}
protocol kernel {
Codeblock |
---|
device routes; import all; export all; # Default is export none kernel table 42; # Kernel table to synchronize with (default: main) |
}
protocol device {
Codeblock |
---|
scan time 10; # Scan interfaces every 10 seconds |
}
function is_default() {
Codeblock |
---|
return (net ~ [::/0]); |
}
- own networks
Wiki-Markup |
---|
function is_self_net() \{ return net ~ \[ fd68:e2ea:a53::/48+ ]; } |
- freifunk ip ranges in general
Wiki-Markup |
---|
function is_freifunk() \{ return net ~ \[ fc00::/7\{48,64}, 2001:bf7::/32+]; } |
filter hostroute {
Codeblock |
---|
if net ~ 2a03:2260:115::/48 then accept; reject; |
}
- ibgp zwischen den gateways
template bgp internal {
Codeblock |
---|
local as <Unsere AS Nummer, 65251>; import filter { preference = 99; accept; }; export where source = RTS_BGP; gateway direct; next hop self; |
};
- pro anderem gateway ein eintrag
protocol bgp gw_??? from internal {
Codeblock |
---|
neighbor <Interne IPv6 Adresse des anderen Gateways, z.B. 2a03:2260:115::6> as <Unsere AS-Nummer, 65251>; |
};
- Uplink zum FF Rheinland
template bgp uplink {
Codeblock |
---|
local as <Unsere AS Nummer, 65251>; import where is_default(); export filter hostroute; gateway recursive; |
}
protocol bgp ffrl_??? from uplink {
Codeblock |
---|
description "Rheinland Backbone"; source address <Unsere IPv6 Adresse im GRE Tunnel, z.B. 2a03:2260:0:3e::2>; neighbor <IPv6 Adresse der Gegenstelle im GRE Tunnel, z.B. 2a03:2260:0:3e::1> as 201701; |
}
protocol bgp ffrl_??? from uplink {
Codeblock |
---|
description "Rheinland Backbone"; source address <Unsere IPv6 Adresse im GRE Tunnel, z.B. 2a03:2260:0:3f::2>; neighbor <IPv6 Adresse der Gegenstelle im GRE Tunnel, z.B. 2a03:2260:0:3f::1> as 201701; |
}
- template for icvpn gateways of other cities
template bgp icvpn {
Codeblock |
---|
local as 65251; # ignore routes for our own network import where is_freifunk() && !is_self_net(); export where is_freifunk() || (source = RTS_BGP); route limit 10000; |
};
- aus ICVPN Meta erzeugte konfiguration
include "/var/tmp/bird6-icvpn.conf";
</file>
Die verwendeten IC-VPN Konfigurationsdaten werden später erzeugt und jetzt erst einmal leer angelegt.
Codeblock |
---|
touch /var/tmp/bird-icvpn.conf touch /var/tmp/bird6-icvpn.conf |
Anschließend kann bird mit service bird start
und service bird6 start
gestartet werden.
Die Befehle birdc show protocols
und birdc6 show protocols
zeigen den zustand der Verbindungen an.
Einrichtung des Mesh-VPNs
Für das Mesh-VPN wird fastd eingesetzt. Hierzu erzeugst du als erstes das Konfigurationsverzeichnis:
Codeblock |
---|
mkdir -p /etc/fastd/vpn/peers |
Als nächstes erzeugst du die Schlüssel für deinen Server. Dazu führst du folgendes aus:
Codeblock |
---|
fastd --generate-key |
dieser Befehl zeigt dir die Schlüssel lediglich an. Heißt du musst sie dir aus dem Terminal kopieren, um sie im nächsten Schritt verwenden zu können.
Jetzt legst du eine Konfigurationsdatei /etc/fastd/vpn/fastd.conf
mit folgendem Inhalt an:
<file - fastd.conf>
- Bind to a fixed address and port, IPv4 and IPv6
Wiki-Markup |
---|
bind EXTERNE-IPv4-ADRESSE:14242 interface "eth0"; bind \[EXTERNE-IPv6-ADRESSE]:14242 interface "eth0"; |
- Set the user, fastd will work as
user "nobody";
- Set the interface name
interface "mesh-vpn";
- Set the mode, the interface will work as
mode tap;
- Set the mtu of the interface (salsa2012 with ipv6 will need 1406)
mtu 1406;
- Set the methods (aes128-gcm preferred, salsa2012+umac preferred for nodes)
method "aes128-gcm";
method "salsa2012+umac";
method "salsa2012+gmac";
- Secret key generated by `fastd --generate-key`
secret "SERVER-SECRET-KEY";
- Log everything to syslog
log to syslog level debug;
- Include peers from our git-repos
include peers from "/var/gateway-ffms/backbone/";
- Status Socket
status socket "/tmp/fastd-status";
- Configure a shell command that is run on connection attempts by unknown peers (true means, all attempts are accepted)
- on verify "true";
on verify "
Codeblock |
---|
/bin/bash /var/gateway-ffms/fastd/verify.sh $PEER_KEY |
";
- Configure a shell command that is run when fastd comes up
on up "
Codeblock |
---|
chmod ugo+rw /tmp/fastd-status ip link set dev $INTERFACE address de:ad:be:ef:43:XX ip link set dev $INTERFACE up ifup bat0 batctl if add $INTERFACE batctl gw server DOWNSTREAM/UPSTREAM batctl vm server ip rule add from ÖFFENTLICHE-IPv4-ADRESSE/METZMASKE lookup 42 ip -6 rule add from ÖFFENTLICHE-IPv6-ADRESSE/METZMASKE lookup 42 |
";
</file>
Folgendes muss ersetzt werden:
EXTERNE-IPv4-ADRESSE
gegen die externe IPv4-Adresse des GatewaysEXTERNE-IPv6-ADRESSE
gegen die externe IPv6-Adresse des GatewaysSERVER-SECRET-KEY
gegen deinen geheimen SchlüsselXX
gegen die Mac-Adresse, die wir dem Client geben möchtenDOWNSTREAM
gegen die Bandbreite deines Downstreams (z.B.1024Mbit
)UPSTREAM
gegen die Bandbreite deines Upstreams (z.B.1024Mbit
)ÖFFENTLICHE-IPv4-ADRESSE/METZMASKE
gegen die öffentliche IPv4 Adresse die wir vom Rheinland Backbone erhalten (inkl Netzmaske)ÖFFENTLICHE-IPv6-ADRESSE/METZMASKE
gegen die öffentliche IPv6 Adresse die wir vom Rheinland Backbone erhalten (inkl Netzmaske)
Nun brauchst du die Peers aus unserem GIT-Repository. Wechsle dazu in das Verzeichnis /var und führe folgendes aus:
Codeblock |
---|
git clone https://github.com/FreiFunkMuenster/gateway-ffms.git |
Zum testen der fastd-Konfiguration führe folgendes aus:
Codeblock |
---|
fastd -c /etc/fastd/vpn/fastd.conf |
Anschließend kannst du fastd mit
Codeblock |
---|
service fastd start |
starten.
Den Öffentlichen Schlüssel deines Servers schickst du uns, damit wir ihn einpflegen können.
Einrichtung des InterCity VPNs
Das InterCity-VPN wird über Tinc aufgebaut.
Dokumentation im Freifunk Wiki
Die Konfiguration der Verbindungspartner ist in dem Git Repo hinterlegt.
Hier muss der neue Server eingetragen werden.
Anschließend wird das Repo https://github.com/freifunk/icvpn auf den lokalen Server geklont.
Codeblock |
---|
cd /var git clone https://github.com/freifunk/icvpn |
Anschließend muss das Verzeichnis /etc/tinc/icvpn
erstellt werden.
Codeblock |
---|
mkdir /etc/tinc/icvpn ln /var/icvpn/hosts /etc/tinc/icvpn/hosts -s |
Als nächstes werden die Schlüssel für den Server erzeugt.
Die Dateien müssen in dem Verzeichnis /etc/tinc/icvpn
gespeichert werden.
Codeblock |
---|
tinc generate-keys |
Jetzt folgt die Konfigurationsdatei /etc/tinc/icvpn/tinc.conf
Codeblock |
---|
Name = muensterland<Kürzel des Gateways> PrivateKeyFile = /etc/tinc/icvpn/rsa_key.priv Mode = Switch PingTimeout = 30 Port = 656 Hostnames = yes |
Im Gleichen Verzeichnis muss auch ein Script /etc/tinc/icvpn/tinc-up
angelegt werden.
Die IP Adresse innerhalb des VPNs muss für den Server muss in der Liste https://wiki.freifunk.net/IC-VPN eingetragen werden.
Codeblock |
---|
#!/bin/sh /sbin/ip link set dev $INTERFACE up /sbin/ip addr add dev $INTERFACE 10.207.X.Y/16 broadcast 10.207.255.255 scope link /sbin/ip -6 addr add dev $INTERFACE fec0::a:cf:X:Y/96 preferred_lft 0 |
In der Datei /etc/tinc/nets.boot
wird anschließend folgende Zeile ergänzt damit Tinc das Netzwerk automatisch startet.
Codeblock |
---|
icvpn |
TODO: Update Mechanismus für IC-VPN Hosts ??
IPv6 Router Advertisements einrichten
Alle Gateway-Server teilen das selbe IPv6-Prefix durch Router Advertisements aus. Router Advertisements können maximal ein /64 großes Netz vergeben, weshalb dies hier getan wird.
Lege die Konfigurationsdatei /etc/radvd.conf
mit folgendem Inhalt an:
<file - radvd.conf>
interface br0
{
Codeblock |
---|
AdvSendAdvert on; IgnoreIfMissing on; |
AdvManagedFlag off;
Codeblock |
---|
AdvOtherConfigFlag on; AdvLinkMTU 1280; |
Codeblock |
---|
prefix 2a03:2260:115::z/64 { AdvOnLink on; AdvAutonomous on; AdvRouterAddr on; |
};
Codeblock |
---|
RDNSS 2a03:2260:115::z { }; |
};
</file>
Hierbei muss die RDNSS-Adresse auf deinen Server zeigen.
Als letztes kannst du radvd via
Codeblock |
---|
service radvd restart |
neustarten.
DHCPv4 Server einrichten
Dein Server muss als nächstes IPv4-Adressen vergeben. Erzeuge dafür die Konfigurationsdatei /etc/dhcp/dhcpd.conf
mit folgendem Inhalt:
<file - dhcpd.conf>
default-lease-time 240;
max-lease-time 1200;
authoritative;
log-facility local7;
subnet 10.43.0.0 netmask 255.255.0.0 {
Codeblock |
---|
range 10.43.zz.1 10.43.zz.254; |
option routers 10.43.0.x;
Codeblock |
---|
option domain-name-servers 10.43.0.x; option interface-mtu 1280; |
}
</file>
Jeder Gateway-Server erhält einen Teil des IP-Bereiches um Adressen zu vergeben. Diesen Bereich erhälst du bei uns.
Die Optionen Router und Domain-Name-Servers enthalten jeweils die IP deines Servers.
Jetzt muss der DHCP-Server noch auf das Bridge-Interface festgelegt werden. Dazu bearbeitest du die Datei /etc/default/isc-dhcp-server
und setzt folgende Option:
<file bash isc-dhcp-server>
- On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
- Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACES="br0"
</file>
Nun testest du den DHCP-Server via:
Codeblock |
---|
dhcpd -f -d |
und anschließend startest du den DHCP-Server via:
Codeblock |
---|
service isc-dhcp-server restart |
DHCPv6 Server einrichten
Da Windows die RDNSS-Option aus den Router Advertisements nicht kennt, ist es außerdem nötig, einen DHCP6-Server laufen zu lassen. Da Debian derzeit keine Konfigurationsdateien hierfür anbietet, erstellen wir diese selbst.
Lege folgende Dateien an:
/etc/init.d/isc-dhcp6-server
<file bash isc-dhcp6-server>
#!/bin/sh
#
#
- BEGIN INIT INFO
- Provides: isc-dhcp6-server
- Required-Start: $remote_fs $network $syslog
- Required-Stop: $remote_fs $network $syslog
- Should-Start: $local_fs slapd $named
- Should-Stop: $local_fs slapd
- Default-Start: 2 3 4 5
- Default-Stop: 0 1 6
- Short-Description: DHCP6 server
- Description: Dynamic Host Configuration Protocol Server V6
- END INIT INFO
PATH=/sbin:/bin:/usr/sbin:/usr/bin
test -f /usr/sbin/dhcpd ::UWCTOKENCOLSPANS:2::| exit 0
DHCPD_DEFAULT="${DHCPD_DEFAULT:-/etc/default/isc-dhcp6-server}"
- It is not safe to start if we don't have a default configuration...
Wiki-Markup |
---|
if \[ ! -f "$DHCPD_DEFAULT" ]; then |
Codeblock |
---|
echo "$DHCPD_DEFAULT does not exist! - Aborting..." if [ "$DHCPD_DEFAULT" = "/etc/default/isc-dhcp6-server" ]; then echo "Run 'dpkg-reconfigure isc-dhcp-server' to fix the problem." fi exit 0 |
fi
. /lib/lsb/init-functions
- Read init script configuration
Wiki-Markup |
---|
\[ -f "$DHCPD_DEFAULT" ] && . "$DHCPD_DEFAULT" |
NAME=dhcpd
DESC="ISC DHCP6 server"
- fallback to default config file
DHCPD_CONF=${DHCPD_CONF:-/etc/dhcp/dhcpd6.conf}
- try to read pid file name from config file, with fallback to /var/run/dhcpd.pid
Wiki-Markup |
---|
if \[ -z "$DHCPD_PID" ]; then |
Codeblock |
---|
DHCPD_PID=$(sed -n -e 's/^[ \t]*pid-file-name[ \t]*"(.*)"[ \t]*;.*$/\1/p' < "$DHCPD_CONF" 2>/dev/null | head -n 1) |
fi
DHCPD_PID="${DHCPD_PID:-/var/run/dhcpd6.pid}"
test_config()
{
Codeblock |
---|
if ! /usr/sbin/dhcpd -6 -t $OPTIONS -q -cf "$DHCPD_CONF" > /dev/null 2>&1; then echo "dhcpd self-test failed. Please fix $DHCPD_CONF." echo "The error was: " /usr/sbin/dhcpd -6 -t $OPTIONS -cf "$DHCPD_CONF" exit 1 fi |
}
- single arg is -v for messages, -q for none
check_status()
{
Codeblock |
---|
if [ ! -r "$DHCPD_PID" ]; then test "$1" != -v || echo "$NAME is not running." return 3 fi if read pid < "$DHCPD_PID" && ps -p "$pid" > /dev/null 2>&1; then test "$1" != -v || echo "$NAME is running." return 0 else test "$1" != -v || echo "$NAME is not running but $DHCPD_PID exists." return 1 fi |
}
case "$1" in
Codeblock |
---|
start) test_config log_daemon_msg "Starting $DESC" "$NAME" start-stop-daemon --start --quiet --pidfile "$DHCPD_PID" \ |
- -exec /usr/sbin/dhcpd – \
- 6 -q $OPTIONS -cf "$DHCPD_CONF" -pf "$DHCPD_PID" $INTERFACES
Codeblock |
---|
sleep 2 |
if check_status -q; then
Codeblock |
---|
log_end_msg 0 else log_failure_msg "check syslog for diagnostics." log_end_msg 1 exit 1 fi ;; stop) log_daemon_msg "Stopping $DESC" "$NAME" start-stop-daemon --stop --quiet --pidfile "$DHCPD_PID" log_end_msg $? rm -f "$DHCPD_PID" ;; restart | force-reload) test_config $0 stop sleep 2 $0 start if [ "$?" != "0" ]; then exit 1 fi ;; status) echo -n "Status of $DESC: " check_status -v exit "$?" ;; |
- )
Codeblock |
---|
echo "Usage: $0 {start|stop|restart|force-reload|status}" exit 1 |
esac
exit 0
</file>
Danach mache das Script ausführbar und lege es in den Autostart via:
Codeblock |
---|
chmod +x /etc/init.d/isc-dhcp6-server update-rc.d isc-dhcp6-server defaults |
/etc/default/isc-dhcp6-server
<file bash isc-dhcp6-server>
- Defaults for isc-dhcp-server initscript
- sourced by /etc/init.d/isc-dhcp-server
- installed at /etc/default/isc-dhcp-server by the maintainer scripts
#
- This is a POSIX shell fragment
#
- Path to dhcpd's config file (default: /etc/dhcp/dhcpd6.conf).
#DHCPD_CONF=/etc/dhcp/dhcpd6.conf
- Path to dhcpd's PID file (default: /var/run/dhcpd6.pid).
#DHCPD_PID=/var/run/dhcpd6.pid
- Additional options to start dhcpd with.
- Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead
#OPTIONS=""
- On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
- Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACES="br0"
</file>
/etc/dhcp/dhcpd6.conf
<file - dhcpd6.conf>
- Enable RFC 5007 support (same than for DHCPv4)
allow leasequery;
- Global definitions for name server address(es)
option dhcp6.name-servers 2a03:2260:115::z;
subnet6 2a03:2260:115::/64 {
}
</file>
In option dhcp6.name-servers
gehört die IPv6-Adresse deines Servers.
Als letztes erzeuge die dhcpd6.leases
Datei via:
Codeblock |
---|
touch /var/lib/dhcp/dhcpd6.leases |
Nun kannst du den DHCPv6-Server starten:
Codeblock |
---|
service isc-dhcp6-server start |
InterCity Routen und DNS
Für die nächsten Schritte werden die Repositories https://github.com/freifunk/icvpn-meta
und https://github.com/freifunk/icvpn-scripts
benötigt.
Beide Repositories werden erst einmal mit git in /var
geklont.
Codeblock |
---|
cd /var git clone https://github.com/freifunk/icvpn-meta git clone https://github.com/freifunk/icvpn-scripts |
Anschließend werden die BGP-Konfigurationen erzeugt und in bird geladen.
Codeblock |
---|
/var/icvpn-scripts/mkbgp -x muenster -p icvpn_ -s /var/icvpn-meta/ -f bird -d icvpn -4 > /var/tmp/bird-icvpn.conf birdc configure /var/icvpn-scripts/mkbgp -x muenster -p icvpn_ -s /var/icvpn-meta/ -f bird -d icvpn -6 > /var/tmp/bird6-icvpn.conf birdc6 configure |
Als nächstes wird eine DNS Konfigurationsdatei erzeugt
Codeblock |
---|
/var/icvpn-scripts/mkdns -x muenster -x chaosvpn -x dn42 -s /var/icvpn-meta/ -f bind > /var/tmp/named.conf.icvpn |
DNS-Server einrichten
Wir verwenden als DNS-Server bind9. Lege folgende 2 Konfigurationsdateien an:
/etc/bind/named.conf.options
<file - named.conf.options>
options {
Codeblock |
---|
directory "/var/cache/bind"; |
_ If there is a firewall between you and nameservers you want
Codeblock |
---|
// to talk to, you may need to fix the firewall to allow multiple // ports to talk. See http://www.kb.cert.org/vuls/id/800113 |
_ If your ISP provided one or more IP addresses for stable
Codeblock |
---|
// nameservers, you probably want to use them as forwarders. // Uncomment the following block, and insert the addresses replacing // the all-0's placeholder. |
_ forwarders {
Codeblock |
---|
// 0.0.0.0; // }; |
_
Codeblock |
---|
// If BIND logs error messages about the root key being expired, // you will need to update your keys. See https://www.isc.org/bind-keys //======================================================================== dnssec-validation auto; recursion yes; allow-recursion { localnets; localhost; }; |
allow-notify { 10.43.0.10; };
Codeblock |
---|
auth-nxdomain no; # conform to RFC1035 listen-on-v6 { any; }; |
};
</file>
/etc/bind/named.conf.local
<file - named.conf.local>
_
_ Do any local configuration here
_
_ Consider adding the 1918 zones here, if they are not used in your
_ organization
include "/etc/bind/zones.rfc1918";
- inter city dns
include "/var/tmp/named.conf.icvpn"
zone "ffms" {
Codeblock |
---|
type slave; masters { 10.43.0.10; }; file "/var/tmp/db.ffms.bak"; |
};
zone "nodes.ffms" {
Codeblock |
---|
type slave; masters { 10.43.0.10; }; file "/var/tmp/db.nodes.ffms.bak"; |
};
zone "gw.freifunk-muenster.de" {
Codeblock |
---|
type slave; masters { 10.43.0.10; }; file "/var/tmp/db.gw.freifunk-muenster.de.bak"; |
};
</file>
Nun kannst du bind9 starten:
Codeblock |
---|
service bind9 restart |
NRPE Daemon einrichten
Die Gateways werden von einem zentralen Nagios Server überwacht.
Nach der Installation müssen in der Konfigurationsdatei /etc/nagios/nrpe.cfg
die folgenden Zeilen angepasst werden:
Codeblock |
---|
allowed_hosts=10.43.0.13 |
Codeblock |
---|
include_dir=/var/gateway-ffms/nrpe/ |
Zusätzlich benötigt der NRPE-Daemon weitere Berechtigungen die in der /etc/sudoers
vergeben werden müssen:
Codeblock |
---|
nagios ALL=NOPASSWD: /usr/sbin/batctl nagios ALL=NOPASSWD: /usr/sbin/birdc nagios ALL=NOPASSWD: /usr/sbin/birdc6 |
Statistiken via Munin
Die Statistiken werden auf den Gateways via Munin erzeugt.
Zuerst muss Munin noch installiert werden, diese Installtion sollte erst jetzt, nachdem das Gateway komplett konfiguriert ist erfolgen, da die Interface-Konfigurationen für Munin während der Installation automatisch generiert werden, und man sich arbeit spart, wenn die Netzwerkinterfaces bei der Installation alle bereits existieren.
Codeblock |
---|
aptitude install munin-node |
Dazu bearbeite die Konfigurationsdatei /etc/munin/munin-node.conf
wie folgt:
<file - munin-node.conf>
log_level 4
log_file /var/log/munin/munin-node.log
pid_file /var/run/munin/munin-node.pid
background 1
setsid 1
user root
group root
- This is the timeout for the whole transaction.
- Units are in sec. Default is 15 min
# - global_timeout 900
- This is the timeout for each plugin.
- Units are in sec. Default is 1 min
# - timeout 60
- Regexps for files to ignore
Wiki-Markup |
---|
ignore_file \[\#~]$ ignore_file DEADJOE$ ignore_file \.bak$ ignore_file %$ ignore_file \.dpkg-(tmp|new|old|dist)$ ignore_file \.rpm(save|new)$ ignore_file \.pod$ |
- Set this if the client doesn't report the correct hostname when
- telnetting to localhost, port 4949
#
host_name freifunk-gateway-zz
- A list of addresses that are allowed to connect. This must be a
- regular expression, since Net::Server does not understand CIDR-style
- network notation unless the perl module Net::CIDR is installed. You
- may repeat the allow line as many times as you'd like
allow ||127\.0\.0\.1$
allow ||::1$
allow ||2a03:2260:115::10$
- If you have installed the Net::CIDR perl module, you can use one or more
- cidr_allow and cidr_deny address/mask patterns. A connecting client must
- match any cidr_allow, and not match any cidr_deny. Note that a netmask
- must be provided, even if it's /32
# - Example:
# - cidr_allow 127.0.0.1/32
- cidr_allow 192.0.2.0/24
- cidr_deny 192.0.2.42/32
- Which address to bind to;
#host * - host 127.0.0.1
Wiki-Markup |
---|
host \[2a03:2260:115::z] |
- And which port
port 4949
</file>
Hierbei ist der Eintrag host
gegen die IPv6-Adresse deines Servers im Freifunknetz (also des br0-Interfaces) zu ersetzen, und host_name gegen den gewünschten Hostnamen.
Nun wechselst du in den Ordner /etc/munin/plugins
und löscht dort alle Plugins, dessen Statistiken du nicht sammeln möchstest.
Zum Schluss startest du munin-node via
Codeblock |
---|
service munin-node restart |
neu. Die Statistiken sollten bei dem nächsten Update von Munin auf unserer Seite https:_freifunk-muenster.de/stats/ erscheinen.
Abschluss
Dein Server ist nun für den Betrieb als Gateway für Freifunk Münster eingerichtet. Am besten startest du den Server einmal neu, und kontrolliere, dass alles korrekt hoch kommt.
Logging abschalten
"Freifunk steht unter Anderem für Netzneutralität und ist in keinster Weise an irgendwelchen Nutzer-, Meta-, Irgendwasdaten interessiert. Aus diesem Grund muss den sonst so redseligen Linux Daemonen das Logging abgewöhnt werden." (https://gluon-gateway-doku.readthedocs.org/de/latest/configuration/cleanup.html#logging)
Als erstes erzeuge ein "Schwarzes Loch" im im rsyslogd
Suche in /etc/rsyslog.conf
folgende Zeile:
<file - rsyslog.conf>
.;auth,authpriv.none -/var/log/syslog
</file>
und ersetze sie durch
<file - rsyslog.conf>
.;auth,authpriv.none;local6.none -/var/log/syslog
</file>
Dann suche den Block
<file - rsyslog.conf>
.=info;.=notice;*.=warn;\
Codeblock |
---|
auth,authpriv.none;\ cron,daemon.none;\ mail,news.none -/var/log/messages |
</file>
und ändere ihn so, daß er wie folgt aussieht
<file - rsyslog.conf>
.=info;.=notice;*.=warn;\
Codeblock |
---|
auth,authpriv.none;local6.none;\ cron,daemon.none;\ mail,news.none -/var/log/messages |
</file>
dann füge noch das Folgende am Ende ein:
<file - rsyslog.conf>
#
BlackHole
#
local6.* /dev/null
</file>
Jetzt den Logdämon restarten mitCodeblock service rsyslog restart
Als nächstes bringen wir dem dhcpd bei, seine unerwünschte Ausgabe ins schwarze Loch zu schieben.
Dazu editieren wir /etc/dhcp/dhcpd.conf
und /etc/dhcp/dhcpd6.conf
. In der Datei dhcpd.conf ändern wir die Log-Facility auf local6
und und der dhcpd6.conf fügen wir die Log-Facility hinzu.
<file - dhcpd.conf>
log-facility local6;
</file>
<file - dhcpd6.conf>
log-facility local6;
</file>
Zum Aktivieren der Änderung die DHCP neu starten:
Codeblock |
---|
service isc-dhcp-server restart service isc-dhcp6-server restart |
fastd bringen wir jetzt auch zum Schweigen. Editiere /etc/fastd/vpn/fastd.conf
und lösche die Zeile
<file - fastd.conf>
log to syslog level debug;
</file>
dafür fügst du folgendes ein
<file - fastd.conf>
log level warn;
hide ip addresses yes;
hide mac addresses yes;
</file>
Codeblock |
---|
service fastd restart |
abschicken und schon ist da auch Ruhe drin.
Jetzt fehlt nur noch der Nameserver.
Erstelle die Datei /etc/bind/named.conf.logging
mit folgendem Inhalt:
<file - named.conf.logging>
logging {
Codeblock |
---|
channel null { null; }; category default { null; }; |
};
</file>
und füge in /etc/bind/named.conf
diese Zeile ein
<file - named.conf>
include "/etc/bind/named.conf.logging";
</file>
abspeichern und
Codeblock |
---|
service bind9 restart |
abschicken
Jetzt könnten die Daten auch nicht mehr weitergegeben werden, weil sie gar nicht vorhanden sind.
Bekannte Fehlerbilder
Kernelpanik /-oops - Reboot automatisieren
B.A.T.M.A.N. bereitet häufiger Probleme mit Kernelpanic /-oops. Um das Gateway möglichst schnell wieder verfügbar zu machen, habe ich folgendes eingerichtet:
In die /etc/sysctl.conf
einfügen:
<file - sysctl.conf>
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
net.ipv4.tcp_syncookies=1
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
net.ipv4.conf.all.accept_redirects = 1
net.ipv6.conf.all.accept_redirects = 1
net.ipv4.conf.all.secure_redirects = 1
net.ipv4.conf.all.send_redirects = 1
net.ipv4.conf.all.accept_source_route = 1
net.ipv6.conf.all.accept_source_route = 1
net.ipv4.conf.all.log_martians = 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.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
kernel.panic_on_oops = 1
kernel.panic = 1
</file>
Nicht vergessen! sysctl -p
absetzen, um es auch sofort zu aktivieren.