Sehr sehr kurz gehaltene - unfertige - Anleitung für einen Gateway unter Debian; Details bitte aus der Gentoo-Anleitung entnehmen.
<
Unterschiede zwischen Gentoo und Debian (!!! WICHTIG !!!)
Folgende Befehle und Verzeichnisse die in der Gentoo-Anleitung verwendet werden sollten unter Debian nicht genutzt werden.Die Befehle und Pfade für Debian sind in dieser Anleitung angegeben.Befehle (in Klammern die gegenstücke für Debian):
emerge (apt-get) rc-update (update-rc.d) rc-service (service)
Verzeichnisse:
/etc/config.d/ (/etc/default/) /etc/portage/ /etc/local.d/ /etc/layman/ /etc/rc.conf
Statt
/etc/init.d/DAEMON start
wird in Debian die Dienste mit
sudo service DAEMON start
gestartet, gestoppt oder neugestartet.Zudem sollte in dieser Anleitung in /etc/init.d/ nichts verändert werden! Die manuell installierten Dienste unter /usr/local/ werden über die verschiedenen Configs, und damit in richtiger Reihenfolge, gestartet.
Der Cron sollte unter Debian weder gestoppt noch neugestartet werden. Die Configs unter /etc/cron.d/ werden automatisch aktualisiert.
Noch einmal ganz wichtig: Wenn Verzeichnisse oder Dateien unter Debian nicht existieren bitte erst hier nachschauen ob diese unter Debian notwendig sind.
Voraussetzungen
Beispiel von GW2 unter Debian Jessie (8.2) auf einen KVM-VServer. Ich gehe hier nur im groben auf die wichtigsten Unterschiede zur Gentoo-Anleitung ein da vieles identisch ist.
su -c apt-get install sudo su -c usermod -aG staff,adm,sudo BENUTZERNAME sudo apt-get install build-essential
Es wird davon ausgegangen dass sudo verwendet wird und so viel wie möglich unter seinem normalen Benutzeraccount erledigt wird. Software die nicht über den Paket-Manager (apt-get) installiert wird sollte unter /usr/local/ erstellt und installiert werden.
Uner Debian gibts layman nicht, stattdessen kann man zur Dokumentation der Konfigurationsdateien etckeeper verwenden.Der abgleichen mit Github fehlt hier aus Sicherheitsgründen wird aber noch nachgereicht.
Grundkonfiguration
Hostname
echo "gw2" | sudo tee /etc/hostname
/etc/hosts wie in der Gentoo-Anleitung
Routing
/etc/iproute2/rt_tables wie in der Gentoo-Anleitung
Kernelparameter
An den Kernelparameter wird nichts verändert!/etc/sysctl.conf wie in der Gentoo-Anleitung
SysFS
entfällt (wird in der /etc/network/interfaces erledigt)
Netzwerk
Externe Anbindung
Die Grundkonfiguration (meist eth0) sollte aus der Installation schon passen.Siehe Netzwerkverbindungen
Bridge
Siehe Netzwerkverbindungen
GRETAP-Tunnel
Siehe Netzwerkverbindungen
Netzwerkverbindungen
sudo apt-get install bridge-utils
In dieser Datei sind "Externe Anbindung", "Bridge", "GRETAP-Tunnel" und B.A.T.M.A.N. zusammengefasst.Diese Lösung ist alles andere als hübsch und auf jeden Fall nicht perfekt aber sie funktioniert.
Das DAD (Duplicate Address Detection) musste ich für das ggrzBR-Interface deaktivieren da dies zu Probleme führte.
Mit dem ggrzBAT-Interface wird auch der Fastd gestartet und gestoppt.In der Config von Fastd wird das ggrzVPN-Interface an ggrzBAT gebunden.
/etc/network/interfaces
# hier darf eth0 nicht fehlen !
###############################
# Tunnel
###############################
# ggrzTUN1: gw1 <-> gw2
# ggrzTUN2: gw1 <-> gw3
# ggrzTUN3: gw2 <-> gw3
auto ggrzTUN1
iface ggrzTUN1 inet manual
pre-up /bin/ip link add $IFACE type gretap remote 148.251.158.22 local 193.28.153.11 key 1
pre-up /bin/ip link set address de:ad:be:ef:02:03 dev $IFACE
post-up ip link set $IFACE up
post-down /bin/ip link del $IFACE
auto ggrzTUN3
iface ggrzTUN3 inet manual
pre-up /bin/ip link add $IFACE type gretap remote 5.196.74.176 local 193.28.153.11 key 3
pre-up /bin/ip link set address de:ad:be:ef:02:05 dev $IFACE
post-down /bin/ip link del $IFACE
post-up /bin/ip link set $IFACE up
###############################
# Bridge
###############################
allow-hotplug ggrzDummy
auto ggrzDummy
iface ggrzDummy inet manual
#bridge_ports ggrzBR
pre-up /bin/ip tuntap add $IFACE mode tap user root
post-up /bin/ip link set address de:ad:be:ef:02:00 dev $IFACE
post-up ip link set $IFACE up
post-down /bin/ip link del $IFACE
auto ggrzBR
iface ggrzBR inet6 static
dad-attempts 0
address fdb5:078b:64cc::12
netmask 64
bridge-stp no
bridge-fd 0
bridge-hello 10
bridge-ports ggrzDummy
#pre-up /sbin/brctl addif $IFACE ggrzDummy
post-up /bin/ip rule add iif $IFACE table ggrz priority 1810 || true
post-up /bin/ip route add unreachable default table ggrz || true
post-up /bin/ip -6 rule add iif $IFACE table ggrz priority 1810 || true
post-up /bin/ip -6 route add fe80::/64 proto static dev $IFACE table ggrz || true
post-up /bin/ip -6 route add fdb5:078b:64cc::/64 proto static dev $IFACE table ggrz || true
#post-up /bin/ip -6 addr add fdb5:078b:64cc::12/64 dev ggrzBR
pre-down /bin/ip -6 route del fe80::/64 proto static dev $IFACE table ggrz || true
pre-down /bin/ip -6 route del fdb5:078b:64cc::/64 proto static dev $IFACE table ggrz || true
pre-down /bin/ip rule del iif $IFACE table ggrz priority 1810 || true
pre-down /bin/ip route del unreachable default table ggrz || true
pre-down /bin/ip -6 rule del iif $IFACE table ggrz priority 1810 || true
iface ggrzBR inet static
address 10.181.0.12
netmask 255.255.192.0
broadcast 10.181.63.255
###############################
# Mesh-Interfaces
###############################
auto ggrzBAT
iface ggrzBAT inet manual
pre-up /usr/local/sbin/batctl -m $IFACE if add ggrzTUN1
pre-up /usr/local/sbin/batctl -m $IFACE if add ggrzTUN3
pre-up /usr/local/sbin/batctl -m $IFACE gw server 96mbit/96mbit
pre-up /usr/local/sbin/batctl -m $IFACE it 10000
pre-up echo 60 > /sys/class/net/$IFACE/mesh/hop_penalty
pre-up /sbin/brctl addif ggrzBR $IFACE
pre-up /bin/ip link set address de:ad:be:ef:02:02 dev $IFACE
post-up ip link set $IFACE up
post-up start-stop-daemon -b --start --exec /usr/local/bin/fastd -- --config /etc/fastd/ggrz/fastd.conf;
pre-down start-stop-daemon --stop --exec /usr/local/bin/fastd;
post-down /sbin/brctl delif ggrzBR $IFACE
post-down /usr/local/sbin/batctl -m $IFACE if del ggrzTUN1
post-down /usr/local/sbin/batctl -m $IFACE if del ggrzTUN3
Ganz wichtig ist dass die MAC-Adressen korrekt angepasst werden!
B.A.T.M.A.N.
B.A.T.M.A.N.
sudo apt-get install linux-headers-$(uname --kernel-release) build-essential cd /usr/local/src/ #wget http://downloads.open-mesh.org/batman/releases/batman-adv-2015.1/batman-adv-2015.1.tar.gz wget https://downloads.open-mesh.org/batman/releases/batman-adv-2016.5/batman-adv-2016.5.tar.gz tar -xzf batman-adv-201* cd batman-adv-201* make sudo make install sudo cp /lib/modules/$(uname --kernel-release)/kernel/net/batman-adv/batman-adv.ko /root/batman-adv.ko.old sudo cp net/batman-adv/batman-adv.ko /lib/modules/$(uname --kernel-release)/kernel/net/batman-adv/batman-adv.ko
Jetzt sollte der Befehl /sbin/modinfo batman-advfolgendes ausgeben:
filename: /lib/modules/3.16.0-4-amd64/updates/net/batman-adv/batman-adv.ko version: 2015.1 description: B.A.T.M.A.N. advanced author: Marek Lindner, Simon Wunderlich license: GPL srcversion: 4D64E98D15541F2EB62A9F0 depends: libcrc32c,crc16 vermagic: 3.16.0-4-amd64 SMP mod_unload modversions
Da das Kernelmodul selbst gebaut wurde muss es bei einem neuen Kernel auch neu gebaut werden!
batctl
sudo apt-get install pkg-config libnl-3-200 libnl-3-dev libnl-genl-3-dev #wget http://downloads.open-mesh.org/batman/releases/batman-adv-2015.1/batctl-2015.1.tar.gz wget https://downloads.open-mesh.org/batman/releases/batman-adv-2016.5/batctl-2016.5.tar.gz tar -xzf batctl-201* cd batctl-201* make sudo make install
FastD
sudo apt-get install cmake bison pkg-config libsodium-dev libcap-dev doxygen libjson-c-dev cd /usr/local/src #wget http://git.universe-factory.net/libuecc/snapshot/libuecc-5.tar #wget --no-check-certificate https://projects.universe-factory.net/attachments/download/81/fastd-17.tar.xz wget https://projects.universe-factory.net/attachments/download/85/libuecc-7.tar.xz wget https://projects.universe-factory.net/attachments/download/86/fastd-18.tar.xz tar -xf fastd-* tar -xf libuecc-* cd libuecc-* cmake . make sudo make install ln -s /usr/local/src/libuecc-7/src/libuecc.so /lib/libuecc.so ln -s /usr/local/src/libuecc-7/src/libuecc.so.0 /lib/libuecc.so.0{{{
cd /usr/local/src cd fastd-* cmake . make sudo make install
sudo mkdir -p /etc/fastd/ggrz }}}
fastd-Schlüssel analog Gentoo erstellen
/etc/fastd/ggrz/fastd.conf
log to syslog level verbose;
hide ip addresses yes;
hide mac addresses yes;
interface "ggrzVPN";
method "aes128-gcm";
method "salsa2012+umac";
method "null+salsa2012+umac";
bind 193.28.153.11:10181;
bind [2a02:ff80:1003:2::2]:10181;
mode tap;
include "secret.conf";
mtu 1406; # 1492 - IPv4/IPv6 Header - fastd Header...
include peers from "peers";
status socket "/var/run/fastd-gera-greiz.status";
on up "
/bin/ip link set address de:ad:be:ef:02:01 dev $INTERFACE up
/bin/ip link set dev ggrzBAT up
/usr/local/sbin/batctl -m ggrzBAT if add $INTERFACE
/sbin/start-stop-daemon -b --start --exec /usr/local/sbin/batadv-vis -- -si ggrzBAT
/sbin/start-stop-daemon -b --start --exec /usr/local/sbin/alfred -- -i ggrzBR -b ggrzBAT
";
on down "
/sbin/start-stop-daemon --stop --exec /usr/local/sbin/alfred
/sbin/start-stop-daemon --stop --exec /usr/local/sbin/batadv-vis
/bin/ip link set dev ggrzBAT down
/usr/local/sbin/batctl -m ggrzBAT if del $INTERFACE
/bin/ip link set dev $INTERFACE down
";
# Accept all keys
on verify "true";
# or with blacklist
#on verify "/etc/fastd/ggrz/fastd-blacklist.sh $PEER_KEY"
Die Blacklist ist noch nicht integriert aber zur Vollständigkeit hier dennoch angegeben:
/etc/fastd/ggrz/fastd-blacklist.sh
#!/bin/bash
PEER_KEY=$1
if /bin/grep -Fq $PEER_KEY /etc/fastd/ggrz/fastd-blacklist.json; then
exit 1
else
exit 0
fi
/etc/cron.d/update-fastd-blacklist
# Global variables SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # Update blacklist every 15 minutes. */15 * * * * root wget http://irgendwo.de/fastd-blacklist.json -O /etc/fastd/ggrz/fastd-blacklist.json > /dev/null
Exit-VPN
sudo apt-get install openvpn
Config und Scripte einfach in /etc/openvpn kopieren.Die VPN-Config um folgende zwei Zeilen für die Scripte erweitern:
up /etc/openvpn/openvpn.-up.sh down /etc/openvpn/openvpn. -down.sh
Noch das Interface anpassen:
dev exitVPN
IC-VPN
sudo apt-get install tinc bird bird6
Die Konfigurationsdateien sind mit der Gentoo-Anleitung identisch.
Firewall
Layer 3
sudo apt-get install iptables-persistent
Die Regeln genauso wie in der Gentoo-Anleitung einfügen aber zum Abspeichern folgendes eingeben:
sudo iptables-save | sudo tee /etc/iptables/rules.v4 sudo ip6tables-save | sudo tee /etc/iptables/rules.v6
Layer 2
sudo apt-get install ebtables bridge-utils
Regeln wie in der Gentoo-Anleitung einfügen und wie folgt abspeichern:
sudo EBTABLES_ATOMIC_FILE=/root/ebtables-atomic ebtables -t nat --atomic-save sudo EBTABLES_ATOMIC_FILE=/root/ebtables-atomic ebtables -t nat --atomic-commit
In der Datei /etc/default/ebtables folgendes ändern damit die Regeln beim Systemstart wieder hergestellt werden:
EBTABLES_LOAD_ON_START="yes"
Dienste
NTP
sudo apt-get install ntp
Da die Host-Uhr des V-Server falsch lief habe ich NTP angepasst damit die Uhr von NTP gestellt wird.Ansonsten kann die Konfiguration aus der Gentoo-Anleitung 1:1 übernommen werden.
/etc/ntp.conf
# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help driftfile /var/lib/ntp/ntp.drift statistics loopstats peerstats clockstats filegen loopstats file loopstats type day enable filegen peerstats file peerstats type day enable filegen clockstats file clockstats type day enable server 0.debian.pool.ntp.org iburst server 1.debian.pool.ntp.org iburst server 2.debian.pool.ntp.org iburst server 3.debian.pool.ntp.org iburst # listen at localhost and mesh only #interface ignore wildcard #interface listen 127.0.0.1 #interface listen ::1 #interface listen 10.181.0.12 #interface listen fdb5:78b:64cc::12 # only use local time, synced with kvm host time #tos orphan 1 # By default, exchange time with everybody, but don't allow configuration. restrict -4 default kod notrap nomodify nopeer noquery restrict -6 default kod notrap nomodify nopeer noquery # Local users may interrogate the ntp server more closely. restrict 127.0.0.1 restrict ::1
Unter KVM muss die Uhrzeit-Quelle erst angepasst werden damit NTP die Uhrzeit auch verändern kann.
/etc/rc.local
echo tsc > /sys/devices/system/clocksource/clocksource0/current_clocksource
tsc ohne NTP auf einen V-Server zu verwenden ist keine gute Idee da diese sehr schnell nach dem Mond läuft.
Diese Lösung ist nicht 100% sauber aber mir hats genügt.
Hinweis: NTP bindet sich automatisch an neue Interfaces.
dnsmasq
/etc/resolv.conf
search ffggrz nameserver 127.0.0.1 nameserver 8.8.8.8
Die hier gezeigte dnsmasq.conf und damit auch das Update-Script ist noch nicht entgültig geklärt, daher sollte diese aus der Gentoo-Anleitung verwendet werden!
/etc/dnsmasq.conf
### Allgemeines #ignores README.md from Github-README #conf-dir=/etc/dnsmasq.d,.md #or use only with with .conf extension conf-dir=/etc/dnsmasq.d,*.conf bogus-priv no-resolv no-poll expand-hosts domain-needed cache-size=4096 strict-order interface=ggrzBR bind-interfaces ### DNS # DNS Server server=193.28.153.254 server=213.73.91.35 server=8.8.8.8 server=8.8.4.4 local=/ffggrz/ domain=ffggrz ### DHCP / RA dhcp-authoritative #log-dhcp dhcp-range=10.181.3.1,10.181.4.254,3m dhcp-option=option:router,10.181.0.12 dhcp-option=option:dns-server,10.181.0.12,10.181.0.11,10.181.0.13,8.8.8.8 dhcp-option=option:ntp-server,10.181.0.12 dhcp-option=option:domain-search,ffggrz ### MTU 1280 ##dhcp-option-force=26,1280 dhcp-range=set:v6,::,constructor:ggrzBR,slaac,ra-only,3m dhcp-option=tag:v6,option6:dns-server,[fdb5:78b:64cc::12],[fdb5:78b:64cc::11],[fdb5:78b:64cc::13],[2001:4860:4860::8888] dhcp-option=tag:v6,option6:ntp-server,[fdb5:78b:64cc::12],[fdb5:78b:64cc::11],[fdb5:78b:64cc::13] dhcp-option=tag:v6,option6:domain-search,ffggrz #enable-ra #ra-param=ggrzBAT,low,0,0 #ra-param=ggrzBR,high,60,1200
/etc/cron.d/update-dnsmasq-hostfile
# Global variables SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # Update hostsfile every 15 minutes. */15 * * * * root /usr/local/bin/update-dnsmasq-hostsfile > /dev/null
/usr/local/bin/update-dnsmasq-hostsfile
#!/bin/bash
# dnsmasq configuration directory
#HOSTSFILE_DIR=/etc/dnsmasq_hostsfile.d/
#CONF_DIR=/etc/dnsmasq_hostsfile.d/
CONF_DIR=/etc/dnsmasq.d/
function getCurrentVersion() {
# Get hash from latest revision
git log --format=format:%H -1
}
cd $CONF_DIR
# Get current version hash
GIT_REVISION=$(getCurrentVersion)
# Automagically commit local changes
# This preserves local changes
git commit -m "CRON: auto commit"
# Pull latest changes from upstream
git fetch
git merge origin/master -m "Auto Merge"
# Get new version hash
GIT_NEW_REVISION=$(getCurrentVersion)
echo "old: $GIT_REVISION"
echo "new: $GIT_NEW_REVISION"
if [ $GIT_REVISION != $GIT_NEW_REVISION ]
then
# Reload updated configuration
echo "Reload dnsmasq configuration."
cat $CONF_DIR/ffggrz-static.conf | sed -r 's/^dhcp-host=([A-Fa-f0-9:]*),([^,]*),([0-9]*)\\.([0-9]*)\\.([0-9]*)\\.([0-9]*).*/ptr-record=\\6.\\5.\\4.\\3.in-addr.arpa,\\2/' | grep '^ptr-record' > $CONF_DIR/ptr_records_from_static
service dnsmasq force-reload
fi
Im Github sollte es zwei Konfigurationsdateien geben, eine für die DNS-Auflösung (A, MX, NS, AAA, CNAME, TXT, ...) und eine für statische DHCP IP-Vergabe.
Beispiel:
ffggrz-dns.conf
# Config fuer zusaetlich Domains #test (Marcus) address=/bla.ffggrz/10.181.0.101 #test (Eric) address=/1.eric.ffggrz/10.181.0.120
ffggrz-static.conf
#Config fuer feste IPs und gleich passende Domain(IN-A) #test (Marcus) dhcp-host=68:9c:5e:9f:83:15,test_stadtmitte.ffggrz,10.181.0.102 #test (Eric) dhcp-host=4C:34:88:29:54:A5,eric-1.ffggrz,10.181.0.120
Da dnsmasq die README.md aus dem Github einlesen würde muss im dnsmasq entweder alle *.md ausgeschlossen oder nur *.conf geladen werden.
Hinweis: dnsmasq bindet sich automatisch an neue Interfaces.
Hinweis: Verzeichnis /etc/dnsmasq.d muss nicht erstellt werden!
ALFRED
cd /usr/local/src/ wget http://downloads.open-mesh.org/batman/releases/batman-adv-2015.1/alfred-2015.1.tar.gz tar -xzf alfred-2015.1.tar.gz cd alfred-2015.1/ make CONFIG_ALFRED_GPSD=n sudo make CONFIG_ALFRED_GPSD=n install
Hinweis: Alfred wird von FastD gestartet!
vnstat/vnstati
sudo apt-get install vnstat vnstati sudo vnstat -u -i ggrzBR sudo vnstat -u -i ggrzBAT sudo vnstat -u -i exitVPN sudo vnstat -u -i ggrzTUN1 sudo vnstat -u -i ggrzTUN3 sudo vnstat -u -i icVPN sudo chown vnstat:vnstat /var/lib/vnstat/* sudo service vnstat restart
/etc/cron.d/update-vnstat-webstats.sh
# Global variables SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ */5 * * * * root /usr/local/bin/update-vnstat-webstats.sh
/usr/local/bin/update-vnstat-webstats.sh
#!/bin/sh
#IFACES=$(ls /var/lib/vnstat/)
IFACES="ggrzBAT exitVPN icVPN"
TARGET=/var/www/html/vnstat/
for iface in $IFACES; do
/usr/bin/vnstati -i ${iface} -h -o ${TARGET}${iface}_hourly.png
/usr/bin/vnstati -i ${iface} -d -o ${TARGET}${iface}_daily.png
/usr/bin/vnstati -i ${iface} -m -o ${TARGET}${iface}_monthly.png
/usr/bin/vnstati -i ${iface} -t -o ${TARGET}${iface}_top10.png
/usr/bin/vnstati -i ${iface} -s -o ${TARGET}${iface}_summary.png
done
cat > ${TARGET}index.html <
EOT
for iface in $IFACES; do
sed s/IFACE/${iface}/g >> ${TARGET}index.html <



