2010-10-12 64 views
0

我注意到BT Home正在从它们的DNS服务器发回虚假的DNS结果,并​​且这允许网站绕过我在防火墙中阻止的IP地址,所以我期待创建我自己的DNS中继/服务器。端口53上的DNS中继UDP

到目前为止,我可以接收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(); 
    } 

回答

1

我从来没有处理从C#原始DNS,但它看起来像你想的,而不是仅仅中继他们的DNS服务器来解析从客户端接收的字节数。

您从UDP套接字读取的消息包含一个DNS查询,而不仅仅是一个主机名。看看RFC 2929的内容。

您可能有兴趣在这个小巧但很棒的DNS过滤器 - adsuck - Marco Peereboom(尽管它适用于Unix,不适用于Windows)。

0

此外,你不应该尝试听UDP和TCP。我认为UDP主要用于权威的DNS查询。

+0

几乎所有的操作都是UDP。只有AFXR,DNSSEC和不常见的大于512字节响应的情况才需要TCP。 – jweyrich 2010-10-13 23:31:55