Gluon-Dokumentation der Routing-Regeln

Gibt es den nirgendwo ein Dokument das beschreibt wie das Routing auf einem Freifunkrouter eingerichtet sein sollte? Oder machen das alle nach persönlichem besten Wissen und Gewissen?

Das wäre doch die notwendige Basis um die Abschottung des eigenen Netzwerkes gegen Freifunkverkehr zu prüfen

Wahrscheinlich bin ich nur zu ungeschickt das zu finden.

@MrMM hatte oben die Routingtabelle rauskopiert, die beschreibt eigentlich genau, was du suchst: Code Review auf Sicherheit - #9 von MrMM

Also ich will ja nicht den Methodenhengst raushängen lassen. Aber es gibt doch einen Unterschied zwischen einem Beispiel einer Community

und einem Dokument / Wikieintrag / Schmierzettel das die Ziele und Spezifikation einer Softwarelösung beschreibt.

Machen das wirklich alle aus dem Bauch auf Basis von anderen Beispielen ohne das man sich mal hingesetzt hat und das einigermaßen zu dokumentieren? Es ist ja nicht so das Linuxroutingtabellen zum allgemeinen Grundwissen in Deutschland zählt und jeder das liest wie ein Jerry Cotton.

Hier wird immer wieder gesagt das Freifunkrouter sicher sind „weil es Routingtabellen gibt“ und nirgendwo ist beschrieben wir so eine „sichere Routingtabelle“ auszusehen hat?

Ich bin etwas verwirrt.

1 „Gefällt mir“

Gluon ist ja unser Firmwareframework. Das generiert die Routingtabellen aus den Einstellungen der site.conf automatisch.

Diese sind recht high-level (sowas wie „Wir nutzen als IPv4-Netz das 10.5.0.0/16“) und sind daher auch menschenlesbar:

Für den Generator muss man in den Gluon-Source schauen.

1 „Gefällt mir“

ah. beginne etwas zu verstehen. Also der Mechanismus wie die Routingtabellen aufgebaut werden ist komplett in dem Framework Gluon verankert.

Für die Firmware legt der Ersteller der Firmware in der Site.conf nur die Netzwerkparameter fest (z.B. IP4/6 Prefix / peers) und der Rest geht automatisiert ohne Möglichkeit auf manuelle Fehler.

Also das ein Firmware Ersteller hier einen Fehler macht was das Routing und die Konfiguration der Firewall macht ist quasi ausgeschlossen (mutwilliges Handeln man beiseite gestellt.)

Dann werde ich mal schauen ob es für das Gluon hier Dokumente gibt die beschreiben was hier geschieht.

3 „Gefällt mir“

@hbauer die Gluon Doku ist hier nicht 100% vollständig (vor allem weil da viel passier), aber wie ich finde sehr gut. Du hast da recht, es wird eben high-level dort drin Konfiguriert und der Rest geschieht automatisch - gluon, fastd, openwrt, busybox …
Im Grunde werden die Dinge so gebaut das Konfigurations-Fehler machen schwer gemacht wird. - aber per design gibt es „gefährliche Setups“

Zu der Site.conf und site.mk hier deren DOKU (das sind 2 wesentliche Dateien der Firmwarebauer) Site configuration — Gluon 2016.1.2 documentation
Hier die letzten commits dazu, kann man ja auch alles nachvolziehen Merge pull request #2361 from freifunk-gluon/cleanup-target-lib · freifunk-gluon/gluon@60c6b40 · GitHub
Hier zu fastD und deren Verschlüsselung (wenn diese überhaupt benutzt wird) Welcome to fastd’s documentation! — fastd 17 documentation

Ich hab hier mal alle ebtables roules aus allen verfügbaren Paketen rausgesucht:

for f in gluon/package/*; do if [ -d $f/files/lib/gluon/ebtables/ ]; then echo; echo -n "### "; cat $f/Makefile |egrep '(TITLE|PKG_NAME:)'; echo; for i in $f/files/lib/gluon/ebtables/*; do echo "#### " $i; echo; cat $i; done; fi; done

PKG_NAME:=gluon-ebtables

  TITLE:=Ebtables support

gluon/package/gluon-ebtables/files/lib/gluon/ebtables/100-dir-chain

chain('IN_ONLY', 'RETURN')
chain('OUT_ONLY', 'RETURN')

gluon/package/gluon-ebtables/files/lib/gluon/ebtables/101-dir-rules

rule 'IN_ONLY --logical-in br-client -i ! bat0 -j DROP'
rule 'OUT_ONLY --logical-out br-client -o ! bat0 -j DROP'

PKG_NAME:=gluon-ebtables-filter-multicast

  TITLE:=Ebtables filters for multicast packets

gluon/package/gluon-ebtables-filter-multicast/files/lib/gluon/ebtables/100-mcast-chain

chain('MULTICAST_OUT', 'DROP')

gluon/package/gluon-ebtables-filter-multicast/files/lib/gluon/ebtables/110-mcast-allow-arp

rule 'MULTICAST_OUT -p ARP --arp-opcode Reply --arp-ip-src 0.0.0.0 -j DROP'
rule 'MULTICAST_OUT -p ARP --arp-opcode Request --arp-ip-dst 0.0.0.0 -j DROP'
rule 'MULTICAST_OUT -p ARP -j RETURN'

gluon/package/gluon-ebtables-filter-multicast/files/lib/gluon/ebtables/110-mcast-allow-babel

rule 'MULTICAST_OUT -p IPv6 --ip6-protocol udp --ip6-destination-port 6696 -j RETURN'

gluon/package/gluon-ebtables-filter-multicast/files/lib/gluon/ebtables/110-mcast-allow-btlpd

rule 'MULTICAST_OUT -p IPv4 --ip-destination 239.192.152.143 --ip-protocol udp --ip-destination-port 6771 -j RETURN'

gluon/package/gluon-ebtables-filter-multicast/files/lib/gluon/ebtables/110-mcast-allow-dhcpv4

rule 'MULTICAST_OUT -p IPv4 --ip-protocol udp --ip-destination-port 67 -j RETURN'

gluon/package/gluon-ebtables-filter-multicast/files/lib/gluon/ebtables/110-mcast-allow-dhcpv6

rule 'MULTICAST_OUT -p IPv6 --ip6-protocol udp --ip6-destination-port 547 -j RETURN'

gluon/package/gluon-ebtables-filter-multicast/files/lib/gluon/ebtables/110-mcast-allow-icmpv6

rule 'MULTICAST_OUT -p IPv6 --ip6-protocol ipv6-icmp --ip6-icmp-type echo-request -j DROP'
rule 'MULTICAST_OUT -p IPv6 --ip6-protocol ipv6-icmp --ip6-icmp-type 139 -j DROP'
rule 'MULTICAST_OUT -p IPv6 --ip6-protocol ipv6-icmp -j RETURN'

rule 'MULTICAST_OUT -p IPv6 --ip6-protocol 0 -j RETURN' -- hop-by-hop

gluon/package/gluon-ebtables-filter-multicast/files/lib/gluon/ebtables/110-mcast-allow-igmp

rule 'MULTICAST_OUT -p IPv4 --ip-protocol igmp -j RETURN'

gluon/package/gluon-ebtables-filter-multicast/files/lib/gluon/ebtables/110-mcast-allow-ospf

rule 'MULTICAST_OUT -p IPv4 --ip-protocol ospf -j RETURN'
rule 'MULTICAST_OUT -p IPv6 --ip6-protocol ospf -j RETURN'

gluon/package/gluon-ebtables-filter-multicast/files/lib/gluon/ebtables/110-mcast-allow-ripng

rule 'MULTICAST_OUT -p IPv6 --ip6-protocol udp --ip6-destination ff02::9 --ip6-destination-port 521 -j RETURN'

gluon/package/gluon-ebtables-filter-multicast/files/lib/gluon/ebtables/300-mcast

rule 'FORWARD --logical-out br-client -o bat0 -d Multicast -j MULTICAST_OUT'
rule 'OUTPUT --logical-out br-client -o bat0 -d Multicast -j MULTICAST_OUT'

PKG_NAME:=gluon-ebtables-filter-ra-dhcp

  TITLE:=Ebtables filters for Router Advertisement and DHCP packets

gluon/package/gluon-ebtables-filter-ra-dhcp/files/lib/gluon/ebtables/200-dir-dhcpv4

rule 'FORWARD -p IPv4 --ip-protocol udp --ip-destination-port 67 -j OUT_ONLY'
rule 'OUTPUT -p IPv4 --ip-protocol udp --ip-destination-port 67 -j OUT_ONLY'

rule 'FORWARD -p IPv4 --ip-protocol udp --ip-destination-port 68 -j IN_ONLY'
rule 'INPUT -p IPv4 --ip-protocol udp --ip-destination-port 68 -j IN_ONLY'

gluon/package/gluon-ebtables-filter-ra-dhcp/files/lib/gluon/ebtables/200-dir-dhcpv6

rule 'FORWARD -p IPv6 --ip6-protocol udp --ip6-destination-port 547 -j OUT_ONLY'
rule 'OUTPUT -p IPv6 --ip6-protocol udp --ip6-destination-port 547 -j OUT_ONLY'

rule 'FORWARD -p IPv6 --ip6-protocol udp --ip6-destination-port 546 -j IN_ONLY'
rule 'INPUT -p IPv6 --ip6-protocol udp --ip6-destination-port 546 -j IN_ONLY'

gluon/package/gluon-ebtables-filter-ra-dhcp/files/lib/gluon/ebtables/200-dir-radv

rule 'FORWARD -p IPv6 --ip6-protocol ipv6-icmp --ip6-icmp-type router-solicitation -j OUT_ONLY'
rule 'OUTPUT -p IPv6 --ip6-protocol ipv6-icmp --ip6-icmp-type router-solicitation -j OUT_ONLY'

rule 'FORWARD -p IPv6 --ip6-protocol ipv6-icmp --ip6-icmp-type router-advertisement -j IN_ONLY'
rule 'INPUT -p IPv6 --ip6-protocol ipv6-icmp --ip6-icmp-type router-advertisement -j IN_ONLY'

PKG_NAME:=gluon-next-node

  TITLE:=Next-node anycast address

gluon/package/gluon-next-node/files/lib/gluon/ebtables/250-next-node

local site = require 'gluon.site_config'
local next_node = site.next_node

rule('FORWARD --logical-in br-client -p ARP --arp-ip-src ' .. next_node.ip4 .. ' -j DROP')
rule('FORWARD --logical-in br-client -p ARP --arp-ip-dst ' .. next_node.ip4 .. ' -j DROP')

rule('FORWARD --logical-out br-client -o bat0 -d ' .. next_node.mac .. ' -j DROP')
rule('OUTPUT --logical-out br-client -o bat0 -d ' .. next_node.mac .. ' -j DROP')
rule('FORWARD --logical-out br-client -o bat0 -s ' .. next_node.mac .. ' -j DROP')
rule('OUTPUT --logical-out br-client -o bat0 -s ' .. next_node.mac .. ' -j DROP')

rule('FORWARD --logical-out br-client -o bat0 -p IPv4 --ip-destination ' .. next_node.ip4 .. ' -j DROP')
rule('OUTPUT --logical-out br-client -o bat0 -p IPv4 --ip-destination ' .. next_node.ip4 .. ' -j DROP')
rule('FORWARD --logical-out br-client -o bat0 -p IPv4 --ip-source ' .. next_node.ip4 .. ' -j DROP')
rule('OUTPUT --logical-out br-client -o bat0 -p IPv4 --ip-source ' .. next_node.ip4 .. ' -j DROP')

rule('FORWARD --logical-out br-client -o bat0 -p IPv6 --ip6-destination ' .. next_node.ip6 .. ' -j DROP')
rule('OUTPUT --logical-out br-client -o bat0 -p IPv6 --ip6-destination ' .. next_node.ip6 .. ' -j DROP')
rule('FORWARD --logical-out br-client -o bat0 -p IPv6 --ip6-source ' .. next_node.ip6 .. ' -j DROP')
rule('OUTPUT --logical-out br-client -o bat0 -p IPv6 --ip6-source ' .. next_node.ip6 .. ' -j DROP')

PKG_NAME:=gluon-radvd

  TITLE:=Advertise an IPv6 prefix from the node

gluon/package/gluon-radvd/files/lib/gluon/ebtables/300-radv-input-output

rule 'INPUT -p IPv6 --ip6-protocol ipv6-icmp --ip6-icmp-type router-solicitation -i bat0 -j DROP'
rule 'OUTPUT -p IPv6 --ip6-protocol ipv6-icmp --ip6-icmp-type router-advertisement -o bat0 -j DROP'

Vielleicht kann das mal jemand dokumentieren, was welche Regel genau tut?

Allerdings ist mir noch nicht klar, wie diese Regeln beim start des Routers so was sie @MrMM hier beschrieben hat generieren.

Anscheinend ist auch diese Datei noch wichtig:

gluon/package/gluon-mesh-vpn-fastd/files/lib/gluon/mesh-vpn-fastd/iptables.rules

mit dem Inhalt

*nat
-I OUTPUT -m owner --gid-owner gluon-fastd -o lo -d 127.0.0.1 -p udp --dport 53 -j DNAT --to-destination :54
COMMIT

#ebtables

Anscheinend benutzt man ebtables und iptables auf dem selben system, iptables um IP-Pakete zu routen und ebtables um andere Pakete zu routen (radv, dhcp, arp, ripng, ospf, ip6-icmp, igmp, mcast, babel und btlpd).

Den Hinweis hab ich hier gefunden:

ebtables tries to provide the bridge firewalling that iptables cannot provide, namely the filtering of non-IP traffic.

Hallo rubo77

boah da hast Du aber ganz schon was ausgegraben. Ich glaube die Reihenfolge sollte sein

  • Wie und wann werden in Gluon die eptables/iptables Funktionen aufgerufen?
  • Was genau machen die einzelnen Funktionen

Wann man das sauber dokumentieren könnte hätte man ein schönes Dokument. In der Richtung werde ich mal weitersuchen.

Ich stehe jetzt echt auf dem Schlauch. Ich finde Dokumentation wie man mit Gluon die Firmware bauen kann und ein wenig Doku wie man dafür entwickeln kann.

Aber ich finde nichts was mir mal erklärt wie

  • die grobe Architektur ist,
  • wie hier was gebaut wird und
  • wie am Ende denn ein Router arbeitet wenn er denn fertig ist

Ich habe jetzt echt lange leider erfolglos versucht etwas zu finden. Kann mir mal jemand mit einem Link auf die Sprünge helfen?

An so einer Doku wäre ich auch sehr interessiert. Danke schon mal an @hbauer für den Einsatz. Wenn am Ende ein quasi „offizielles“ Dokument rauskommt hilft das mit Sicherheit allen Communites.

Es gibt schon mal erklärungen, was die ebtables pakete sollen:

Moin!
Auch auf die Gefahr hin das die an dieser Diskussion beteiligten Personen schon weitergezogen sind, finde ich die Frage wichtig und exakt das, was ich auch fragen würde.
Daher recycle ich diesen Diskussionsfaden einfach mal. :slight_smile:

Ich will mich jetzt in Freifunk einarbeiten und stehe genau vor diesen Fragen.
Hast du etwas gefunden, am besten ein Diagramm, was die Routen, Bridges, Tunnel und Gateways bisschen näher erläutert, als diese Flyer hier?
https://wiki.freifunk.net/Freifunk-Styles/Flyer
(Nichts gegen die Flyer, die sind Top!)
Besonderes die „grobe Architektur“ finde ich ist schwer zu erfassen. Nicht jeder kennt sich mit ipv4/6, batman, fastd und all den anderen, an der „Freifunk-Magie“ beteiligten, Technologien aus, um so einen Knoten direkt zu verdauen. Idee?

Wenn du wissen möchtest, wie ein Supernode funktionieren kann (gibt auch andere Modelle)

https://eulenfunk.readthedocs.io/en/stable/supernode.html

Danke, du verstehst genau um was es mir geht.
Ich habe diese Prozessdiagramme tatsächlich schon vorher gefunden und fand diese Präsentation vorbildlich.
So hatte ich gehofft dass es so etwas auch für das „große Ganze“ gibt. Oder zumindest für den Teil, welcher von dem Gluon-Framework automatisch generiert wird.

Für Gluon kenne ich eine solche Aufbereitung der Totalen nicht.

Was schon mal auf die richtige Spur bringen kann ist die Grafik zur TransportMTU-Bestimmung auf dem WAN-Tunnel, denn dort sieht man die Paketschichten anschaulich.

https://gluon.readthedocs.io/en/v2018.2.x/user/faq.html

Das verheißt nichts gutes, wenn du da nichts kennst. :frowning:

Korrigiere mich bitte falls ich blödsinn erzähle, aber ich verstehe die Reihenfolge wie folgt:
IPv4/6 => batman-adv => fastd

Ich bin in grafischen dingen nicht sonderlich begabt, aber eventuell hilft es sich da schematisch anzunähern.
20190512_ff_gluon_ablaufdiagram
So stelle ich mir das im Augenblick vor. Ist das eventuell auch für andere verständlich dargestellt?