2010-10-12 4 views
0

Я заметил, что BT Home отправляет обратно поддельные результаты DNS с их DNS-серверов, и это позволяет сайтам обходить IP-адреса, заблокированные в брандмауэре, поэтому я искал создание своего собственного ретранслятора DNS/сервер.DNS-ретранслятор UDP на порт 53

До сих пор я могу получить запрос на UDP-порт 53 и отправить их на DNS-сервер и получить действительный результат потока байтов [], а затем отправить обратно в браузер с использованием удаленного клиентского порта, на который был сделан запрос, но браузер просто отправляет запрос обратно.

Я протестировал код из сокета, и результаты работают нормально, но по какой-то причине IE/FF просто не будет за исключением результатов.

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(); 
    } 

ответ

1

Я никогда не имел дело с сырым DNS из C#, но это выглядит, как вы пытаетесь решимости байт вы получили от клиента, вместо того, чтобы просто ретрансляцию их на сервер DNS.

Сообщение, которое вы читаете с сокета UDP, содержит DNS-запрос , а не только имя хоста. Взгляните на RFC 2929 на то, что там происходит.

Возможно, вас заинтересует этот маленький, но отличный фильтр DNS - adsuck - от Marco Peereboom (хотя это для Unix, а не для Windows).

0

Кроме того, не следует пытаться и слушать UDP и TCP. Я думаю, что UDP используется в основном для авторизации DNS-запросов.

+0

Практически все операции UDP. TCP требуется только AFXR, DNSSEC и для не очень распространенных случаев ответов размером более 512 байт. – jweyrich

Смежные вопросы