|
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;
- log to "/var/log/fastd/$Stadt-vpn.log" level debug; #enable for debug-logging
user "fastd";
method "salsa2012+gmac";
include "secret.conf";
- 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;
- options
server-identifier server;
ignore client-updates;
- security options
deny declines;
one-lease-per-client true;
- ignore network boot requests
ignore bootp;
default-lease-time 600;
max-lease-time 3600;
authoritative;
log-facility local7;
- $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;
}
- example
- host examplehost {
- hardware ethernet 28:00:02:8D:44:22;
- fixed-address x.x.0.24; //mit $Netzaddresse ersetzen
- option host-name "examplehost";
- </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
- PREROUTING ACCEPT [174173:29763433]
- INPUT ACCEPT [173743:29726484]
- FORWARD ACCEPT [0:0]
- OUTPUT ACCEPT [95448:18280029]
- POSTROUTING ACCEPT [95459:18280541]
COMMIT
- 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.
|