Socket DNS Update Pakete empfangen

Ashiaka

Mitglied
Hallo zusammen,

ich habe ein paar Fragen zur Netzwerkprogrammierung mit Java. Ich versuche gerade einen in Java implementierten DNS-Server mit der Möglichkeit zu erweitern, DNS-Updates zu empfangen (siehe RFC 2136).

Ich habe bei der Netzwerkprogrammierung bisher allerdings nur Erfahrung in der Benutzung von ObjectOutputStreams / ObjectInputStreams bei ausschließlich in Java programmierten Server- Client-Anwendungen.

Deshalb suche ich nun ein paar Stichworte oder Tutorials die mir bei meinem Problem weiterhelfen könnten.

1. Muss ich hier ByteArrayInputStream in Verbindung mit DatagramSockets benutzen?
2. Ist das dann kompatibel zu C/C++, speziell dem Versenden von Chars?
3. Wenn ein DNS-Update Paket aus irgendeinem Grund auf mehrere UDP-Pakete aufgeteilt wird, wie kann man dann festellen, wann ein DNS-Update Paket vollständig vorliegt?
4. Gibt es vielleicht ein fertiges Dyn DNS-Server Modul, das ich beim googlen nicht gefunden hab?

Vielen Dank schonmal für Tipps und Anregungen,

Ashiaka
 
Ich hab inzwischen mal ein bisschen gebastelt und einen einfachen UDP Server aus der Java-Insel aufgesetzt:

Java:
public class UDPServer 
{ 
  public static void main( String[] args ) throws IOException 
  { 
    DatagramSocket socket = new DatagramSocket( 53 ); 
 
    while ( true ) 
    { 
      // Auf Anfrage warten 
 
      DatagramPacket packet = new DatagramPacket( new byte[1024], 1024 ); 
      socket.receive( packet ); 
 
      // Empfänger auslesen 
 
      InetAddress address = packet.getAddress(); 
      int         port    = packet.getPort(); 
      int         len     = packet.getLength(); 
      byte[]      data    = packet.getData(); 
 
      System.out.printf( "Anfrage von %s vom Port %d mit der Länge %d:%n%s%n", 
                         address, port, len, new String( data, 0, len ) ); 
      for (int i = 0; i<len;i++)
    	  System.out.print(data[i] + ".");
      System.out.println();
    } 
  } 
}

Das ganze hab ich dann auch mal mit nsupdate getestet:
>server 127.0.0.1
>update add test.com 86400 A 1.2.3.4
>send

Es wird also ein DNS-Update Paket an den UDP-Server geschickt, das folgenden Header besitzen sollte:
http://bio3d.colorado.edu/tor/sadocs/dns/dns-hdr.png .


Der Server gibt mir darauf hin aus:

?]wwwtestcom
-33.93.0.0.0.1.0.0.0.0.0.0.3.119.119.119.4.116.101.115.116.3.99.111.109.0.0.6.0.1.

Die ersten 2 byte ergeben sich aus der zufälligen ID im Header. Die naechsten beiden 0-bytes sollten aber definitiv ungleich 0 sein, da hier u.a. der Nachrichtentyp "UPDATE" kodiert sein müsste. Auch die TTL und die IP sind in dem Paket nicht vorhanden, obwohl das laut RFC 2136 so sein sollte. Die "1" als sechstes byte gibt an, dass es ganau einen Query in dem Paket geben soll, aber die Query selbst fehlt.

Sieht jemand auf die Schnelle wo mein Denkfehler sein könnte?

Ich weiss, dass es sich hierbei vermutlich nicht um ein Java spezifisches Problem handelt. Ich möchte nur sicher gehen, dass ich nichts übersehe.

Viele Grüße, Ashiaka
 
Das "?]" enspricht der zufälligen ID im Header des DNS-Pakets (in diesem Fall -33,93).

Weiterhin hab ich rausgefunden, dass nsupdate zunächst erstmal ein DNS-Query rausschickt um die Start Of Authority zu bestimmen, bevor das eigentliche DNS-Update rausgeschickt wird.

Mit Wireshark, ein bisschen reverse engineering und ein paar Zeilen Code sollte man einen fertigen DNS-Server eigentlich schnell anpassen können, so dass er DNS-Updates verarbeiten kann.

Viele Grüße,
Ashiaka
 

Zurück
Oben