Реле DNS UDP на порту 53

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

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

Я протестировал код из сокета, и результаты работают нормально, но по какой-то причине 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();
    }

person Andrew smith    schedule 12.10.2010    source источник


Ответы (2)


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

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

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

person Nikolai Fetissov    schedule 12.10.2010

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

person krico    schedule 12.10.2010
comment
Почти все операции являются UDP. TCP требуется только для AFXR, DNSSEC и для не очень распространенных случаев ответов размером более 512 байт. - person jweyrich; 14.10.2010