【IT168技术】 DNS是域名系统的缩写。DNS支持使用TCP和UDP协议,使用53号端口。可能是国产教科书的缘故,许多人都不知道DNS还可以在TCP协议上传输。当然,国内的绝大多数DNS服务器都不支持TCP协议。本文讲述如何动手制作一个DNS代理。
你可能要问我:满世界都是DNS服务器,为什么要写一个DNS代理?
答案很简单:
①某些网络为了节约成本没有架设DNS服务器,需要一个轻量级的解决方案;
②升级的DNS代理可以实现一些企业需要的管理功能;
③我们国家防火墙看不懂TCP封装的DNS数据;
④学习网络协议。
若你需一个增强版的DNS代理,如可修改DNS请求和回答,可参考使用此开源类库:ARSoft.Tools.Net。
至于这个DNS代理能给你带来什么,还要由你自己决定。
本文目标:制作一个稳定、支持TCP和UDP协议的、可强制使用TCP协议请求、支持IPv6的DNS代理。
既然提到了要支持TCP协议,就简单提一下TCP协议封装和UDP协议封装的差异:UDP是直接传送消息;TCP封装的消息在消息前增加了所跟随消息的长度数据,其占用两个字节,使用大端序作为其字节序。
那么我们需要做的事情是:
①同时监听TCP和UDP的53号端口;
②接收到数据就原封不动的转发给外部的DNS服务器;
③把DNS服务器返回的数据原封不动的返回给请求者;
④继续监听。
实现代码:
View Code
调用代码:
using System.Threading;
namespace SimpleDnsProxy {
class Program
{
static void Main(string[] args)
{
DnsProxy.DefaultV4.Start();
DnsProxy.DefaultV6.Start();
new ManualResetEvent(false).WaitOne();
}
}
}
经过许多测试,目前此版本比较稳定。如果能得到类似如下结果,说明本机的DNS代理服务执行正确。