最近Golang挺火,于是就想学学这门语言。
要学一门语言那肯定得找个项目练手,想了半天,决定不如实现一个DNS服务器吧。
由于众所周知的原因,国内的公众DNS解析服务总是不那么尽如人意,因此我一直计划实现一个DNS服务器,一来可以加快DNS解析的速度,二来还能避免DNS污染(当然主要还是为了写着玩)。
实现一个简单的DNS转发+缓存的玩意儿也没啥意思,这种东西已经够多了。因此最终的设计目标就成了完成一个可以用来当作权威DNS服务器的程序。是的,又要开新坑了。
DNS是工作在UDP和TCP之上的,最早的DNS协议由于互联网的兼容性原因,将最大UDP DNS数据包设置为了512字节,而现如今许多查询的结果往往远超这一限制,有两种方法解决这一问题,一个是TCP DNS,另一个则是采用EDNS0扩展。由于历史原因,TCP DNS在很多地方支持得并不算好,既然要实现一个DNS server,那我们就应该认真的玩,因此支持TCP查询和TCP请求也成为了实现的目标之一。
原始的DNS协议虽然可靠,但是它并不安全,某国的DNS投毒便可见一斑。现在的DNS引入了DESSEC,以签名的机制来保证解析结果的真实可信,既然要玩,那不如玩点大的,因此DNSSEC也成了实现的目标之一。
这个系列会记录整个实现过程,计划会分为三大部分,第一部分就是你现在看到的这个吹水文,第二部分可能会分为上中下三篇,详细的介绍整个DNS协议的细节,第三部分则是整个go程序的设计实现部分。
当然鉴于人类的本质,这个计划可能会拖很久才能实现,也可能写一半就咕了,所以能写多少算多少吧。
大概就是这样,下篇见。
Pingback: DNS的历史和原理 – 仰望苍天思寰宇