===== Aufsetzen eines Servers/Gateways mit BATMAN-adv/Fastd/OpenVPN ===== Dieses Howto ist für Leute gedacht die selber einen Server bereitstellen wollen der als Knotenpunkt und vielleicht auch als Gateway (Exit-Node/Gateway) dient. Das heißt das viele Knoten (z.B. Router) sich über diesen Server verbinden und Daten austauschen können. Ebenso kann für alle Nutzer eine Internetanbindung über einen VPN-Provider zur Verfügung gestellt werden. Die Anleitung ist definitiv für fortgeschrittene Nutzer gedacht und wurde für Debian-artige Systeme geschrieben. * Einen fastd-Server [[fastd_server|aufsetzen]] * Aufsetzen der [[statusseite_aufsetzen|Statusseite]]. * [[openvpn_gateway|Verbindung]] per OpenVPN ins Ausland * Batman-adv [[batman_installieren|installieren]] * [[splash_einrichten|Splash-Seite]] mit nodogsplash aufsetzen (optional) * [[ic-vpn|Intercity-VPN]] einrichten * [[autoupdater-setup|Autoupdater]] einrichten **Aufsetzen des Watchdog-Scriptes** Das Watchdog-Script testet den OpenVPN Anschluss on Internet verfügbar ist und gibt das im Freifunk-Netz bekannt. Das Script bemötigt noch tunctl und brctl: apt-get install uml-utilities apt-get install bridge-utils Dieses Script konfiguriert und startet die Dienste. #!/bin/bash exec >/var/log/freifunk_watchdog.log 2>&1 date mesh_mac=`cat /sys/class/net/eth0/address` #translate to local administered mac a=${mesh_mac%%:*} #cut out first hex a=$((0x$a | 2)) #set second bit to 1 a=`printf '%02x\n' $a` #convert to hex mesh_mac="$a:${mesh_mac#*:}" #reassemble mac mac2ip() { #Get the IP of a node by MAC. mac=$1 ff_subnet=29 [ -z "$mac" -o -z "$ff_subnet" -o ${#mac} -ne 17 ] && { echo "0.0.0.0" exit 1 } seed=0 for x in $(echo $mac | tr ":" "\n"); do seed=$((seed + 0x$x + (0x$x << 8) + (0x$x << 16))) done addr_t=$((1900545 + (seed % 65278))) addr_c=$(((addr_t & 0xff00) >> 8)) addr_d=$(((addr_t & 0x00ff) >> 0)) echo "10.$ff_subnet.$addr_c.$addr_d" } mesh_ip=`mac2ip "$mesh_mac"` is_running() { ps aux | grep -v grep | grep "$1" > /dev/null } error() { echo "(E) $1" exit 1 } if is_running "fastd"; then echo "(I) Fastd supernode is running." else echo "(I) Start Fastd supernode." fastd --config /etc/fastd/vpn/fastd.conf --daemon || error "Cannot start fastd." fi if batctl o &> /dev/null; then echo "(I) batman-adv is running." else echo "(I) Setup batman-adv." modprobe batman-adv echo "(I) Detach all interfaces from batman-adv." batctl if del fastd_bat &> /dev/null batctl if del dummy_bat &> /dev/null echo "(I) Create and attach dummy_bat to control the batman-adv primary interface mac." tunctl -t dummy_bat > /dev/null ifconfig dummy_bat down #needed? ifconfig dummy_bat hw ether "$mesh_mac" mtu 1400 0.0.0.0 up batctl if add dummy_bat || error "Failed to attach interface dummy_bat to batman-adv." batctl if add fastd_bat || echo "Failed to attach interface fastd_bat to batman-adv." ifconfig bat0 up echo "(I) Configure batmn-adv." #for now we don't have internet yet echo "client" > /sys/class/net/bat0/mesh/gw_mode echo "3000" > /sys/class/net/bat0/mesh/orig_interval echo "1" > /sys/class/net/bat0/mesh/bridge_loop_avoidance echo "(I) Setup br-mesh." #We could use just plainbat0 instead of br-mesh #But it might give us moreflexibility in the future. brctl addbr br-mesh brctl addif br-mesh bat0 echo "(I) Set IP '$mesh_ip' for br-mesh." ifconfig br-mesh "$mesh_ip" netmask 255.255.0.0 up fi is_running "openvpn " || /etc/init.d/openvpn start vpn_interface="vpn_exit" ping_servers() { echo "(I) Try to ping root servers on '$vpn_interface':" #shuffle list and pick n entries pick() { local n=$1; shift; local s="`echo \"$@\" | tr ' ' '\n' | awk 'BEGIN { srand() } { print rand() "\t" $0 }' | sort -n | cut -f2- | tr '\n' ' '`" get() { shift $(($#-$1)); echo "$@"; } get $n $s } #check if any root server can be reached via default gateway and wan interface IPCHECK="192.33.4.12 128.8.10.90 193.0.14.129 198.41.0.4 192.228.79.201 192.5.5.241 192.36.148.17 192.58.128.30" for ip in `pick 3 $IPCHECK`; do echo -n "(I) Ping '$ip' " if ping $ip -c 1 -I $vpn_interface -q -W 1 > /dev/null 2>&1; then echo "- success." return 0 else echo "- failed." fi done echo "(W) Cannot reach any tested IP." return 1 } if ifconfig "$vpn_interface" &> /dev/null && ping_servers; then echo "(I) Internet access on '$vpn_interface' => Server mode." batctl gw_mode server 8MBit/8MBit else echo "(I) No Internet access on '$vpn_interface'. => Client mode." batctl gw_mode client fi echo "(I) Done." Dieses Script kann einmal nach dem Systemstart oder regelmäßig durch cron aufgerufen werden. Dafür muss folgende Zeile an die /etc/crontab angehängt werden: */5 * * * * root /root/freifunk_watchdog > /dev/null Wichig ist dabei, dass das Script ausführbar ist: chmod a+x freifunk_watchdog Ein Eintrag in /etc/hosts sorgt dafür das der Name "node" in eine Anycast-Adresse übersetzt wird die jeder Router hat. Damit läßt sich der Router, mit dem man verbunden ist, bequemer finden. echo "fdef:17a0:ffb1::0 node" >> /etc/hosts