fff-layer3-vxmesh: join multple client nets with vxlan #82
No reviewers
Labels
No Label
RFC
RFT
WIP
blocked
bsp
bug
build/scripts/tools
duplicate
feature
fixed
layer3
mantis
more details required
needs changes
node
packages/fff
rejected
security
trivial
upstream
No Milestone
No Assignees
5 Participants
Notifications
Due Date
No due date set.
Depends on
#136 fff-layer3-config: Add routerip option
freifunk-franken/firmware
Reference: freifunk-franken/firmware#82
Loading…
Reference in New Issue
No description provided.
Delete Branch "jkimmel/firmware:vxmesh"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Easily span a layer 2 network over a small group of, not necessarily
adjacent, routers.
This patch introduces a new
vxmesh
configuration section. It takescare of setting up a shared client network using vxlan among all
configured routers.
As a result, clients can finally roam between the routers of the mesh.
It integrates well with the underlying layer 3 routing to make best use
of the infrastructure available. This way the network is not depending
on a contiguous layer 2 spanning tree topology and can make use of all
fallback mechanisms of the layer 3 underlay.
This example config ...
... will generate ...
It will also take care and configure the
dhcp.@dnsmasq[0].authoritative
setting depending on whether a vxmeshis enabled or not.
Signed-off-by: Johannes Kimmel fff@bareminimum.eu
Erstmal, die Idee ist toll. Ich hab aber so einige Fragen dazu um das ganze Kontrukt zu verstehen.
MTU
Ich hab auf Anhieb jetzt nichts gefunden das du etwas an der MTU machst. Ich gehe daher mal davon aus, das vxlan Interface wird so groß wie vxlan durch 1500byte passt. Was passiert nun wenn die Router die in der vxlan Group sind z.b. per wireguard (davon ausgehend das wireguard außen herum fragmentieren nicht funktioniert) verbunden sind? Gehts dann innen für die Clients kaputt?
RA und DHCP
Ich gehe mal davon aus, das jeder Router in der vxlan Group sein eigenes v4 und v6 Netz haben sollte:
2.1) Bei IPv4 DHCP antwortet einfach der schnellste DHCP Server und gut, das dürfte kein Problem sein und beim roamen werden die Daten halt durchs vxlan zum richtigen Router geschickt.
2.2) Bei IPv6 werden aber wohl alle RAs genommen oder? D.h. der Client hat u.U. viele Public Adressen? Soweit ich weiß fängt er dann das würfeln an wohin er den Traffic schickt. D.h. der Traffic wird sich immer auf alle Router in der vxlan Group verteilen. Ist das soweit richtig?
Das wars erstmal was mir auf Anhieb eingefallen ist, ich muss mir das ganze nochmal genauer angucken
Hi lemmi,
feine Sache!
Mir ist da der Vorteil, das alles in die /etc/config/gateway zu schreiben, nicht ganz klar. Bis auf das dhcp Ding ist das fast eine Kopie aus der config/network.
Das wird doch die Ausnahme sein, dass das jemand konfiguriert. Waere da nicht ein schoener Wikieintrag (den man so und so machen muss) wie man das "normal" konfiguriert ausreichend?
Andererseits egal, man muss es ja nicht benutzen und kann den Kram gleich in die config/network tippen.
@ChristianD
TL;DR du brauchst 1570er MTU, sonst gehts leider nur so halb.
Der Aufbau macht nur in einem Netz mit genuegend grosser (1570) MTU Sinn. Bisher hatte ich noch keine Geraete, die das nicht schaffen und es muesste jetzt auch mit
b5b0557f13
Wireguard fragmentieren koennen.PMTUD
funktioniert tatsaechlich, also Unicast bricht quasi nicht, aber Multicast traffic wird es nicht ueberleben.Alternative ist das client netz auf 1430 herunterzuschrauben.
Jeder Router braucht seine eigene IPv4, kann aber im selben Subnetz wie die anderen arbeiten. DHCP muss dann entweder ein Geraet uebernehmen, oder man muss die DHCP Ranges unter den Routern aufteilen.
Ja das ist das schoene an IPv6. Einfach auf jedem router die gleiche Subnetzanycastadresse konfigurieren und fertig. Ich untersuch noch, wie ich mit ip6tables die Prioritaet der RAs filtern kann, sodass der naechste Router immer die hoechste Prio hat. Hier gewinnt aber auch in der Regel der Router, der am schnellsten aufloest.
@rohammer
Also ich glaube du unterschaetzt, wie viel behaemmerte Fehler ich schon gemacht habe um nur 3 Geraete sauber zu konfigurieren. Aktuell muss man
n
verschiedene configs in/etc/config/network
sauber halten, das auch noch an mehrere Stellen, und natuerlich noch den Mist in/etc/config/dhcp
nicht vergessen.Dagagen nur einen Block auf ein paar Kisten kopieren ist einfach so viel angenehmer und laesst sich schoener automatisieren (was wirklich wichtig ist, weil man macht das mit dem vxlan ja eigentlich erst, weil man mindestens 3 oder mehr Geraete hat).
Darueber hinaus bin ich weiterhin der Meinung, dass wir am besten nur eine
Source of Truth
haben sollten und man moeglichst nichts in den anderen Dateien zu pfuschen hat.Ich wuerde noch gern in der Zukunft die MTU fuer saemtliche Peerings automatisiert anpassen, die DHCP Ranges berechnen (siehe
2.1.
oben), moeglicherweise einige sinnvolle Defaults setzen (z.B. no-checksumming, falls das etwas bringt beispielsweise) und wie in2.2.
angedeutet etwas schlauere Sachen mit den RAs basteln, um den Traffic besser zu steuern.Ganz weit am Horizont ist noch das vxlan mit babel zu verheiraten, sodass quasi nur noch BUM Traffic ueber das vxlan muss, der Rest mit Hostrouten direkt zum richtigen Router findet, damit auch mehrer Uplinks sauber genutzt werden koennen, ohne vxlan tunneln zu muessen.
Jedenfalls fand ich den Patch so gerade noch handlich. Er tut schon was sinnvolles und man kann erkennen, wo die Reise hin soll. :)
@ -0,0 +1,31 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=fff-vxmesh
Hier waere es gut, wenn layer3 noch im Namen waere, damit klar ist, dass es nichts mit dem node-mesh zu tun hat.
done.
@ -0,0 +32,4 @@
while uci -q delete network.@vxlan_peer[-1]; do :; done
# remove vxmesh0 entry from the client bridge and remove extra whitespaces
uci -q set network.client.ifname="$(uci -q get network.client.ifname | sed s/vxmesh0// | xargs echo)"
echo ist default bei xargs.
@ -0,0 +68,4 @@
}
# copy main options over
uci -q set network.vxmesh0=interface
Das Quoten der Option bei uci set ist nicht ueberall gleich im Skript. Mal mit, mal ohne Apostroph.
Und bei Variablen manchmal mit Anfuehrungszeichen, manchmal ohne.
Hoffe, hab alles erwischt.
fff-vxmesh: join multple client nets with vxlanto fff-layer3-vxmesh: join multple client nets with vxlan3e96acf079
to3cc2da2fed
Danke für die Erklärung, man muss da also schon ein wenig aufpassen, sollte später unbdingt mit in die Doku
Da stimme ich voll und ganz zu, sowas soll über die /etc/config/gateway gemacht werden, andere files sollten keinesfalls angefasst werden, dann ist z.b. der Kram auch Updatefest. Für mich ist der Aufbau so absolut ok.
50bc77988f
to975856c336
rebased
975856c336
to5db5f72f34
PKG_BUILD_DIR
entfernt.5db5f72f34
to057e4d538f
rebased auf 20210211-beta
Dann müsste aber auch die MTU in die gateway config
Und die Peeradressee sollte automatisch ins Babel aufgenommen werden
@Mindmaster
Ja
Ja
:)
@Mindmaster
Siehe 67e4c31c4bf685396ed8fc171793d8d00433014c
Achtung, das ist nur halbgar fuer den Moment. Es fehlt noch der Automatismus die MTU beim Parent Interface bei VLANs anzupassen. Diese muss noch manuell in der
/etc/config/network
eingetragen werden.Fuer dieses Feature braeuchte ich noch etwas Hilfe, wie man das am schlausten generisch fuer alle Devices sauber loest.
Wenn wir eine vernuenftige Loesung gefunden haben, gibts natuerlich einen Separaten PR un der Patch fliegt hier wieder raus.
Siehe #87
Wird aber vermutlich komplett umgebaut und auf dauer mindestens die
peer_ip6
option enternft. Statt dessen wird man eine Liste vonrouterIP
oderrouterIP6
(oder wie wir dann das auch immer nennen wollen) konfigurieren koennen, unter welchen der Router direkt erreichbar sein soll.@ -62,1 +63,4 @@
# get mtu
if mtu=$(uci -q get gateway.$name.mtu); then
mtu="$mtu"
Das wird doch schon in der ersten zeile gesetzt, also reicht hier doch
mtu=$(uci -q get gateway.$name.mtu) || mtu=1500
Jo, war kopiert von den Bloecken davor. Ich mach noch einen separaten commit, der die anderen zwei Optionen auch so umbaut.
#125
@ -0,0 +45,4 @@
# check if a vxmesh config is available, otherwise quit
if ! uci -q get gateway.@vxmesh[0] > /dev/null; then
return 0
fi
Hatte ich jetzt auch als One-liner gemacht, so lange kein output dazu muss:
uci -q get gateway.@vxmesh[0] > /dev/null || return 0
@ -0,0 +51,4 @@
proto="$(uci -q get gateway.@vxmesh[0].proto)"
case "$proto" in
vxlan6)
peerip="$(uci -q get gateway.@gateway[0].peer_ip6)";;
Die ;; vielleicht in die zeile darunter schieben, wie beim default case.
@ -0,0 +76,4 @@
uci -q set network.vxmesh0="interface"
for option in $fields; do
if value="$(uci -q get gateway.@vxmesh[0]."$option")"; then
uci -q set network.vxmesh0."$option"="$value"
Beachte hierbei, dass
uci set network.abc.def=""
dasselbe ist wie
uci del network.abc.def
Ggf. kann man also die condition entfernen:
uci set network.vxmesh0."$option"="$(uci -q get gateway.@vxmesh[0]."$option")"
das -q bei set sollte weg.
Ah ok. Ich wollte verhindern, dass leere optionen gesetzt werden, wenn das get failed. Aber dann tut der Einzeiler ja das gleiche.
@ -0,0 +146,4 @@
# with multiple routers in the network, there shouldnt be an authoritative
# dhcp server
uci -q set dhcp.@dnsmasq[0].authoritative="0"
-q weg, nächste zeile auch.
Hab die anderen
-q
auch noch weggeworfen.@ -0,0 +84,4 @@
for peer in $otherpeers; do
# exclude peerip from the local router, so packets aren't sent to
# itself
[ "$peer" = "$peerip" ] && continue
Das ist hier wohl nicht mehr noetig. Oben grep -v $peerip
Danke :)
@ -0,0 +137,4 @@
set babeld.@filter[-1].if="$ifname"
set babeld.@filter[-1].addedbyautoconfig="true"
set babeld.@filter[-1].action="deny"
EOF
werden die Filter irgendwo wieder geloescht, wenn sich otherpeers aendern?
Jap, das macht https://git.freifunk-franken.de/freifunk-franken/firmware/src/tag/20210211-beta/src/packages/fff/fff-babeld/files/etc/layer3.d/40-babel#L87 bzw. https://git.freifunk-franken.de/freifunk-franken/firmware/src/tag/20210211-beta/src/packages/fff/fff-babeld/files/lib/functions/fff/babel#L103 .
Deswegen
set babeld.@filter[-1].addedbyautoconfig="true"
#125
67e4c31c4b
tofaa182eb51
faa182eb51
tod50feeab07
Es sieht so aus als würde bird endlich EVPN Support mit VXLAN bekommen. Das wäre die eigentliche Lösung über viele Router hinweg ein L2 zu spannen und würde das Roaming Problem damit auch für die Layer 3 Firmware lösen.
So oder so ist dieser PR schon eigentlich länger hinfällig, weil sich zu viel in der Zwischenzeit geändert hat.
Sobald Bird wirklich soliden EVPN Support mitbringt, können wir das noch einmal anpacken.
Pull request closed