arsoft.tools.net(DNS服务器)将流量从一个URL重定向到另一个URL(DNS转发)

在https://docs.ar-soft.de/arsoft.tools.net/上的arsoft.tools.net文档之后,我们开发了一个dns服务器来拦截来自网络的每个请求,一切正常!

让我们放慢脚步的是:当客户端键入www.google.com(例如)时,我们想要显示或重定向到www.yahoo.com(或IP地址),任何关于我们如何实现这一目标的线索?

有些人在这里寻找相同的解决方案: https : //arsofttoolsnet.codeplex.com/discussions?searchText = remirect

TKS

更新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; } } } } 

过了一段时间,这里是怎么做的:

 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() .Select(a => new ARecord(a.Name, a.TimeToLive, IPAddress.Parse("192.168.0.199"))) // some local ip address ) ); } e.Response = response; } } 
Interesting Posts