2010-10-12 11 views
0

J'ai remarqué que BT Home renvoyait de faux serveurs DNS à partir de leurs serveurs DNS, ce qui permet aux sites de contourner les adresses IP que j'ai bloquées dans le pare-feu. serveur. Jusqu'à présent, je peux recevoir une requête sur le port UDP 53 et les envoyer au serveur DNS pour obtenir un résultat de flux octet [] valide et je renvoie ensuite au navigateur en utilisant le port client distant sur lequel la requête a été effectuée. le navigateur envoie juste la demande à nouveau.Relais DNS UDP sur le port 53

J'ai testé le code à partir d'un socket et les résultats fonctionnent bien, mais pour une raison quelconque, IE/FF ne sera tout simplement pas à l'exception des résultats.

public void Listen() 
    { 
     receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
     receiveEndPoint = new IPEndPoint(IPAddress.Any, receivePort); receiveSocket.Bind(receiveEndPoint); 
     receivePort = (receiveSocket.LocalEndPoint as IPEndPoint).Port; 
     receiveBuffer = new byte[BufferSize]; 
     receiveAsyncResult = receiveSocket.BeginReceiveFrom(receiveBuffer, 0, receiveBuffer.Length, SocketFlags.None, ref receiveEndPoint, new AsyncCallback(NetworkMessageReceivedCallback), receiveSocket); 
    } 


    public void NetworkMessageReceivedCallback(IAsyncResult asyncResult) 
    { 
     EndPoint remoteEndPoint = null;    
     byte[] bytes = null;       
     remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); //Will contain the clients port     
     int bytesRead = receiveSocket.EndReceiveFrom(asyncResult, ref remoteEndPoint);            
     bytes = new Byte[bytesRead];     
     Buffer.BlockCopy(receiveBuffer, 0, bytes, 0, bytesRead); 
     //string ip = "208.67.222.222"; 
     string ip = "192.168.1.254"; 
     IPAddress dnsServer = IPAddress.Parse(ip); 
     Response R = Resolver.Lookup(bytes, dnsServer); 
     receiveSocket.SendTo(R.Message , remoteEndPoint);//127.0.0.1 
     receiveSocket.Close(); 
     Listen(); 
    } 

Répondre

1

Je ne ai jamais eu affaire avec le DNS brut de C#, mais il semble que vous essayez de résoudre les octets que vous avez reçu du client, au lieu de simplement relayer les au serveur DNS.

Le message que vous avez lu sur le socket UDP contient une requête DNS , pas seulement un nom d'hôte. Jetez un oeil à la RFC 2929 pour ce qui s'y passe.

Vous pourriez être intéressé par ce petit mais bon filtre DNS - adsuck - par Marco Peereboom (même si c'est pour Unix, pas Windows).

0

Aussi, ne devrait pas votre essayer et écouter UDP et TCP. Je pense que UDP est utilisé principalement pour les requêtes DNS faisant autorité.

+0

Presque toutes les opérations sont UDP. TCP est seulement requis par AFXR, DNSSEC, et pour les cas de réponses plus petits que 512 octets. – jweyrich