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 <