Erfahrungen mit Telekom LTE Hybrid und SSH Problemen mit IPv4 / IPv6

Die Fördermittel für den Bandbreitenausbau in Deutschland scheinen langsam Wirkung zu zeigen.
Während wir bisher im Büro auf das LTE-Netz der Telekom angewiesen waren und aufgrund des Traffic-Limits regelmäßig nachbuchen mussten,
ist seit diesem Juni bei uns auch normales DSL verfügbar.
Und wir haben uns für MagentaZuhause Hybrid M entschieden, mit dem neuen Speedport LTE Hybrid der deutschen Telekom. Die Technik scheint ja durchaus interessant zu sein.
Mit LTE haben wir bereits sehr gute Erfahrungen, der einzige Negativ-Punkt ist das Traffic-Limit. Nach 40GB werden wir so stark gedrosselt, dass ein sinnvolles Arbeiten nicht mehr möglich ist. Wir sind also dazu gezwungen, ständig nachzubuchen.

Beim neuen Hybrid-Anschluss wird bevorzugt die DSL-Leitung verwendet. Reicht diese nicht mehr aus, wird zusätzlich auf LTE zurück gegriffen.
Hierfür ist jedoch eine besondere Hardware – also ein besonderer Router – nötig.
Die monatlichen Kosten für den Anschluss egal ob mit oder ohne hybrid sind gleich, nur die Hybrid-Hardware ist teurer.

Da man den Telekom-Geräten durchaus keine Featuritis vorwerfen können, wir als Techniker aber gerne etwas tiefer eintauchen, hätten wir anstelle der von der Telekom bereit gestellten Hardware eine alternative Hardware wie beispielsweise eine Fritzbox verwendet. Aber es gibt wohl leider noch keinen alternativen Router, der mit dem Telekom-Vertrag kompatibel sind.

Letzten Dienstag war also Schaltungstermin bei uns und mit dem neuen DSL wurde unser Anschluss von ISDN auf IP umgestellt.
Über unsere die Erfahrungen zur Umstellung und zu den technischen Feinheiten möchte ich im Nachfolgenden berichten:

Die Umstellung selbst war verhältnismäßig unspektakulär. Am Tag des Schaltungstermins ging plötzlich unsere LTE-Verbindung nicht mehr.
Kurz darauf folgte eine SMS der Telekom, in der sie uns die Schaltung bestätigt haben.
Also haben wir kurzerhand den alten LTE-Speedport entfernt, die SIM-Karte in den neuen Speedport Hybrid Router eingelegt.
Außerdem den NTBA entfernt und den Hybrid-Router direkt an der TAE-Dose angesteckt.
Zugangsdaten, Konfiguration, Telefonnummern für VOIP, etc. hatten wir alles bereits eingerichtet, wir waren also relativ schnell wieder online.
Dennoch hatten wir mit diversen Problemchen zu kämpfen, bei denen man nicht annehmen würde, dass sie im Zusammenhang mit einem neuen DSL-Anschluss stehen könnten:

Kein Mail-Versand möglich:
Über unsere Mailclients (Thunderbird) war kein Mailversand mehr möglich.
Die Lösung hierfür war relativ einfach und schnell gefunden:
Beim Speedport musste unser Mailserver in die Liste der vertrauenswürdigen Mailserver eingetragen werden.
Viele Mailserver wie beispielsweise gmx oder web waren bereits enthalten.
Von unserem firmeninternen Mailserver wusste die Telekom verständlicherweise jedoch nichts.

SSH-Problem (QOS) / SSH blieb „hängen“
Etwas seltsamer war, dass plötzlich unsere SSH-Verbindungen instabil wurden.
Entweder blieb die SSH-Verbindung hängen oder wurde abrupt getrennt.
Teilweise konnte auch gar keine SSH-Verbindung zu den Servern mehr aufgebaut werden.

Auf ersteres Problem waren wir gefasst. Dass das Aufteilen der Pakete parallel auf eine physikalische Leitung und auf „die Luft“ via LTE mit allen Anwendungsfällen problemlos möglich sein sollte, war uns von vorne herein suspekt. Und tatsächlich, als wir LTE komplett deaktiviert hatten, waren die Verbindungsabbrüche mit SSH weg.
Glücklicherweise bietet der Speedport Hybrid zusätzlich die Möglichkeit an, LTE für bestimmte Verbindungen auszuschließen. Man kann also einfach Port 22 von LTE ausschließen und muss LTE nicht fortan komplett deaktiviert lassen.

Das zweite Problem, dass gar keine SSH-Verbindung aufgebaut werden konnte bestand jedoch immer noch.
Ließ sich jedoch auf Server reduzieren, die bereits via IPv6 angebunden waren.

Merkwürdig daran war jedoch, dass die IPv6-Verbindung an sich funktionierte.
Der Server war Pingbar und auch der initiale Verbindungsaufbau klappte:

$ ssh -v root@serverX
debug1: Server accepts key: pkalg ssh-dss blen 433
debug1: Enabling compression at level 6.
debug1: Authentication succeeded (publickey).
Authenticated to serverX
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = de_DE.UTF-8
Write failed: Broken pipe

….
Also hier brach die Verbindung ab.

Witzigerweise funktionierte die Verbindung, wenn explizit die BASH gestartet werden sollte:
$ ssh root@serverX bash -i

Auch, wenn wir SSH angewiesen haben, explizit eine IPv4 Verbindung aufzubauen, funktionierte es:
$ ssh -4 root@serverX

Wir wollten deshalb beim Verbindungsaufbau via IPv6 zunächst sicherstellen, dass keine Pakete verloren gingen.
Hierzu haben wir sowohl auf dem Server als auch auf dem Client die Pakete mittels tcpdump verfolgt:

$ tcpdump -i eth0 -vvv -tttt -n ‚port 22 and ip6‘

Und siehe da, die ersten Pakete kamen perfekt durch:
2015-06-11 16:15:18.945743 IP6 (hlim 64, next-header TCP (6) payload length: 72) 2a01:4f8:140:72c2::2.22 > 2003:62:5f2b:e207:ccb7:146f:cbe5:b810.37357: Flags [P.], cksum 0x1bdf (correct), seq 2248:2288, ack 3384, win 196, options [nop,nop,TS val 2171104204 ecr 18722466], length 40

Und ab einem bestimmten Zeitpunkt, wurden zwar Pakete vom Server versendet, vom Client jedoch nicht mehr empfangen:
———–
2015-06-11 16:15:18.984022 IP6 (class 0x10, hlim 64, next-header TCP (6) payload length: 120) 2a01:4f8:140:72c2::2.22 > 2003:62:5f2b:e207:ccb7:146f:cbe5:b810.37357: Flags [P.], cksum 0xb2b2 (correct), seq 2288:2376, ack 3680, win 216, options [nop,nop,TS val 2171104242 ecr 18722476], length 88

Und es lässt sich sogar ein Unterschied ausmachen „class 0x10“.
Diese Angabe bezieht sich auf ein sog. QOS – Quality of Service, TOS Type-of-Service bzw. mittlerweilse DSCP (Differentiated Services Code Point) genannt und bedeutet, dass dem Traffic eine Klasse zugeordnet wurde. Ziel dabei ist es, bestimmte IP-Pakete zu bevorzugen. Class 0x10 bedeutet in diesem Fall, dass das Paket nicht stark verzögert bzw. im Umkehrschluss bevorzugt werden soll.
Ist bei SSH logisch, man möchte ja beim Eintippen von Befehlen möglichst schnell das resultat sehen.

Aus irgend einem bisher uns unbekannten Grund, scheint das Routing dieser speziell gekennzeichneten Pakete beim MagentaZuhause Hybrid M nicht korrekt zu funktionieren.
Glücklicherweise kann man SSH so konfigurieren, dass es den Paketen keine Klasse mehr zuordnet.

Hierzu einfach in die Dateien
/etc/ssh/ssh_config
/etc/ssh/sshd_config
diese Zeile einfügen:
IPQoS 0x0
Und den SSH-Server neustarten:
/etc/init.d/ssh restart

Optional könnte man diese Angabe auch beim SSH-Befehl mitgeben:
$ ssh -6 -l root -o IPQoS=0x00 serverX
Oder die Zeile in der Datei ~/.ssh/config einfügen.

Aber ACHTUNG: Das Routing-Problem scheint in beiden Richtungen aufzutreten!
Also der SSH-Client muss angewiesen werden, auf QoS zu verzichten, damit die Pakete beim Server ankommen.
Und der Server muss ebenfalls darauf verzichten QoS zu verwenden, damit dessen Pakete wiederum beim Client ankommen!
Bei unseren Tests haben nicht alle SSH-Server QoS standardmäßig verwendet. Während bei den alten Debian Squeeze Servern scheinbar noch kein QoS zum Einsatz kommt, kommt bei unseren Debian Wheezy-Servern QoS zum Einsatz.

Veröffentlicht unter Markus

36. Woche – Markus

Hallöchen,

in diese Woche habe ich viel mit Javascript gearbeitet.

Zunächst musste ich eine Dropdown-Checkbox-Liste programmieren. Hierfür habe ich http://code.google.com/p/dropdown-check-list/ hergenommen. Die Werte habe ich in eine Datenbank gespeichert und danach probiert wieder auszulesen um die Checkboxen nach Laden der Daten aus der Datenbank wieder zu setzen. Dies war nicht allzu schwer und kostet mich auch kaum Zeit.

Allerdings wollte ich danach über eine Ajax Funktion, nach dem ich in einen Texteingabefeld etwas hineingeschrieben habe, sofort prüfen ob es den Wert schon in der Datenbank gibt. Wenn das der Fall ist lade ich mir die Daten und setze vorneweg die Checkboxen. Dies war ein hartes Stück arbeitet, was ich zum Schluss nur mit Hilfe geschafft hab. Da ich mich an einem Stück Quellcode so verbissen hatte, dass ich eine andere Lösung aus den Augen verloren hab. Falls ihr genau so ein Problem habt, schreibt mir eine Email, ich kann euch gerne behilflich sein.

MFG

Euer Markus

Veröffentlicht unter Markus

33. Woche – Markus

Hallo ich bins Markus,

in dieser Woche habe ich ein Monatsreporting geschrieben und zwar sollen dem Admin alle monatsrelevanten Daten eines Nutzers angezeigt und veranschaulicht werden. Zunächst einmal die grobe Strukturierung was der Admin alles sehen soll bzw. was für ihn wichtig ist.

Danach habe ich begonnen das man über ein Dropdown-Feld alle Kunden auswählen kann und ein Dopdown-Feld mit allen Monaten und Jahren (Ich ging bis zwei Jahre zurück, da ich das für einen angepassten Zeitraum fand).  Des weiteren wird automatisch das aktuelle Datum ausgewählt. Falls jemand den Quellcode für diese Funktion braucht, kann ich ihm den gerne zukommen lassen ;).

Als nächstes habe ich das Berechtigungssystem implementiert, da ja nur der Admin bzw. die Admins Zugriff auf dieses Monatsreporting haben sollten.

Des weiteren erstelle ich dynamisch mit den Daten aus der Datenbank über eine PHP-Klasse ein Diagramm-Chart, welches die Daten Visualisieren sollte. Da ich das erste mal mit dieser Klasse arbeitet dauerte es ein bisschen bis ich damit zurecht kam, danach ging es eigentlich ziemlich leicht diese Klasse zu bedienen und damit Diagramme zu erstellen

Ich wünsche euch allen ein schönes Wochenende.

Gruß

Euer Markus

 

Veröffentlicht unter Markus

32. Woche – Markus

Huhu,

in dieser Woche ging es hauptsächlich um das CMS Drupal.

Am Montag habe ich mich in Drupal eingearbeitet. Danach habe ich ein eigenes Modul geschrieben. Mein Modul sollte nur im Admin Bereich angezeigt werden und Daten aus der Datenbank beziehen.

Zunächst habe ich mir eine Tabelle mit einigen Daten aus der Datenbank anzeigen lassen. Danach habe ich eine weitere Seite geschrieben, bei der man neue Datensätze anlegen kann. Diese wurde dann erweitert, sodass man Datensätze in der Tabelle mittels eines Buttons / Links bearbeiten kann. Diese wurden dann in dem Formular zum neuen Datensätze anlegen angezeigt und konnten dort bearbeitet werden.

Das gleiche System habe ich dann noch für eine andere Tabelle aus der Datenbank geschrieben und in der ersten Tabelle um einen Punkt erweitert. Wenn man auf einen Link klickt werden in der zweiten Tabelle nur Datensätze des (z. B. Nutzers der den Link hatte) angezeigt.

Zu guter letzt habe ich noch Berechtigungen zu dem Modul hinzugefügt. Nun können nur bestimmte Nutzer und der Administrator auf das Modul zugreifen. Dies war kein Problem, allerdings konnten unangemeldete Nutzer immer noch auf das Modul zugreifen, wenn diese den Link manuell in den Browser eintippten. Leider dauerte es ein bisschen bis ich diesen Fehler erkannte. Zu Testzwecken hatte ich im Code eine Variable auf TRUE gesetzt und diese vergessen. Als ich den Fehler gefunden und ausgebessert habe funktionierte alles einwandfrei.

Deswegen gebe ich euch einen Tipp, falls ihr Variablen nur zu Testzwecken auf TRUE / FALSE oder einen anderen bestimmten Wert setzt, kommentiert diese Zeile, denn dadurch findet ihr Sie schnell wieder und müsst euch nicht mit so einen doofen Fehler beschäftigen wie ich.

Gruß

Euer Markus

Veröffentlicht unter Markus

31. Woche – Markus

Hallo,

diese Woche war eine sehr kurze Woche, da Donnerstag Feiertag ist und ich mir am Freitag Urlaub als Brückentag genommen habe ;).

In dieser Woche habe ich relativ viel mit Javascript gearbeitet. Zunächst einmal habe ich wenn beim Dropdown-Menü ein bestimmter Wert ausgewählt wurde, dass dann in dem daneben liegenden Feld ein aktueller Timestamp hineingeschrieben wird. Dies war eine relativ leichte Aufgabe, da ich etwas ähnliches schon einmal geschrieben habe.

Zuletzt habe ich ein paar Fehlersuchen betrieben. Problem war:

Über zwei Buttons (+ und – ) konnte man ein horizontales Formular verdoppeln, d.h. mehrere Elemente auf einmal in die Datenbank einfügen. Allerdings sollte wenn man den + Button drückt, die Buttons beim ersten Formularelement verschwinden (hidden). Nun hatte ich das Problem, das wenn mehrere Elemente anlegen möchte und eins doch wieder weg soll, dass alle Buttons auf einmal wieder erscheinen. Dies sollte aber nicht sein.

Dieses Problem war weniger das Problem, allerdings in einem anderen Formular waren 2 Formular auf einer Seite integriert mit zwei Mal dieses verdoppeln / vermindern Buttons. Wenn man nun mehrere Elemente in beiden hatte und eins entfernte, wurden beim zweiten Formular alle Buttons wieder angezeigt.

Gelöst habe ich das ganze so:

Es wird geprüft, welche id der gedrückte Button hat. (Diese Übergebe ich der Javascript Funktion) Danach wird geschaut, ob der Button, der eins über dem aktuellen Button liegt ein „verdoppelter“ Button ist, wenn ja soll dieser erscheinen und der aktuelle Button verschwinden. Falls das nicht der Fall ist, sollen die Buttons des originalen Formulars erscheinen und die aktuellen verschwinden. Dies war eine leicht knifflige Sache, allerdings war auch sehr interessant und hilfreich.

Ich wünsche euch allen schöne Feiertage und ein schönes Wochenende

Gruß

Euer Markus

 

Veröffentlicht unter Markus

30. Woche – Markus

Hallöle,

am Montag, habe ich noch letzte Änderungen an dem Berechtigungssystem vorgenommen, da es ein Problem mit dem Login gab.

Danach habe ich ein Programm geschrieben, welches prüft ob Links aus der Datenbank wirklich gesetzt waren und ob der vereinbarte Linktext stimmt. Falls dies zutraf, wurde es in der Datenbank vermerkt, falls nicht, wurde eine entsprechende Fehlermeldung vermerkt.

Desweiteren musste ich ein Programm schreiben, welches aus einer E-Mail den Anhang auslas und diesen Ausgab. Über die IMAP Funktionen kann man auf die einzelnen Bereiche einer E-Mail zugreifen. Allerdings war es nicht so leicht, sich bis zum Anhang vor zu arbeiten. Das zweite Problem war, nachdem ich es geschafft habe den Anhang auszulesen, hatte die E-Mail immer nach 74 Zeichen einen Zeilenumbruch. Dies machte die E-Mail automatisch. Da mein auszulesender Anhang allerdings eine .csv war, welche mit einem Zeilenumbruch ankündigte wenn eine neue Zeile kommt, warf dies den gesamten Anhang durcheinander. Letztendlich fand ich im Internet einen regulären Ausdruck, welcher genau dieses Problem verarbeitete. Der Reguläre Ausdruck lautete: „/=(r?)n/“ . Einfach mit preg_replace(„/=(r?)n/“, “, $string). Dadurch werden alle automatisch eingefügten Zeilenumbrüche entfernt allerdings die der .csv Datei wurden ignoriert.

Ich hoffe ich konnte euch damit ein bisschen helfen.

Gruß

Markus

Veröffentlicht unter Markus

29. Woche – Markus

Hallo,

in dieser Woche habe ich an einem Berechtigungssystem gearbeitet, das es nur Admins erlaubt Passwörter und Usernamen zu editieren, als auch Nutzer anzulegen.

Hierfür habe ich zunächst einmal ein eine Loginteil über einen HTTP-Request geschrieben. Der prüft ob es den Nutzer in der Datenbank gibt und ob das Passwort übereinstimmt, falls das nicht der Fall ist wird dieser auf eine Fehlerseite verlinkt.

Da ganze erfolgte wieder in dem Zend-Framework. Wenn der Nutzer zum Beispiel auf „Neuen Benutzer anlegen“ drückt, wird erst einmal geprüft, welche Rechte der Nutzer hat bzw. welche Rechte nötig sind um einen neuen Nutzer anzulegen, falls diese nicht übereinstimmen kommt eine Fehlermeldung.

Des weiteren habe ich diese Woche, die letzten Quellcode Zeilen eines Projektes auf PDO umgeschrieben. Dies waren 8000 Zeilen Quellcode, welche ich nun von normalen SQL Befehlen (diese wurden zwar „Escaped“, allerdings über eine eigens implementierte Funktion) auf PDO, welches das „Escapen“ für einen erledigt, umgeschrieben.

Dies war es leider schon für diese Woche, da der 1. Mai ein Feiertag war und ich am 30. April Brückentag (Urlaub) hatte.

Gruß

Markus

Veröffentlicht unter Markus

28. Woche – Markus

Hallöchen,

in dieser Woche musste ich viel mit dem Zend-Framework arbeiten und ein paar Dinge mittels JavaScript erledigen. Mit JavaScript habe ich eine Länder / Sprachweiche für eine Kundenseite geschrieben. Das bedeutet, dass wenn im Browser als bevorzugte Sprache deutsch hinterlegt ist, wird der Nutzer auf die deutsche Seite der Homepage weitergeleitet. Ist die Sprache englisch, auf die englische und bei keiner bevorzugten Sprache oder einer nicht unterstützten Sprache wird der User automatisch auf die englische Seite geleitet.

Dann habe ich noch eine JavaScript-Weiche erstellt die es nur erlaubt verschiedene Berechtigungen zu setzen, wenn in einem bestimmten Dropdown-Element, z.B. „Markus“ ausgewählt worden ist.

Des weiteren habe ich zum ersten Mal mit Ajax gearbeitet. Wenn man in einem Dropdown-Menü eine z.B. Firma auswählt, schrieb es automatisch die Adresse in die Input-Felder. Hierfür musste ich im Hintergrund über Ajax mit der Datenbank kommunizieren, dann die Werte zurückgeben lassen, und falls es Werte gibt, diese eintragen.

Zum Schluss habe ich mit dem Zend-Framework, zwei Seiten erstellt, welche es erlauben neue Berechtigungen und neue Domain-Themen anzulegen. Des weiteren konnte ich schon bestehende Themen editieren. Dies war eine knifflige Sache finde ich, da das Zend-Framework, wenn man noch nicht damit gearbeitet hat, ein bisschen undurchsichtig ist.

Gruß

Markus

Veröffentlicht unter Markus

27. Woche – Markus

Hallo,

letzte Woche gab es von mir keinen Eintrag, da ich Urlaub hatte. In dieser Zeit war ich für 2 Tage in der Schweiz, was sehr schön und erholsam war.

In dieser Woche habe ich weitergemacht und mein Projekt auf PDO umgeschrieben. Da ich allerdings in 5000 Zeilen Quellcode den ein oder anderen Rückgabewert einer Funktion verändert habe, war es klar das die Seite nicht mehr richtig funktionierte. Also ging ich die einzelnen Dateien durch und änderte dort den Quellcode so um, das diese ebenfalls wieder funktionierten.

Des weiteren hatte ein Kunde Probleme mit einem Gerät, also musste ich mich mit verschiedenen Supporthotlines unterhalten. Ich musste in Erfahrung bringen, welche Reparaturmöglichkeiten es alles gibt, wie viel diese Kosten würden und wie diese ablaufen werden. das heißt, muss ich das Paket einschicken und die Kosten übernehmen oder übernimmt diese die Supportfirma. Lohnt es sich das Gerät noch zu reparieren oder bin ich mit etwas mehr Aufwand bei einem neuen Gerät besser dran? Dies waren alles Fragen die ich in Erfahrung bringen musste.

Auch mit JavaScript musste ich diese Woche etwas programmieren. Auf der Webseite eines Kunden wird, wenn man einen Button drückt, ein Film abgespielt. Allerdings war der dafür verwendete Player nicht mit allen Betriebssystemen kompatibel. Also musste ich eine Weiche einbauen, die bei z.B. Windows, den einen Player mit dem Film öffnet und bei z.B. iOs einen anderen öffnet.

Mit dem einfügen in Datenbanken hatte ich ebenfalls zu tun. Ich musste mittels eines Skriptes eine .csv (Excel Tabelle) runterladen und diese in eine Tabelle speichern. Nachdem diese abgespeichert war, sollte das Skript einzelne Nummern auslesen und nun mittels diesen Nummern .csv Dateien herunterladen und diese in eine gesonderte Tabelle speichern.

Dies war es eigentlich für diese Woche. Am Wochenende werde ich wieder ein Jahr älter, 21. Mal sehen was mich dann nächste Woche erwartet.

Bis dann, Gruß

Markus

Veröffentlicht unter Markus

25. Woche – Markus

Hallöchen,

diese Woche war ich mit dem Chef zusammen bei einem Kunden. Dort haben wir in einer Besprechung über eine neue Schnittstelle diskutiert. Diese Schnittstelle musste mit einer weiteren Firma abgeklärt werden. Für mich war es sehr interessant, teil einer solchen Besprechung zu sein. Auch wie so etwas von statten ging und auf was man alles achten muss war sehr interessant.

Des weiteren habe ich diese Woche mit mobile JQuery weiter gemacht. Durch einige CSS Änderungen, ist eine Seite die eigentlich schon tadellos funktionierte „beschädigt“ worden. Das habe ich durch alternative Klassennamen und Umstruktierung behoben. Des weiteren habe ich einen Content geschrieben den man nicht sieht. Nur wenn man auf einen Link klickt, öffnet sich der Content darunter. Allerdings gibt es verschiedene Links, welche im selben Contentbereich verschiedenen Content, abhängig von der API darstellen.

Falls ein Nutzer viele Adressen hat ist es nicht gut, wenn er diese manuell suchen muss. Aus diesem Grund habe ich eine Suche geschrieben, welche je nach Suchbegriff mehrere, eine oder keine Adresse anzeigt.

Dies war es leider schon für diese Woche. Da ich nächste Woche Urlaub habe und morgen Feiertag ist, bekommt ihr diesen Eintrag heute schon.

Ich wünsche euch allen ein schönes Osterfest.

Gruß Markus

Veröffentlicht unter Markus