2010-10-12 103 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