Schlagwort: Technik

DNS-Cache unter Windows und mit C# leeren 👍 👎

Um den DNS-Zwischenspeicher unter Windows zu leeren, gibt es den bekannten Befehl ipconfig /flushdns.

Prinzipiell wäre es zwar möglich, das Programm ipconfig mit dem Argument /flushdns über die Process-Klasse per C# aufzurufen, jedoch ist dies nicht ganz unproblematisch, da die Ausführung längere Zeit dauern kann.

Alternativ hilft uns hier – wieder einmal – die Windows-API in Kombination mit dem DllImport-Attribut:
(Hilfs-)Methode deklarieren und verwenden
01020304050607
public static class DnsUtility {    [DllImport("dnsapi", EntryPoint = "DnsFlushResolverCache")]    public static extern void FlushCache();}
// DNS-Cache leerenDnsUtility.FlushCache();
Dies ist insbesondere in Verbindung mit der Dns-Klasse nützlich, um aktuelle Daten zu erhalten. Natürlich gibt es einen solchen Zwischenspeicher aber nicht grundlos, d. h. es ist nur äußerst selten ratsam, diesen immer wieder vor einer Namensauflösung zu leeren – Performanzdifferenzen im Rahmen einer Größenordnung sind hier üblich. Im Rahmen des Debuggings oder für besonders kritische Prozesse kann das Vorgehen jedoch durchaus sinnvoll sein.

Informationen zur Internetverbindung (und mehr) 👍 👎

Ursprünglich als (äußerst) minimalistisches Tool gestartet, um die aktuelle öffentliche IP-Adresse schnell (und vor allem ohne lästige Werbung) herauszufinden, kamen mit der Zeit einige weitere Funktionen hinzu.

Da das Projekt bereits seit einiger Zeit stillschweigend unter Projekte hier auf der Webpräsenz verlinkt wurde, haben sehr viele Besucher bereits darauf zugegriffen. Mich erreichten daher auch bereits einige Anfragen, ob beispielsweise Informationen zu beliebigen IP-Adressen (statt nur zur anfragenden IP-Adresse) abgefragt werden können und die allgemeine Verwendung des Tools für eigene Zwecke überhaupt erwünscht ist.

Zuerst möchte ich offiziell festhalten, dass selbstverständlich auch ihr die Funktionalität unter debug.coders-online.net für eigene Zwecke verwenden dürft – ansonsten hätte ich das Projekt nicht ohne weitere Hinweise öffentlich eingetragen, da ich frei verfügbare Informationen und Dienste auch als eben solche betrachte. Vielmehr gibt es sogar eine textbasierte Schnittstelle zur einfachen automatisierten Verwendung. Der am häufigsten gestellten Frage, der Freigabe für beliebige IP-Adressen, stehe ich leider etwas skeptischer gegenüber. Das liegt jedoch weniger an den technischen Möglichkeiten des Tools oder meinem Willen dazu.

Das Backend, welches die Informationen für Web-Oberfläche und Schnittstelle zur Verfügung stellt, ermöglicht selbstverständlich die beliebige Angabe von IP-Adressen – ansonsten wäre das Tool auch gar nicht allgemein einsetzbar. Von mir aus dürftet ihr auf diese "interne" Funktionalität gerne ebenfalls zugreifen, ich sehe jedoch gewisse Probleme dabei. Die angezeigten Informationen, insbesondere die der Registrierungsstelle/n, sind zwar öffentlich per Whois verfügbar, in der weiteren Verwendung jedoch üblicherweise auf ein berechtigtes Interesse beschränkt – bei der derzeitigen IP-Adresse des eigenen Anschlusses ist dieses sicherlich gegeben. Ich sehe mich andernfalls jedoch grundsätzlich der Gefahr ausgesetzt, dass massenweise Abfragen zu beliebigen Adressen mit fragwürdigem Ziel erfolgen. Da ich alle meine Projekte rein privat und großteils schlicht aus Freude an der Entwicklung (mit C#) betreibe, hoffe ich auf Verständnis, dass ich mein persönliches Risiko dabei minimieren möchte. Ihr könnt die Seiten aber beispielsweise auch einfach von eurem Server aus aufrufen.

Ich kann jedoch bereits darauf hinweisen, dass ähnliche Möglichkeiten bald auch für weitere Ziele zur Verfügung stehen werden: Im Rahmen eines Monitoring-Projekts, welches sich derzeit noch in einer frühen Entwicklungsphase befindet, können einige Funktionen auch auf eigene Webseiten und Server Anwendung finden. Selbst betriebene Server dürfen – nach einer entsprechenden Freischaltung – sogar besonders umfassend geprüft werden.

Zum Abschluss möchte ich noch die derzeit verfügbaren Funktionen kurz zusammenfassen:
  • Verbindung

    Auf der Startseite erfahrt ihr eure öffentliche IP-Adresse mit entsprechender Typisierung (IPv4, IPv6). Es wird versucht, die IP-Adresse in einen Hostnamen aufzulösen, welcher üblicherweise eine Bezeichnung mit Hinweis auf euren Anbieter enthält. Darüber hinaus werden Informationen zur Verschlüsselung (ihr könnt die Webseiten auch per HTTPS aufrufen) angezeigt und ihr habt die Möglichkeit, weitere Informationen zur IP-Adresse bei der zuständigen Registrierungsstelle abzufragen.

  • System

    Auf dieser Seite werden einige serverseitig ermittelbare Informationen zu eurem Browser und Betriebssystem angezeigt: Browser und dessen Version, die verwendete HTTP-Version, Do Not Track-Flag und Betriebssystem inkl. Version. Darüber hinaus werden die in eurem Browser konfigurierten Sprachen nach Priorität aufgelistet.

  • Tools

    Hier stehen einige weitere Abfragemöglichkeiten zur Verfügung. So kann beispielsweise die Latenz der Verbindung oder die Route zum Server bestimmt werden. Ihr könnt außerdem eure IP-Adresse auf Einträge in DNS-Blacklisten prüfen und häufig verwendete Ports des Systems überprüfen.

  • Kopfzeilen

    Auf dieser Unterseite werden alle von eurem Client zum Server gesendeten Kopfzeilen etwas aufbereitet dargestellt. Eine völlig unbearbeitete Ausgabe erhaltet ihr – wie auch in allen anderen Fällen – über die Schnittstelle. Das ist insbesondere dann praktisch, wenn ihr eigene HTTP-Funktionalität umsetzt und die gesendeten Felder prüfen möchtet.

  • Fähigkeiten

    Diese Informationen werden von HttpBrowserCapabilities zur Verfügung gestellt.

Die Webpräsenz ist auf Deutsch, Englisch und Niederländisch verfügbar; die Einstellung wird vom Browser bezogen. Vorschläge zu weiteren Funktionen und Meldungen zu Fehlern werden jederzeit gerne per Tracker angenommen.

UNIX-Zeitstempel und C# 👍 👎

In einem älteren Beitrag zum Thema Erweiterungsmethoden in C# hatte ich eine kleine Methode zur Arbeit mit UNIX-Zeitstempeln als Beispiel verwendet. Dieser Beitrag wird auch heute noch relativ häufig aufgerufen, weswegen ich zu diesem konkreten Beispiel anmerken möchte, dass das .NET-Framework seit Version 4.6 Funktionalität zur Arbeit mit entsprechenden Zeitstempeln auf der DateTimeOffset-Struktur bereithält:
Die Verwendung gestaltet sich wie üblich sehr einfach:
Konvertierung von UNIX-Zeitstempeln
010203040506070809
  // UNIX-Zeitstempel für aktuelles Datum und aktuelle Uhrzeit ermittelnlong unixTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
// bestimmtes Datum um 0:00 Uhr verwendenunixTimestamp = (new DateTimeOffset(new DateTime(1988, 1, 29))).ToUnixTimeSeconds();

// DateTime-Objekt lokaler Zeit aus UNIX-Zeitstempel erzeugenDateTime dateTime = DateTimeOffset.FromUnixTimeSeconds(unixTimestamp).LocalDateTime;
Eigene Implementierungen sollten für die aktuelle Praxis daher nicht mehr nötig sein.

DNS-Blacklisten mit C# abfragen 👍 👎

Im früheren Beitrag zur DNS-Auflösung mit C# haben wir eine grundlegende Möglichkeit kennengelernt, IP-Adressen zu Domains zu ermitteln. Dies möchten wir uns zu Nutze machen, um DNS-Blacklisten abzufragen, welche von vielen eMail-Systemen genutzt werden, um potentiellen Spam zu erkennen (und ggf. abzuweisen).

Zu den bekannten Anbietern entsprechender Dienste gehören beispielsweise: Diese setze ich auch selbst ein und habe jeweils gute Erfahrungen damit gemacht. Bitte informiert euch jedoch vor einem Einsatz beim jeweiligen Anbieter über die genauen Konditionen, der kommerzielle Einsatz ist beispielsweise oftmals kostenpflichtig. Ebenso verhält es sich je nach Anbieter ab einem gewissen Abfragevolumen.

Um nun eine IP-Adresse gegen die entsprechenden Dienste prüfen zu können, müssen wir diese dem oben angegebenen Hostnamen in umgekehrter Reihenfolge voranstellen und eine Namensauflösung durchführen.

Konkret fragen wir also beispielsweise bei einer Prüfung der IP-Adresse 217.160.176.125 auf Spam-Aktivität laut Spamhaus das Ergebnis der Domain 125.176.160.217.zen.spamhaus.org ab (welches hoffentlich negativ beschieden werden sollte). Per C# könnte man dies nun beispielsweise (durchaus verbesserungsfähig) wie folgt durchführen:
IP-Adresse auf Blacklisting prüfen
010203040506070809101112131415161718192021222324
public static bool CheckBlacklisting(IPAddress ipAddress, string blacklist = "zen.spamhaus.org") {    string ipAddressReversed = String.Join(".", ipAddress.GetAddressBytes().Reverse());    string hostName = String.Concat(ipAddressReversed, ".", blacklist);
try { foreach(IPAddress hostAddress in Dns.GetHostAddresses(hostName)) { /** * Achtung: Diese Implementierung ist naiv und sollte nicht direkt * übernommen werden. Je nach Anbieter, so beispielsweise auch bei * Spamhaus, gilt nicht der gesamte Loopback-Adressbereich als Spam. * Daher bitte vorher beim Anbieter informieren und konkretisieren! **/ if(IPAddress.IsLoopback(hostAddress)) { return true; } }
return false; } catch { return false; }}
bool checkResult = CheckBlacklisting(IPAddress.Parse("217.160.176.125")); // false
Das Ergebnis der Namensauflösung, also die erhaltene IP-Adresse, gibt darüber hinaus Aufschluss über den genaueren Status. Spamhaus liefert dazu beispielsweise in ihren FAQ weiterführende Informationen.

Wake on LAN per C# 👍 👎

Wake on LAN ist ein Standard zum Starten eines deaktivierten Rechners über eine kompatible Netzwerkkarte. Dazu wird lediglich ein bestimmtes Paket im Netzwerk gesendet; mit C# lässt sich das beispielsweise so lösen:
Klasse implementieren
0102030405060708091011121314151617181920212223242526272829
public static class WakeOnLAN {    public static void SendMagicPacket(byte[] macAddress) {        using(UdpClient udpClient = new UdpClient()) {            udpClient.Connect(IPAddress.Broadcast, 9);
byte[] magicPacket = new byte[(6 + (16 * 6))];
for(int i = 0; i < 6; i++) { magicPacket[i] = 0xFF; }
for(int i = 1; i <= 16; i++) { for(int j = 0; j < 6; j++) { magicPacket[((i * 6) + j)] = macAddress[j]; } }
udpClient.Send(magicPacket, magicPacket.Length); } }
public static void SendMagicPacket(string macAddress) { SendMagicPacket(macAddress .Split(':', '-') .Select(m => Byte.Parse(m, NumberStyles.AllowHexSpecifier)) .ToArray() ); }}
Das Paket enthält sechs mal den Wert FF16, gefolgt von der 16-maligen Wiederholung der MAC-Adresse und wird per Broadcast im Netzwerk versendet. Durch die Methodenüberladung wird die Übergabe der MAC-Adresse sowohl per Zeichenkette als auch per Byte-Feld ermöglicht:
Klasse verwenden
01020304050607
WakeOnLAN.SendMagicPacket("11:22:33:44:55:66");
/* – oder – */
WakeOnLAN.SendMagicPacket(new byte[] { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66});

Projektverweise

Kategorien / Archiv  |  Übersicht RSS-Feed

Schlagworte

Suche