2016-06-02 1 views
4

arsoft.tools.net의 설명서를 https://docs.ar-soft.de/arsoft.tools.net/에 따라 방금 네트워크의 모든 요청을 가로 채기위한 dns 서버를 개발했습니다. 잘 작동합니다!arsoft.tools.net (DNS 서버) 한 URL에서 다른 URL로 트래픽 리디렉션 (DNS 전달)

Google의 속도를 늦추는 이유는 다음과 같습니다. 클라이언트가 www.google.com을 입력하면 (예 :) www.yahoo.com (또는 IP 주소)으로 리디렉션하고 싶은데, 그걸 성취 할 수 있을까요?

여기 동일한 솔루션을 찾는 사람들이있다 : https://arsofttoolsnet.codeplex.com/discussions?searchText=redirect

TKS

UPDATE 1 :

지금까지, 이것이 내가 가지고있는,하지만, 리디렉션이 작동하지 않습니다 :

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (DnsServer server = new DnsServer(System.Net.IPAddress.Any, 10, 10)) 
     { 
      server.QueryReceived += OnQueryReceived; 

      server.Start(); 

      Console.WriteLine("Press any key to stop server"); 
      Console.ReadLine(); 
     } 
    } 

    static async Task OnQueryReceived(object sender, QueryReceivedEventArgs e) 
    { 
     DnsMessage query = e.Query as DnsMessage; 

     if (query == null) 
      return; 

     DnsMessage response = query.CreateResponseInstance(); 
     //response.AnswerRecords.Clear(); 
     //response.AdditionalRecords.Clear(); 

     if ((response.Questions.Count == 1)) 
     { 
      // send query to upstream server 
      DnsQuestion question = response.Questions[0]; 

      if (question.Name.ToString().Contains("www.google.com")) 
      { 
       DnsMessage upstreamResponse = await DnsClient.Default.ResolveAsync(DomainName.Parse("www.yahoo.com"), question.RecordType, question.RecordClass); 
       //DnsMessage upstreamResponse = await DnsClient.Default.ResolveAsync(question.Name, question.RecordType, question.RecordClass); 

       foreach (DnsRecordBase record in (upstreamResponse.AnswerRecords)) 
       { 
        response.AnswerRecords.Add(record); 
       } 
       foreach (DnsRecordBase record in (upstreamResponse.AdditionalRecords)) 
       { 
        response.AdditionalRecords.Add(record); 
       } 

       response.ReturnCode = ReturnCode.NoError; 
       e.Response = response; 
      } 
     } 
    } 
} 
+0

이미 무엇을하려고 했습니까? 예를 들어 siteA에서 siteB까지 CNAME 레코드는 어떻게됩니까? – Evk

+0

아마도 리디렉션의 의미를 명확히하고 싶을 것입니다. 다른 사이트의 IP 만 반환하면 IP (A 레코드) 또는 CNAME으로 응답 할 수 있습니다. – Evk

+0

사용자가 브라우저에서 Google.com을 입력하여 yahoo.com 페이지를 DNS를 통해 표시하도록하고 싶습니까? – Evk

답변

3

얼마 후, 수행 방법은 다음과 같습니다.

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (DnsServer server = new DnsServer(System.Net.IPAddress.Any, 10, 10)) 
     { 
      server.QueryReceived += OnQueryReceived; 

      server.Start(); 

      Console.WriteLine("Press any key to stop server"); 
      Console.ReadLine(); 
     } 
    } 

    static async Task OnQueryReceived(object sender, QueryReceivedEventArgs e) 
    { 
     DnsMessage query = e.Query as DnsMessage; 

     if (query == null) 
      return; 

     DnsMessage response = query.CreateResponseInstance(); 
     DnsQuestion question = response.Questions[0]; 
     DnsMessage upstreamResponse = await DnsClient.Default.ResolveAsync(!question.Name.ToString().Contains("www.google.com") ? question.Name : DomainName.Parse("www.yahoo.com"), question.RecordType, question.RecordClass); 

     foreach (DnsRecordBase record in upstreamResponse.AnswerRecords) 
     { 
      response.AnswerRecords.Add(record); 
     } 
     foreach (DnsRecordBase record in (upstreamResponse.AdditionalRecords)) 
     { 
      response.AdditionalRecords.Add(record); 
     } 

     response.ReturnCode = ReturnCode.NoError; 
     e.Response = response; 
    } 
} 

당신이 어떤 IP 주소를 가리 키도록하려면 다음

static async Task OnQueryReceived(object sender, QueryReceivedEventArgs e) 
     { 
      DnsMessage query = e.Query as DnsMessage; 
      if (query == null) return; 
      DnsMessage response = query.CreateResponseInstance(); 

      if (response.Questions.Any()) 
      { 
       DnsQuestion question = response.Questions[0]; 
       DnsMessage upstreamResponse = await DnsClient.Default.ResolveAsync(question.Name, question.RecordType, question.RecordClass); 

       response.AdditionalRecords.AddRange(upstreamResponse.AdditionalRecords); 
       response.ReturnCode = ReturnCode.NoError; 

       if (!question.Name.ToString().Contains("yourdomain.com")) 
       { 
        response.AnswerRecords.AddRange(upstreamResponse.AnswerRecords); 
       } 
       else 
       { 
        response.AnswerRecords.AddRange(
         upstreamResponse.AnswerRecords 
          .Where(w => !(w is ARecord)) 
          .Concat(
           upstreamResponse.AnswerRecords 
            .OfType<ARecord>() 
            .Select(a => new ARecord(a.Name, a.TimeToLive, IPAddress.Parse("192.168.0.199"))) // some local ip address 
          ) 
        ); 
       } 

       e.Response = response; 
      } 
     }