{"id":1107,"date":"2011-09-15T20:26:07","date_gmt":"2011-09-15T18:26:07","guid":{"rendered":"http:\/\/blog.benny-baumann.de\/?p=1107"},"modified":"2011-09-15T20:26:07","modified_gmt":"2011-09-15T18:26:07","slug":"automatisches-link-quality-management-fur-olsrtinc","status":"publish","type":"post","link":"https:\/\/blog.benny-baumann.de\/?p=1107","title":{"rendered":"Automatisches Link Quality Management f\u00fcr OLSR+Tinc"},"content":{"rendered":"<p>M\u00f6chte man mehrere dezentrale Standpunkte in einem Mesh-Network miteinander verbinden, so bieten sich in der Regel L\u00f6sungen mittels eines VPN an. Diese sind oftmals auch mit wenig Aufwand eingerichtet, k\u00f6nnen aber mitunter gewisse Nachteile mit sich bringen. Einer dieser Nachteile betrifft zum Beispiel den Aufbau der Routing-Tabelle, wenn sich das VPN nicht vollst\u00e4ndig wie der physikalische Counterpart verh\u00e4lt. Dies ist bei Tinc, einer sehr einfach nutzbaren VPN-Software der Fall, die bei Nutzung des Switch-Modus das gesamte VPN als eine Broadcast-Dom\u00e4ne betrachtet. Da in der Regel aber nicht wirklich jeder VPN-Client mit jedem anderen kommuniziert, f\u00fchrt dies zum Verlust von Struktur-Informationen bei Mesh-Netzwerken, die mittels Broadcast versuchen, die Netzwerk-Struktur zu erkunden. Einer der bekanntesten Vertreter ist hierbei OLSR, was auf Grund dieses Verhaltens haufenweise &#8222;virtuelle&#8220; Verbindungen zwischen den VPN-Clients sieht, die real nicht existieren, was mitunter zu ung\u00fcnstigen Verhaltensweisen beim Aufbau der Routingtabelle f\u00fchrt.<!--more--><\/p>\n<p>L\u00f6sungsans\u00e4tze gibt es f\u00fcr diese Problematik nun mehrere, wobei die offensichtliche, n\u00e4mlich Tinc das Broadcasten \u00fcber nicht-existente Verbindungen abzugew\u00f6hnen leider nicht m\u00f6glich ist, ohne gr\u00f6\u00dfere Teile von Tinc anzupassen. Da somit der Weg zu einer L\u00f6sung auf Netzwerk-Ebene seitens Tinc nicht ohne gr\u00f6\u00dfere Steine im Weg beschritten werden kann, und auch das partielle Blocken geforwardeter Broadcasts via iptables nicht ganz nebeneffektfrei funktioniert, blieb also nur die Chance, das etwas ung\u00fcnstige Verhalten von Tinc auf der Seite von OLSR zu korrigieren.<\/p>\n<p>Diese Korrektur erwies sich nach etwas Suche als durchaus recht einfach realisierbar, da OLSR von Haus aus die M\u00f6glichkeit bietet, bestimmte Verbindungen virtuell zu verschlechtern, d.h. selbst wenn alles ankommen mag, trotzdem in Bezug auf die Routing-Entscheidungen so zu tun, als ob eine bestimmte Verbindung nicht vorhanden w\u00e4re. Der hierf\u00fcr ben\u00f6tigte Parameter hei\u00dft LinkQualityMult und ben\u00f6tigt eine IP, sowie einen Faktor, um den die Verbindung virtuell &#8222;verschlechtert&#8220; wahrgenommen werden soll.<\/p>\n<p>Nun ist es recht m\u00fc\u00dfig, OLSR jedes Mal umzukonfigurieren, wenn Tinc eine Neue Verbindung aufbaut oder Abbaut oder wenn ein neuer Knoten im VPN bekannt gemacht werden muss. Die Einfachheit der Idee ist aber auch gerade ihr Potential f\u00fcr die programmatische Umsetzung. Denn gl\u00fccklicherweise bietet Tinc die M\u00f6glichkeit, sich in regelm\u00e4\u00dfigen Abst\u00e4nden ein Graph Dump File schreiben zu lassen, in dem alle im VPN vorhandenen Meta-Verbindungen aufgef\u00fchrt sind. Nun sind Meta-Verbindungen nicht gleich direkte TCP-Verbindungen, aber f\u00fcr den beabsichtigten Zweck ist der Unterschied vernachl\u00e4ssigbar. Das einfache Format &#8211; die Datei ist im dot-Format, ohne gro\u00dfe Schn\u00f6rkel &#8211; erlaubt es zudem, mit einfachsten Mittel die ben\u00f6tigten Informationen auszulesen. Erste Versuche mit Bash-Einzeilern lieferten somit schnell das gew\u00fcnschte Ergebnis, d.h. die direkten Verbindungen:<\/p>\n<pre lang=\"bash\" escaped=\"true\">MYNODE=node_42_foo grep ' -&gt; ' \/var\/tmp\/tinc.mynetwork.dot|sort -n|grep $MYNODE|tr \";\" \" \"|cut '-d ' -f3|grep -v $MYNODE<\/pre>\n<p>Nun ist ein Shellscript vergleichsweise langsam und zudem l\u00e4sst sich damit OLSR nicht ohne weiteres &#8222;in memory&#8220; umkonfigurieren. Durch meine Arbeit an einem anderen OLSR-Plugin (f\u00fcr&#8217;s ARP-Roaming, ich berichtete ^^) lag auf meiner Platte ein wunderbares Template, was sich binnen 2 Tagen von Idee bis fertigem, funktionierendem Code umarbeiten lie\u00df.<\/p>\n<p>Das Plugin bietet dabei sogar zwahlreiche Konfigurationsm\u00f6glichkeiten, wobei einige davon derzeit noch nicht vollst\u00e4ndig verwendet werden:<\/p>\n<pre lang=\"text\">LoadPlugin \"\/usr\/lib\/olsrd_tinclqmult.so.0.1\"\r\n{\r\n    PlParam \"Interface\" \"tun0\"\r\n\r\n    PlParam \"DbgLogfile\" \"\/var\/tmp\/olsr_tinclqmult.log\"\r\n\r\n    PlParam \"TincNetwork\" \"Network\"\r\n    PlParam \"TincGraph\" \"\/var\/tmp\/tinc.Network.dot\"\r\n    PlParam \"TincPID\" \"\/var\/run\/tinc.Network.pid\"\r\n\r\n    PlParam \"LinkQualityDefault\" \"0.1\"\r\n    PlParam \"LinkQualityDirect\" \"1.0\"\r\n    PlParam \"LinkQualityStatic\" \"0.5\"\r\n\r\n    PlParam \"NodeNetwork\" \"10.0.0.0\/8\"\r\n    PlParam \"NodeScheme\" \"node_%d_\"\r\n}<\/pre>\n<p>Die verwendeten Parameter-Namen sprechen hierbei in weiten Teilen f\u00fcr sich. So gibt &#8222;Interface&#8220; an, auf welchem Interface der Tinc-Traffic ankommt. Zu beachten ist, dass aus technischen Gr\u00fcnden dieses Interface separat von anderen konfiguriert werden muss, um zu garantieren, dass sich das Plugin nicht mit anderen Interfaces behakt.<\/p>\n<p>Im &#8222;DbgLogfile&#8220; stehen einige Ausgaben \u00fcber die Arbeit des Plugins. Da dieses derzeit noch sehr flei\u00dfig \u00fcber OLSR Ausgaben erzeugt, wird das Logfile bisher nicht weiter beachtet.<\/p>\n<p>Die 3 interessanten Parameter f\u00fcr Tinc sind nun &#8222;TincNetwork&#8220;, der Name des Tinc-Netzwerkes, welches \u00fcberwacht wird, &#8222;TincGraph&#8220;, die mittels &#8222;GraphDumpFile&#8220; in der Tinc-Konfiguration hinterlegte Datei mit den Verbindungen und &#8222;TincPID&#8220;, der Pfad zur PID-File des Tinc-Netzwerkes. Letztere wird dazu verwendet, um festzustellen, ob das angegebene Tinc-Netzwerk gerade aktiv ist, um ggf. in einen Fallback-Modus zu gehen.<\/p>\n<p>Die Magie des Plugins kann schlie\u00dflich mit Hilfe der Parameter &#8222;LinkQualityDefault&#8220;, &#8222;LinkQualityDirect&#8220; und &#8222;LinkQualityStatic&#8220; beeinflusst werden. Der &#8222;LinkQualityDefault&#8220;-Wert gibt dabei an, welche LinkQuality unkonfigurierte Verbindungen maximal erreichen k\u00f6nnen. Dieser Wert sollte vergleichsweise niedrig sein. Mit &#8222;LinkQualityStatic&#8220; gibt man an, wie gut statisch in der OLSR-Konfiguration eingetragene Links maximal werden k\u00f6nnen. Und mit &#8222;LinkQualityDirect&#8220; gibt man schlie\u00dflich an, wie die via Graph Dump File best\u00e4tigten Verbindungen zu bewerten sind. Hierbei haben Direktverbindungen immer Vorrang vor statischen Verbindungen. Au\u00dferdem wird der Defaultwert nur f\u00fcr Knoten herangezogen, die weder statisch konfiguriert sind, noch eine Direktverbindung durch Tinc besitzen.<\/p>\n<p>Um dem Plugin nun zu erm\u00f6glichen, anhand der Knotennamen von Tinc auf die zugeh\u00f6rige IP bei OLSR f\u00fcr entfernte Knoten zu schlie\u00dfen, ben\u00f6tigt man die letzten beiden Optionen: W\u00e4hrend die erste Option (&#8222;NodeNetwork&#8220; angibt, aus welchem Netzbereich IPs stammen, legt die zweite Option das Namensschema fest. Im obigen Beispiel w\u00e4ren die Knoten mit node_1_foo, node_2_bar, node_3_baz durchnummeriert, wobei die IP f\u00fcr node_1_foo mit 10.0.0.1, f\u00fcr node_2_bar mit 10.0.0.2 und f\u00fcr node_3_baz mit 10.0.0.3 angenommen wird. Sollte man mehr als 255 Knoten haben, geht das nat\u00fcrlich auch: node_256_quo h\u00e4tte f\u00fcr das Plugin die IP 10.0.1.0. IPv6-Support ist aber leider noch nicht vorhanden, sollte aber mit relativ wenigen Handgriffen nachr\u00fcstbar sein.<\/p>\n<p>Seinen Zweck hat das Plugin aber bereits jetzt erf\u00fcllt: Die Anzahl virtueller Verbindungen in einem doch bereits recht gro\u00dfen Freifunk-Netzwerk mit VPN konnten stark reduziert werden, was den OLSR-Traffic zumindest ein wenig reduziert hat. Herunterzuladen gibt&#8217;s das Plugin beim <a href=\"http:\/\/svn.chemnitz.freifunk.net\/svn\/freifunk\/tinclqmult\/olsrd-0.6.1\/\">Freifunk Chemnitz im SVN<\/a>. Das Plugin spielt zusammen mit OLSR v0.6.1 und Tinc 1.0.13. Tinc 1.1.x bietet eine etwas andere API, die ich mir ggf. mal anschauen werde. Da es aber sicherlich l\u00e4ngerfristig keine Umstellung auf Tinc 1.1.x im Netz kommeen wird, ist da der Bedarf derzeit eher gering.<\/p>\n<p>\u00dcber Bugreports w\u00fcrde ich mich freuen. Von zumindest einem unerkl\u00e4rlichen Segfault beim Beenden (wenn upldatelqmult aufgerufen wird) wei\u00df ich. Da das aber nicht zwingend notwendig ist, ist die Zeile derzeit auskommentiert. Darum k\u00fcmmert sich das Plugin eh beim Aufr\u00e4umen in der Folgezeile (wenn auch nicht so gr\u00fcndlich wie es das updatelqmult machen w\u00fcrde).<\/p>\n<p class=\"wp-flattr-button\"><a href=\"https:\/\/blog.benny-baumann.de\/?flattrss_redirect&amp;id=1107&amp;md5=6b6bf4fa4063af56f8eaad24e26a6574\" title=\"Flattr\" target=\"_blank\"><img src=\"http:\/\/blog.benny-baumann.de\/wp-content\/plugins\/flattr\/img\/flattr-badge-large.png\" srcset=\"http:\/\/blog.benny-baumann.de\/wp-content\/plugins\/flattr\/img\/flattr-badge-large.png\" alt=\"Flattr this!\"\/><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>M\u00f6chte man mehrere dezentrale Standpunkte in einem Mesh-Network miteinander verbinden, so bieten sich in der Regel L\u00f6sungen mittels eines VPN an. Diese sind oftmals auch mit wenig Aufwand eingerichtet, k\u00f6nnen aber mitunter gewisse Nachteile mit sich bringen. Einer dieser Nachteile betrifft zum Beispiel den Aufbau der Routing-Tabelle, wenn sich das VPN nicht vollst\u00e4ndig wie der [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[29],"tags":[10,98,319,69,320,321],"class_list":["post-1107","post","type-post","status-publish","format-standard","hentry","category-software","tag-debian","tag-developement","tag-freifunk","tag-internet","tag-olsr","tag-tinc"],"_links":{"self":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/1107","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1107"}],"version-history":[{"count":1,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/1107\/revisions"}],"predecessor-version":[{"id":1108,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/1107\/revisions\/1108"}],"wp:attachment":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1107"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1107"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1107"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}