Terminal Server Windows 2003 - Ich kann mich mit bestehenden Sitzungen nicht mehr verbinden

Posted on July 13th, 2006 by Reiner.
Categories: Deutsch, Computers.

Mist! Eben wurde ich aus einer Sitzung geworfen und ich komme ums Zerplatzen nicht wieder ran: Entweder wird eine völlig neue Sitzung erstellt (z.B. an einem “echten” Terminal Server) oder ich komme überhaupt nicht mehr auf den Server, da die Maximalzahl der Verbindungen überschritten wurde (Administrationsmodus = max. 2 Verbindungen, das sind nicht allzu viele).

Woran liegt das in der Regel? 

Wenn die Verbindung zwischen Client und Server eher indirekt (z.B. über NAT-Router o.ä.) läuft, kann es sein, dass der Terminal Server einen eingetretenen Verbindungsverlust gar nicht erkennen kann. Der Client hat keine Verbindung mehr, aber für den Server ist der Client immer noch verbunden. Er ist für ihn halt einfach nur “idle”.

Das passiert besonders gerne und reproduzierbar, wenn man z.B. die Sitzung minimiert, da dann keinerlei Daten mehr zwischen Client und Server ausgetauscht werden (nicht mal mehr die Uhr in der Taskleiste). Diese Inaktivität ist gerade auch bei clientseitigen NAT-Routern (immer mehr verbreitete “DSL-Router”) fatal, da diese wg. der fehlenden Aktivität nach einer bestimmten geräteabhängigen Zeitspanne (i.d.R. einige Minuten) die Zuordnung zwischen lokalem Gerät (mit privater IP + Port) zum Verbindungsziel (i.d.R. öffentliche IP + Port) löschen, wenn keine Daten über die Verbindung ausgetauscht werden. Keiner der Verbindungspartner bekommt dabei von dem so ausgelösten Verbindungsverlust etwas mit und wenn ich am Client die minimierte Sitzung wieder herstelle oder maximiere, ist sie einfach nur mausetot :-(

Was kann man dagegen tun? 

Die Abhilfe ist zum Glück in Windows 2003 (evtl. auch XP - aber von mir nicht getestet) ganz trivial, aber leider aus mir nicht nachvollziehbaren Gründen von Microsoft standardmäßig nicht aktiviert. Der Terminal Server kann sog. Keep Alives schicken. Das bedeutet, dass der Terminal Server statt der wegen der Inaktivität ausbleibenden Nutzdaten in regelmäßigen Intervallen leere Dummy-Datenblöcke an den Client sendet.

Dies hat zuerst auch gleich eine sehr mild negative Auswirkung: Es wird (ganz wenig) zusätzlicher Netzwerkverkehr erzeugt (standardmäßig jede Minute ein winziger Block + Quittung).

Dem stehen jedoch zwei grandiose Vorteile gegenüber :-)

  • Der Terminal Server kann an Hand der ausbleibenden TCP/IP-Quittung feststellen, dass keine Verbindung mehr zum Client besteht und dadurch z.B. den Zustandswechsel der Sitzung von Verbunden zu Getrennt vornehmen, so dass man sich nachfolgend wieder mit der bestehenden Sitzung verbinden kann.
  • Durch die künstliche Übertragungsaktivität erkennen NAT-Router, dass eine Verbindung weiterhin aktiv ist und nehmen daher lieberweise davon Abstand, die Verbindungszuordnung zu löschen.

Und wo muss ich jetzt was einstellen?

Wie immer in der Registry - wo denn sonst? Dabei gibt es zwei Möglichkeiten:

  • Für einzelstehende Server kann man unter HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server den DWord-Wert KeepAliveInterval=1 (hier in Minuten) eintragen. Eine .reg-Datei habe ich dazu hier vorbereitet: TerminalServerKeepAlive.reg (in der ist auch das hier am Bildschirm evtl. schlecht nachzuweisende Leerzeischen zwischen Terminal und Server).
  • Bildschirm Snapshot Einstellen des Terminal Server Keep Alive per RichtlinieAuf Servern, die per AD-Policies steuerbar sind, kann diese Einstellung per Richtlinie getroffen werden. Ein Bild sagt mehr als tausend Worte.

Vertraue mir: Die o.a. Keep Alives sind die richtigen. Es gibt zwar weitere TCP/IP-Keep Alives in der Registry, die aber wer-weiß-was bewirken, eine RDP-Verbindung aber nicht beeindrucken. Für Citrix existieren ggf. eigene andere Keys…

Was noch? 

Keep Alives können auch clientseitig aktiviert werden (z.B. als Parameter für das Browser-ActiveX mit “MsRdpClient.AdvancedSettings2.KeepAliveInterval = 60000″, hier in Millisekunden), die ich jedoch nicht getestet habe und von denen ich böserweise annehme, dass sie zwar ggf. eine NAT-Verbindung offen halten können, aber bei einem Verbindungsverlust aus sonstigen Gründen lediglich bewirken, dass der nur Client erkennt, dass keine Verbindung mehr besteht, nicht aber den Server dazu veranlasst den Sitzungszustand von Verbunden auf Getrennt zu aktualisieren.

Fröhliches Home- und Inseloffice wünscht
Reiner

0 comments.

Leave a comment

Comments can contain some xhtml. Names and emails are required (emails aren't displayed), url's are optional.