Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden

PowerShell-Kniff: Geschlossene Ports erkennen

Als Entwickler E-Mails via Code ver­sen­den ist kein Problem, oder? Verschiedene Bibliotheken ste­hen zur Verfügung, die Kontakt zum Mailserver auf­neh­men und Mails ver­schi­cken. Was aber, wenn das wider Erwarten nicht klappt? Dann kann es sein, dass im inter­nen Netz Ports gesperrt sind.

Wir könn­ten in der IT nach­fra­gen, wel­che Ports denn betrof­fen sind. Mit ein wenig PowerShell kön­nen wir die Kollegen aber in Ruhe las­sen und das sel­ber herausfinden.

PortQuiz.net ant­wor­tet auf allen Ports

Um die Verbindung auf einem Port zu tes­ten, benö­ti­gen wir einen Server, der auf die­sem Port zuver­läs­sig ant­wor­tet. Und das am bes­ten für belie­bige Ports, damit wir nicht von Server zu Server zie­hen müs­sen. Diese Herausforderung schien auch ein ande­rer Entwickler zu haben und stellt uns einen Dienst bereit, der genau das macht: PortQuiz.net.

Unter der URL portquiz.net wer­den TCP-Anfragen auf allen Ports ent­ge­gen­ge­nom­men. Also los. Die .NET-Klasse System.Net.Sockets.TcpClient erlaubt es, TCP-Verbindungen auf­zu­bauen. Das funk­tio­niert auch in PowerShell, bspw. so:

$asyncRes = $tcpclient.BeginConnect("portquiz.net", 25, $null, $null) # test port 25

Der Server müsste nun ant­wor­ten. Wenn er nicht ant­wor­tet, dann ist das ein Hinweis dar­auf, dass die­ser Port von der Firewall blo­ckiert wird.

Um nun meh­rere Ports zu tes­ten ist es not­wen­dig, einen kur­zen Timeout für den Verbindungsversuch zu defi­nie­ren. Folgendermaßen lässt sich auf den Verbindungsaufbau mit einer hal­ben Sekunde Timeout warten:

$asyncRes = $tcpclient.BeginConnect("portquiz.net", 25, $null, $null)
$connected = $asyncRes.AsyncWaitHandle.WaitOne(500, $false) # wait 500ms

Am Rückgabewert der Warteoperation lässt sich able­sen, ob die Verbindung zustande kam, oder ob es einen Timeout gab. Jetzt braucht es nur noch eine Schleife drum­rum und wir kön­nen die für uns inter­es­san­ten Ports auto­ma­ti­siert durchtesten.

Fertiges Script auf GitHub

Ein kom­plet­tes Script zum Kopieren und sel­ber Ausführen habe ich als Gist auf GitHub zur Verfügung gestellt:

https://gist.github.com/heinrich-ulbricht/e22ee038585ea33db1988d14f9b634f1

Die Ausgabe des Scripts sieht dann unge­fähr so aus:

Port-Test Ergebnis

Viel Erfolg beim Testen und Entwickeln!

Related Posts

Pin It on Pinterest