Dies ist eine alte Version des Dokuments!
Freifunk mit babel
Wir haben mit den Integrationsarbeiten für den Gluon Babel Masterplan begonnen.
Die aktuelle frankfurter babel-Firmware gibt es hier (development), hier (test) und hier (stable). Die dazugehörige Map ist hier zu finden: Babel Map - Freifunk Frankfurt a.M.
Status
Man kann sich verbinden, roamen, das Netz nutzen. Man hat 25% mehr Durchsatz als mit Batman unter gleichen Funkbedingungen.
Im Detail heißt das:
- Ein Client kann sich mit einem Node verbinden und es ist Kommunikation zwischen diesen beiden Geräten möglich
- Ein Client kann sich mit einem Node verbinden und erreicht über das Mesh einen anderen Node
- Zwei Clients an unterschiedlichen Mesh-Nodes können miteinander kommunizieren
- Zwei Clients verbinden sich mit einem Node und können kommunizieren. (Jeweils switch-port, beide per wifi und wechselseitig kabel/wifi)
- Routing ins Internet für einen Client funktioniert für IPv6 und IPv4
- Internetzugang an mesh-only-node funktioniert
- Babel-Nodes erscheinen neben Batman-Nodes auf der Babel-Map
- DNS funktioniert mit dem durch das Babel-Projekt in gluon eingeführten DNS-Cache
- Roaming eines Clients geht
- Es gibt eine funktionierende Firewall
- Auf einem Socket sind verschieden l3roamd-Operationen möglich.
- Folgenden Pakete wurden angepasst, sodass die benötigten Komponenten in der Firmware eingebaut ist und per ifup auch gestartet werden können.
- gluon-mesh-babel
- gluon-l3roamd
- mmfd
- gluon-mesh-vpn-fastd
- babeld >1.8 (master von März 2018)
Bitte erfasst Probleme in der Todo-Liste.
Entwicklung
CHANGELOG
next
[x] l3roamd: increase network efficiency when claiming - add packet to recently seen list when using multicast [X] l3roamd: only bind to node-client-ip after it was successfully assigned. [X] respondd: copy max IFNAMSIZ Bytes when assembling ifreq to obtain MAC
v0.0.1.68
[X] l3roamd: only put active IP addresses in info packet [X] l3roamd: improve roaming for cable clients - use NEWLINK messages originating from fdb to learn new clients. [X] l3roamd: allow change of client interface, do not always exit on epoll error, re-initialize arp, icmp6 routemgr [X] l3roamd info of inactive clients now leads to enrichment of addresses [X] l3roamd: fix info message parsing [X] l3roamd: use /48 clat range in -4 init parameter using a /96 length [X] l3roamd: intercom: fill sender-field in all outgoing packets [X] l3roamd: add debug output for intercom packet handling [X] l3roamd: remove endless loop when flushing packets [X] gluon-mesh-babel: Fix respondd crash when parsing json-response from l3roamd [X] introduce xlat464-clat, remove of jool [X] babeld upgrade to master to get event-triggered route-updates working [X] gluon-mesh-babel: ix crash of upgrade-script ./300-gluon-mesh-babel-mkconfig:12: attempt to call global 'client_prefix6' (a nil value)
v0.0.1.65
[X] l3roamd: send claim if the client was known in the past but is inactive now (it might have roamed away and back again). [X] l3roamd: rework socket structure to allow multiple instances of l3roamd on one host while allowing to communicate via multicast and unicast on all relevant addresses: [X] bind m sockets (one for each mesh interface) to mcast address to receive multicast packets [X] bind 1 socket to node-IP for sending claims and receiving info in response [X] bind n sockets fec0-socket /close when claiming / removing client => add to client structure [X] l3roamd: intercom - bind to node-ip [X] l3roamd: roaming - keep old clients for 5 minutes after dropping them in an "old" queue. [X] babeld: adjust confit to include redistribution of CLATs and PLATs [X] gluon-mesh-babel: plat-prefix in site.conf konfigurieren [X] gluon-mesh-babel: clat-prefix in site.conf konfigurieren [X] gluon-l3roamd: set -n parameter to make l3roamd know about the clat-interface [X] gluon-l3roamd: set cli-options for clat (clat_prefix, clat-interface) in initscript [X] l3roamd: fix nl80211 client discovery [X] l3roamd: introduce switches to disable discovery via ndp/fdb/nl80211 [X] respondd: catch errors in corner cases for retrieving mac addresses [X] l3roamd: roaming: if the client is not available any more, forget ipv4 address along with ipv6 [X] l3roamd: Allow setting the ula-node-client-prefix [X] l3roamd: purge packets from own task scheduled when packet is received instead from NS-task [X] l3roamd: ipmgr: when dropping old packets, send icmp destination unreachable [X] l3roamd: FIX purge packets when debug is disabled [X] l3roamd: update usage() include all socket functions in help text [X] make autoupdater work on snapshot and next branches [X] l3roamd: do not crash when purging old packets
1.8.0 Snapshot 63
[X] l3roamd: rework seek logic triggers [x] l3roamd: when sending NS, use clients ll-address as destination if it is known already - RFC2461 [X] l3roamd: fix output when sending NS [X] l3roamd: beim entfernen von ip adressen eines clients, eine prüfugn der anderen ip adressen anstoßen => mit echo requests damit der kernel das gleich alles mitkriegt. [X] l3roamd: help with roaming - do not remove the client unless it's last IP-Address was deactivated >5 Minutes ago when bridge/nl80211 report the client as gone. [X] l3roamd: allow to add / remove addresses for clients using the socket. [X] respondd: implement json parsing for unlimited size of return value of l3roamd (10 lines) [X] l3roamd: always use multicast claims instead of unicast. [X] l3roamd: NS/NA-Zyklus bei NUD:FAILED und NEWNEIGH entfernen - bei Empfang von NA wird clientmgr_add_address aufgerufen - set NUD_REACHABLE inside clientmgr_add_Address() [X] l3roamd: use nl-messages with state NUD_NOARP to deactivate client IP. [X] gluon-mesh-respondd: fix page fault [X] l3roamd: allow re-detection of client's IP addresses [X] l3roamd: fix segfault on clientmgr_is_known_address()
1.8.0 Snapshot 62
[x] l3roamd: when deleting clients, remove all their addresses by iterating backwards in the address-vector [X] mmfd: allow to run multiple instances in parallel [X] l3roamd: allow to run multiple instances in parallel [X] l3roamd: introduce get_prefixes-command on socket [X] adjust upgrade-scripts to domain config [X] l3roamd: do not remove client too early see log
1.8.0 Snapshot 60
[X] l3roamd: avoid double-free of client->addresses on client removal [X] l3roamd: "IPV4"-Zusatzroute für nat64 für jeden client hinzufügen [X] l3roamd: IP & Client-löschen ermöglichen [X] l3roamd: IPv4-Adresserkennung ermöglichen [X] l3roamd: bei DELNEIGH wird nicht die ll-adresse des clients gelösct, weil diese nciht im client-Adress-Array ist. => mit dem client auch essen ll-adresse mitführen. [X] prefixd: auf socket von l3roamd schreiben und damit roaming in zusätzlichen prefixes ermöglichen [X] libbabelhelper: remove condition with endless "Could not read data from buffer. This should not happen."
1.8.0 Snapshot 58
[X] respondd: BUGFIX: some neighbour interfaces are not shown. [X] respondd: statt mac-Adressen ll-Adressen einbauen [X] l3roamd: FIX: page fault
1.8.0 Snapshot 54
[x] gluon-web-network Paket ist an Bord, Mesh on LAN ist konfigurierbar [x] l3roamd Absturz behoben [x] jool ist an bord für nicht-tiny target zum direkten ausleiten [X] l3roamd: die special IP darf erst nach allen claim retries gesetzt werden damit claim/info und damit roaming geht. [x] gc_thresh1 = 2 setzen und gc_thresh=3 [X] l3roamd: Entfernen von neighbours per netlink realieseren [X] l3roamd: client entfernen, wenn dessen letzte IP entfernt wird. [X] Fix debug output: seeking on intercom for client 2a06:8187:fbab:2::1sent intercom packet to a00:1593:0:0:ff02:: on iface lo rc: -1 [X] l3roamd: do not re-add clients when they are already active [X] x86-glibc buildjob: artifect nur für lede-x86-64-combined-squashfs.img speichern, auf make oldcnofig umsteigen für den zweiten defconfig [X] use-site-conf autoupdater branch patchen [x] firewall: allow dhcp on local_node interface [X] l3roamd: beim entfernen eines clients (roaming, drop, exit), die special-IPs vom client-Interface entfernen [X] l3roamd: neighbour entfernen bei client disconnect
1.8.0 Snapshot 52
[X] l3roamd: Umgang mit Speicher bereinigen [X] l3roamd: get_clients should also display all clients, their macs and ip addresses [X] wann gehen wir in den tentative-STatus => REview durchführen (wenn wir per info-message neue IPs erhalten und wenn wir einen mac-change haben und inaktive-Adressen für den client [X] modules mit hochladen bei snapshots [X] dnsmasq konfigurieren, IPv4 für Clients [X] l3roamd: review clientmgr [X] server umstellen für firmwareuploads https://wiki.ffm.freifunk.net/infrastruktur:servers:download [X] l3roamd: add version-switch [X] statuspage batman: ?PROTO? (undefined) [X] respondd-Strukturen: Link-Quality und eingestellter Durchsatz aufnehmen. siehe iwinfo mesh0 assoclist
1.8.0 Snapshot 41
[X] FIX: [ 257.537508] neighbours-babe[2318]: segfault at 0 ip 0000000000401302 sp 00007ffe76b852d0 error 6 in neighbours-babel[400000+2000] [X] babel-neighbour-struktur anpassen an Batman-Format: [X] statuspage rebase auf master, bauen [X] buildjob für christf_next branch machen und diese firmware auf ffm-server hochladen [X] DNS mit next-node feature reparieren [X] push christf_respondd-time & raise PR [X] statuspage heilen: wieder batadv-stream fehler (hoffentlich mit Thomas gemeinsam) [X] update-interval für mesh-vpn verbindung in den Minutenbereich erhöhen. [X] prefixd: roaming in zusätzlichen prefixes erlauben durch Bekanntgabe des zusätzlichen prefix an den l3roamd [X] gluon-mesh-babel script anpassen: loopback.ip6addr muss gesetzt werden [X] cnames in name überführen, delete_all weg nehmen, einzeln löschen (section namen hochzählen und dann explizit die gluon-dingens löschen. [X] NS: NONCE einbauen nach https://tools.ietf.org/html/rfc3971 [X] mmfd: neues debian-package bauen und hochladen [X] automatisch mmfd0 interface hoch bringen, analog zu l3roamd
1.8.0 SNAPSHOT32
[X] gw02 aufbauen [X] l3roamd: beobachten, wie clients inaktiv werden [X] l3roamd arbeitet nicht richtig, wenn ein -4 IP-MAP-Netz nicht angegeben ist. Wird der speicherbereich initialisiert, gehts. -4 wird also angegeben. => fixen [X] l3roamd: wen multicast claims und unicast claims geshickt werden: ip adresse mit im log ausgeben für den der claim gilt [X] ipmgr - Sicherstellen, dass die queue von alten Paketen bereinigt wird. FIX memleak [X] rebase n_babel-work [X] package/gluon-core/luasrc/lib/gluon/upgrade/140-firewall-rules reject_input_on_wan nachrüsten aus https://github.com/freifunk-ffm/gluon/blame/d9f6c0aa6bb662dd59850676e49190a4 [X] Firewallregeln auf Duplikate prüfen [X] Kontrolle der Commits durchführen - einzeln durchgehen. [X] gedroppte Clients erst nach 10 minuten löschen oder wenn ein claim kommt. [X] interface-IDs in routemgr nutzen [X] aliase für kurze DNS für nextnode nn.ffffm.net nn [X] Retry für Claims bauen [X] claim-Datenstruktur bauen: send-counter, claim selbst [X] Anpassung an send_claim: Eintrag nach dem claim in die claim-retry-liste legen. [X] Anpassung handle_info: prüfen ob im claim-retry-vector ein eintrag für den client ist, wenn ja, entfernen. [X] claim-retry-task bauen, die so lange retries sekündlich schickt und den retry-counter inkrementiert, wie a) ein Eintrag in der claim-retry-liste ist und b) der counter nicht 3 überschritten hat. Wenn er 3 überschreitet, Eintrag aus der retry-liste löschen.
Debugging
Auf dem Gerät
Das Babel-Netz ist ein Testnetz. Niemand weiß wie man Layer 3-Netze mit Roaming aufbaut - wir sind die ersten. Es kann also durchaus passieren, dass etwas nicht glatt läuft. In so einem Fall ist man mit generellen Debugging-Hinweisen gut beraten: Wichtig ist meist: die Ausgabe von:
- logread
- nodeinfo
- echo get_clients | socat - /var/run/l3roamd.sock
- ip -6 r s
Core-Files auswerten
- Die Erzeugung von core-Files auf dem openwrt-Gerät aktivieren:
``` touch /.init_enable_core sysctl -w "kernel.core_pattern=/tmp/%e.%p.%s.%t.core" ulimit -c unlimited ```
- Den zu beobachtenden Prozess direkt von busybox aus starten, den Absturz provizieren. Das das core-file liegt dann in /tmp.
- Die unstripped binaries liegen auf dem Build-System in staging_dir/target-*/root-*
- mit dem gdb für den build das binary aus dem build-tree und dem core-file vom router laden:
``` cd /var/lib/jenkins/workspace/gluon_christf_next_musl/lede ./build_dir/toolchain-mips_24kc_gcc-5.4.0_musl-1.1.16/gdb-8.0.1/gdb/gdb ./staging_dir/target-mips_24kc_musl-1.1.16/root-ar71xx/usr/sbin/l3roamd /tmp/l3roamd.1516492435.7730.11.core ```
Infrastruktur
IPv6 Adressen
- 2a06:8187:fbab:2::1 next-node Adresse (löst auch im Netz als nextnode auf)
- 2a06:8187:fb00:53::53 DNS
- 2a06:8187:fb00:123::123 ntp
- 2a06:8187:fbab::/48
- 2a06:8187:fbab:1::/64 Node Netz
- 2a06:8187:fbab:1::9000:xxxx Infrastrukturbereich im Node Netz
- 2a06:8187:fbab:2::/64 Client Netz
- 2a06:8187:fb00:1::/96 Netz für nat64
Aufbau von Gateways
Die Komponenten des Netzes sind hier beschrieben.
Serverseitig kann man loslegen, wenn man als post-up script folgendes ausführt:
#!/bin/bash IFACE=eth2 exec >/tmp/ff-log 2>&1 cat >/tmp/babeld.conf<<EOF ipv6-subtrees true reflect-kernel-metric true export-table 10 import-table 11 import-table 12 local-port-readwrite 33123 interface ens6 type wired rxcost 10 update-interval 60 interface babel-vpn-1374 type tunnel link-quality true update-interval 300 default enable-timestamps true default max-rtt-penalty 96 default rtt-min 25 out ip 2a06:8187:fbab:2::1/128 deny redistribute ip 2a06:8187:fbab:2::1/128 deny redistribute ip 2a06:8187:fbab:2::/64 eq 128 allow redistribute ip 2a06:8187:fbab:1::/64 eq 128 allow redistribute ip 2a06:8187:fbab:3::/64 eq 96 allow redistribute src-prefix 2a06:8187:fb00::/40 ip 2000::/3 allow redistribute ip ::/0 allow redistribute ip 2000::/3 allow redistribute local deny redistribute src-prefix 2a06:8187:fbab:2::/64 if eth1 metric 256 EOF localnode=$(ipv6calc --action prefixmac2ipv6 --in prefix+mac --out ipv6addr 2a06:8187:fbab:1:: $( ip a s dev eth0|grep link/ether|awk '{print $2}')) /sbin/ip -6 a add $localnode dev lo # infrastruktur und client-netz über babel-table routen. /sbin/ip -6 ru add prio 10 to 2a06:8187:fbab:2::/64 lookup 10 /sbin/ip -6 ru add prio 10 to 2a06:8187:fbab:1::/64 lookup 10 /usr/local/bin/babeld -D -s -I /var/run/babeld.pid -G 33123 -c /tmp/babeld.conf sleep 1 /usr/local/bin/l3roamd -p 2a06:8187:fbab:2::/64 -m $IFACE -t 11 -a 2a06:8187:fbff:2::2 & disown /usr/local/bin/mmfd -v & disown sleep 2 /sbin/ip a add fe80::ff:3fff:fe10:7d02/64 dev mmfd0 #/sbin/ip a add 2a06:8187:fb00:2::4/128 dev mmfd0 /sbin/ip a add 2a06:8187:fbab:1:383b:9ff:fed5:9f53/128 dev mmfd0 /sbin/ip r add ff05::2:1001/128 dev mmfd0 table local # (reicht auf dem Server wo yanic läuft, muss nicht auf gateways sein) /sbin/ip link set dev mmfd0 up /sbin/ip -6 r a 2a06:8187:fbab:2::/64 dev l3roam0 t 10 #add route to icvpn - all other freifunk networks /sbin/ip route flush cache
Auf dem Gateway läuft fastd und bringt die mmfd/l3roamd mit dem obigen script (einzige AUsnahme: ff05-route wird nicht gesetzt) hoch. bird6 schreibt auf dem gateway seine default-route in Routing Tabelle 10.
Salt-states für Gateways haben wir auch - leider aktuell noch nicht öffentlich.