Frankfurt:IP Konzept
Allgemeines
Sowohl IPv4 als auch IPv6 werden im Freifunk Frankfurt genutzt. Alle Clients sind in einem IPv4-Netz. Alle physischen Server sind direkt über Batman miteinander verbunden. Sofern auf einer physischen MAschine LXC-Container ausgeführt werden, wird das im host liegende batman-Interface über eine batbridge auch allen Containern zur Verfügung gestellt.
Innerhalb des Freifunk gibt es eine eigene Namensauflösung mit der domain .ffffm
Ressourcen:
IPv4-Aufbau
- Frankfurt hat den IPv4 Bereich 10.126.0.0/16
- Jeder Supernode erhält eine statische IPv4-Adresse.
- Clients und Server befinden sich in der selben Broadcast-Domäne.
- Der in der Tabelle angegebene IP Adressbereich wird je fastd-Server an clients vergeben (mit Ausnahme der ersten 9 IP-Adressen je /21er Bereich. Diese sind reserviert für in diesem Netzsegment genutzte Infrastruktur
- Auf jedem Supernode läuft ein Dhcp-Server, der die IPv4-Adressen an die Clients vergibt. Der Dhcp auf Supernode a (a ist Element N+, a kleiner 8) arbeitet für das Netz 10.126.(8*(a-1).0/16. Daraus ergibt sich folgende Adressbereichzuordnung:
- statischer Bereich für clients: 10.126.254.0/24. Die Verwaltung erfolgt per
wiki in der Tabelle unten.
- Serverbereich: 10.126.255.0/24
10.126.0.3 | 10.126.0.10 | 10.126.7.255 | |
10.126.8.1 | 10.126.8.10 | 10.126.15.255 | |
10.126.16.1 | 10.126.16.10 | 10.126.23.255 | |
10.126.24.1 | 10.126.24.10 | 10.126.31.255 | |
10.126.32.1 | 10.126.32.10 | 10.126.39.255 | |
10.126.40.1 | 10.126.40.10 | 10.126.47.255 | |
10.126.48.1 | 10.126.48.10 | 10.126.55.255 | |
10.126.56.1 | 10.126.56.10 | 10.126.63.255 | |
10.126.64.1 | 10.126.64.10 | 10.126.71.255 | |
10.126.72.1 | 10.126.72.10 | 10.126.75.255 | |
10.126.76.1 | 10.126.76.10 | 10.126.80.255 | |
10.126.81.1 | 10.126.81.10 | 10.126.84.255 | |
10.126.85.1 | 10.126.85.10 | 10.126.88.255 | |
10.126.255.6 | |||
10.126.255.12 | |||
10.126.255.20 | |||
10.126.255.30 |
host | statische IP(s) |
---|---|
Magnus' Testhost | 10.126.254.254 |
Thomas' Testhost | 10.126.254.253 |
Jürgen | 10.126.254.222 |
Benjamin (WBS) | 10.126.254.150-165 |
Igors Streaming Server | 10.126.254.122 |
Igors Lap | 10.126.254.102 |
Igors Webserver | 10.126.254.101 |
Igors Server Gateway | 10.126.254.100 |
Thomas W. | 10.126.254.42 |
- Server werden per fastd ebenfalls an Supernodes angebunden und mit festen Ip-Adressen Absteigend in 10.126.255.0/24 angelegt
- Für diese Server werden die Ip-Adressen statisch vergeben. Namensauflösung wird über die beiden Dns-Server eingerichtet.
- Die Namensauflösung für die Domain .ffm.freifunk.net liegt bei Hurricane Electric
Dokumentation Serveraufbau
allgemeine Mechanismen
Alle Server sind nach folgendem Schema aufgebaut:
- Debian Wheezy
- Security Updates werden automatisch eingespielt
- Alle Server sind im backbone-Netz 10.126.255.0/24 und werden innerhalb des Freifunk adressiert
- automatische Überwachungsmails, werden an root von mail.ffm.freifunk.net
verschickt (Steuerung des entgültigen Empfängers über aliases-file).
- Als Smarthost wird mail.ffm.freifunk.net genutzt.
- Die Grundlage zum Setup aller Server wird durch Puppet-Scripte gelegt. Es gibt zwei Ausprägungen: Supernode.pp und lxchost.pp
- Security updates von debian security per cron-apt werden automatisch installiert.
- Postfix wird als MTA genutzt (weil exim nicht automatisch mails an user@[IP-Adresse] weitergibt).
- Alle Server werden über ein per fwbuilder konfigurierte Firewall gesichert. Die Quelldaten dazu liegen in der Technikecke im Seafile-Share. Dort werden auch Portweiterleitungen konfiguriert
- Zugang zu den Servern ist ausschließlich per ssh-key möglich
- Daten liegen immer unter /var/data/
LXC
LXC-Hosts exportieren zwei Netzwerkinterfaces in jeden Container:
- eine host-only Schnittstelle im Netz 192.168.100.*/24
- ein in die batbridge gebridgetes Netzwerkinterface über das die Container und einer IP in 10.126.255.0/24 direkt mit dem Freifunk verbunden werden
LXC-Container lassen sich mit lxc-create -t freifunk -n "SERVERNAME.ffm.freifunk.net" anlegen und danach mit lxc-start -d -n "SERVERNAME.ffm.freifunk.net" starten. Das freifunk-template erstellt eine debian-wheezy-Maschine. Danach sind folgende manuellen Schritte erforderlich:
- Die Netzwerkkonfiguration des Containers für die beiden interfaces
- Zuweisung einer unique MAC-Adresse für beide interfaces
- Zuweisung einer freien IP-Adresse im Serverbereich des Freifunknetzes und im lokalen Klasse-C-Netz
- Einrichtung des DNS A-Records in .ffffm
- Eintragung des hostname.bb.ffm.freifunk.net-A-Records in http://dns.he.net
- Anpassung der Firewall mit fwbuilder (seafile-Technikgruppe) für Port-Weiterileitung des ssh-Ports und Ports der benötigten Dienste.
- cp /root/.ssh/authorized_keys NEUER-PUPPET-CONTAINER/roots/root/.ssh
- Installation von puppet und git im Container und Einrichtung der grundlegenden Dienste
- apt-get install puppet git
- cd /etc/puppet/; rm -rf modules ;git clone http://github.com/freifunk-ffm/supernode_puppet modules; cd modules
- puppet apply lxchost.pp
- In der Ausgabe das mail-Passwort heraussuchen und auf dem Mailserver anmelden. Dort doveadm -sssha ausühren und das Ergebnis in /etc/dovecot/passwd eintragen
DataFabrik
- Hostname datalxc.ffm.freifunk.net, fastd2.ffm.freifunk.net
- Nutzung: enthält die oben genannten 3 VMs für Freifunk
- Zugang: Jan
LXC-Host
hostname: datalxc.ffm.freifunk.net Zugang: Jan, Markus, Christof
Hosting von:
- register - abgeschaltet
- seafile
- radicale
- backup (bacula)
- proxy2
- otrs
- oc - deaktiviert
register.ffm.freifunk.net
Container für den Registrierungsserver. Der Container ist unter register.bb.ffm.freifunk.net im Backbone erreichbar. Hier läuft Apache mit einer Ruby-Anwendung, welche die Webseite des Registrierungsportals erzeugt. -- abgeschaltet --
seafile.ffm.freifunk.net
Dateiablage für Vereinsarbeit und Vorstand.
radicale.ffm.freifunk.net
Das ist eine radicale-Instanz. Rechteverwaltung gibt es in /etc/radicale/rights, Userzugriff per htpasswd in /etc/radicale/radicale.passwd. Die Collections liegen in /var/lib/radicale/collections
oc.ffm.freifunk.net
Das ist eine Owncloud-Installation um die Projektkoordination zu vereinfachen und Todo-Listen, Daten und Kalender zu teilen. -- abgeschaltet --
yacy Suchmaschine
Hostname: yacy.ffm.freifunk.net, search.ffffm yacy.bb.ffm.freifunk.net Zugang: Jan, Markus, Michael, Christof -- abgeschaltet --
Supernode
Hostname: fastd2.ffm.freifunk.net Zugang: Jan, Markus, Christof
Die VM ist vollständig mittels Puppet-Script aufgebaut.
Uberspace
Hostname: uber.ffm.freifunk.net - 95.143.172.233, uber.bb.ffm.freifunk.net Ausstattung: 1GB Ram, 2 CPUs, 20GB HDD Zugang haben: Markus, Magnus, Jan und Christof. Kontakt: hallo at uberspace. de
Es ist vereinbart, dass der Durchsatz am Tag (10 Uhr Morgens bis 2 Uhr Nachts) auf 5 Mbit/s beschränkt ist. Nachts wird die Beschränkung auf 50mbit/s gelockert. Diese Anforderung ist durch ein entsprechendes Trafficshapingscript umgesetzt.
Der Server ist mit Hilfe von LXC weiter partitioniert. Die Container liegen im 192.168.1.0/24 Netz und sind lokal über die in diesem Netz oder im Backbone-Netz liegenden Adressen erreichbar.
Direkt auf dem Server läuft alfred.
- Hier läuft das backend der ffmap. Das fertige nodes-file wird per scp zum mapserver kopiert. Der Batman abzug wird alle 5 Minuten per Cron erzeugt, das Nodes-File ebenfalls per cron. Die Applikation liegt in /srv/ffmap-backend. Zum betrieb ist alfred-json, batadv-vis und alfred erforderlich. alfred und batadv-vis werden im on-up-script von fastd nach batman gestartet.
Die Maschine führt folgende lxc-Container aus
- database.ffm.freifunk.net - abgeschaltet
- dns.ffm.freifunk.net
- inetgw.ffm.freifunk.net
- mail.ffm.freifunk.net
- map.ffm.freifunk.net
- proxy.ffm.freifunk.net
- stats.ffm.freifunk.net
mail.ffm.freifunk.net
Das ist der Mailserver. Den haben wir, damit wir an einer Stelle Mailregeln und Empfänger aller systemgenerierten Mails steuern können. Der Container ist unter mail.bb.ffm.freifunk.net im Backbone erreichbar.
build.ffm.freifunk.net
In diesem Container sind Build-Tools installiert. Gegebenenfalls kann diese später als Buildserver für Firmwares oä genutzt werden. Bislang geht es um den Bau von Paketen, die für andere Container kompiliert werden müssen und darum, eine Sandbox zu haben. Der Container ist unter build.bb.ffm.freifunk.net im Backbone erreichbar. -- abgeschaltet zur Lastreduktion
database.ffm.freifunk.net
In diesem Container läuft eine postgresql-Instanz, die für den Registrierungsserver genutzt wird. Der Container ist unter database.bb.ffm.freifunk.net im Backbone erreichbar. -- abgeschaltet --
proxy.ffm.freifunk.net
Hostname: proxy.ffm.freifunk.net proxy.bb.ffm.freifunk.net
- Hier läuft ein Apache, der die ssl-Verbindung für *.ffm.freifunk.net terminiert und die Weiterleitung auf den richtigen Server durchführt. Der Apache enthält mehrere vhosts, unter Anderem für dl.ffm.freifunk.net.
- /var/www/files/ffm/firmware wird per rsync exportiert.
- Ein seafile-Client synchronsisiert die Daten aus /var/www/files/public /var/www/files unter dl.ffm.freifunk.net exportiert
- Auf dem Proxy wird gemeinsam mit dem anderen statischen Content die inetgw-Infopage gehostet:
mkdir -p /srv/map.ffm.freifunk.net/infopage cat >>/srv/map.ffm.freifunk.net/infopage/index.txt<<EOF #------------------- #bgp-server Frankfurt1 #------------------- #ping ip to check if the network behind IC-VPN server is reachable. IP should be one from network and #not from the transfer net (10.207.x.y), because this is already known to each IC-VPN Server ping_ip=10.126.255.1 #topology url to retrieve the network dot-topology from (seen from same node). Allows to #create a global freifunk graph. topo_url=http://10.207.0.35/infopage/icvpn-graph.dot #to build a global network graphic from each dot-file (defined by topo_url), a "port" must be specified. #"port" is the server or node that represents the network gateway (router). #The string that is specified here is the name of the node in the dot-file that is the router that routes the #traffic in to the city network. # ... DD_Node ---- BGB_Router ----- IC_VPN ---- BGB_Router --- Augsburg_Node .... topo_dot_port="10.207.0.35" #internal web portal that may be different to the public city freifunk internet presence. #it is only reachable from within the city networks. portal_ip=10.207.0.35 #public web portal host. This is reachable from internet. public_portal_url=http://ffm.freifunk.net/ EOF cat >>/etc/apache2/conf.d/infopage <<EOF <Location /infopage > Options +Indexes DirectoryIndex index.txt </Location> EOF /etc/init.d/apache2 reload
map.ffm.freifunk.net
Auf diesem Server läuft das Frontend und das Backend der ffmap in einem Apache. Der Container ist unter map.bb.ffm.freifunk.net im Backbone erreichbar.
apt-get install apache2 mkdir -p /srv/map.ffm.freifunk.net cd /srv/map.ffm.freifunk.net git clone https://github.com/freifunk-ffm/ffmap-d3.git
Der Apache muss zusätzlich konfiguriert werden:
cat >>/etc/apache/sites-enabled/000-default<<EOF <VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /srv/map.ffm.freifunk.net <Directory /> Options FollowSymLinks AllowOverride None </Directory> RedirectMatch /$ http://map.ffm.freifunk.net/ffmap-d3/geomap.html ErrorLog ${APACHE_LOG_DIR}/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> EOF /etc/init.d/apache2 restart
Das Setup des Backends auf uber.bb.ffm.freifunk.net ist wie folgt:
apt-get install python3 rrdtool echo /usr/sbin/batctl vm server >> /etc/fastd/mesh-vpn/fastd-up cat >>/etc/cron.d/map-backend<<EOf 10 0/2 * * * root /usr/bin/wget -q -nv -O /srv/ffmap-backend/registerNodes.json http://10.126.255.7/nodes.json * * * * * root /srv/ffmap-backend/mkmap.sh /tmp EOF
inetgw.ffm.freifunk.net
Container für das Routing des Traffic ins ICVPN. Der Container ist unter inetgw.bb.ffm.freifunk.net im Backbone erreichbar. Routing ins Internet findet nicht statt.
stats.ffm.freifunk.net
Alle Server im Backbone werden per collectd überwacht. Der Container ist unter stats.bb.ffm.freifunk.net im Backbone erreichbar. Die Erzeugung der Graphen wird durch CGP übernommen. <rev> apt-get install libapache2-mod-php5 </rev> Munin ist für Installationen dieser Größe nicht geeignet.
cat >>/etc/apache/sites-enabled/001-stat<<EOF
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName sstats.ffm.freifunk.net ServerAlias sstats.ffm.freifunk.net
DocumentRoot /var/www/sstats.ffm.freifunk.net <Directory /var/www/sstats.ffm.freifunk.net> Allow from all Options -MultiViews </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
EOF
mon_serv
auf stats.bb.ffm.freifunk.net:
apt-get install libsqlite3-dev rake sqlite3 build-essential libapache2-mod-passenger apache2 apt-get install ruby rdoc ruby-dev libpq-dev libopenssl-ruby rubygems gem install fastthread gem install rails gem install activerecord-postgresql-adapter mkdir -p /srv/stats.ffm.freifunk.net cd /srv/stats.ffm.freifunk.net git clone https://github.com/freifunk-ffm/mon_serv.git cd mon_serv export RAILS_ENV=production
cat >> /srv/stats.ffm.freifunk.net/mon_serv/config/database.yml <<EOF development: adapter: sqlite3 database: db/development.sqlite3 pool: 5 timeout: 5000 test: adapter: sqlite3 database: db/test.sqlite3 pool: 5 timeout: 5000 production: adapter: postgresql encoding: utf8 reconnect: false database: monserv pool: 5 username: USER password: PASSWORD host: db.bb.ffm.freifunk.net EOF
editiere Nutzer und Passwort für Datenbank, danach Installation
vim config/database.yml bundle install bundle exec rake db:setup # Nur ausführen, wenn die DB auch WIRKLICH leer ist!
Der Dienst wird durch den register aufgerufen, sobald ein Node angelegt wird (unabhängig vom registrieren!) Nach dem Setup der Datenbank muss der Datentyp der id-Spalte für die Tabelle nodes und users auf bigint geändert werden!
su - postgres psql -U monserv -W -d monserv -h db.bb.ffm.freifunk.net alter table nodes alter column id set data type bigint ; alter table users alter column id set data type bigint ;
Hinterher noch ein:
bundle exec rake assets:precompile /etc/init.d/apache2 stop /etc/init.d/apache2 start
Collectd
Wir arbeiten in Version 5 mit folgender Konfiguration: cat >>/etc/collectd/collectd.con <<EOF
FQDNLookup true LoadPlugin syslog <Plugin syslog> LogLevel "info" </Plugin> LoadPlugin interface LoadPlugin network LoadPlugin ping LoadPlugin rrdtool LoadPlugin users <Plugin network> Listen "fddd:5d16:b5dd:2::1" "25827" Listen "10.126.255.8" "25826" Listen "192.168.100.116" "25827" </Plugin> <Plugin rrdtool> DataDir "/var/lib/collectd/rrd" </Plugin> Include "/etc/collectd/filters.conf" Include "/etc/collectd/thresholds.conf" Include "/etc/collectd/mesh-conf/ping.conf" EOF
Es gibt zwei Custom-Plugins, die in diesem collectd-Server ausgeührt werden.
- Das NEtzgrößenplugin arbeitet ermittelt per exec-Mechanismus die Netzgröße und Anzahl der verbundenen vpn-hosts über die json-files aus der map
- Das Batman-Plugin ist in C geschrieben, verwendet eigene collectd-Datentypen und eigenen Code. Der Checkout aus dem git liegt in /root
DNS
Hier läuft ein bind für die Domain .ffffm
IPv6-Aufbau
Auf dem fastd-Server läuft ein radvd, der das Netz fddd:5d16:b5dd/64 und 2001:1A50:11:4::1/64 announced. Die ping-Statistiken vom stats.ffm.freiunk.net werden über die link-local adressen erzeugt. Inbound-IPv6 über den Uberspace-Host möglich. Outbound IPv6 wird nicht zugelassen, weil wir dafür keine VPN-Tunnel haben.