探索高效DNS服务:RubyDNS
RubyDNS 是一个强大且灵活的DNS服务器,它可以轻松地融入其他项目或独立作为守护进程运行。其默认采用基于规则的模式匹配,允许你硬编码、计算、从远程DNS服务器获取或从本地缓存中提取结果。
安装
在你的应用Gemfile中加入以下代码:
gem 'rubydns'
然后执行:
$ bundle
或者直接安装:
$ gem install rubydns
使用
examples/
目录里有大量示例供参考。下面是一个简单的DNS服务器示例(来自 examples/basic-dns.rb
):
#!/usr/bin/env ruby
require 'rubydns'
INTERFACES = [
[:udp, "0.0.0.0", 5300],
[:tcp, "0.0.0.0", 5300],
]
IN = Resolv::DNS::Resource::IN
# 使用上游DNS进行名称解析。
UPSTREAM = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]])
# 启动RubyDNS服务器
RubyDNS::run_server(INTERFACES) do
match(%r{test.local}, IN::A) do |transaction|
transaction.respond!("10.0.0.80")
end
# 默认DNS处理
otherwise do |transaction|
transaction.passthrough!(UPSTREAM)
end
end
启动服务器并测试:
$ RUBYOPT=-w ./examples/basic-dns.rb
$ dig @localhost -p 5300 test.local
$ dig @localhost -p 5300 google.com
文件描述符限制
在某些平台(如Mac OS X),文件描述符的数量默认较低,运行前应通过ulimit -n 10000
来提高。
自定义服务器
你可以创建和集成自己的自定义服务器,现在此功能已移动到 Async::DNS::Server
:
class MyServer < Async::DNS::Server
def process(name, resource_class, transaction)
transaction.fail!(:NXDomain)
end
end
Async::Reactor.run do
task = MyServer.new.run
# ... 其他操作,比如运行测试
# 如需手动关闭服务器,则可以调用,否则服务器将持续运行。
# task.stop
end
这是与其他项目集成的最佳方式。
性能
尽管代码基础有所变化,导致了少量性能上的小幅度退步,但RubyDNS与bind9
的性能在同一量级上。一个基础的并发解析1000个名字的基准测试重复5次,给出了以下结果:
user system total real
RubyDNS::Server 4.280000 0.450000 4.730000 ( 4.854862)
Bind9 4.970000 0.520000 5.490000 ( 5.541213)
这些基准测试也包含在单元测试中。为了测试bind9
性能,需要先安装,并确保which named
返回可执行文件。
DNSSEC支持
目前不支持DNSSEC,而且由于一些原因,未来也不太可能支持。
贡献
- fork它
- 创建你的特性分支 (
git checkout -b my-new-feature
) - 提交你的改动 (
git commit -am 'Add some feature'
) - 推送到你的分支 (
git push origin my-new-feature
) - 创建新的Pull Request
需要的功能
- 支持更多DNS功能,例如区域传输
- 更易于处理反向记录
- 类似系统级别的集成,比如将DNS服务器注册到当前的系统解析器
参考
大部分Gem由async-dns
实现。
- async-io — 异步网络和套接字库
- async-dns — 异步DNS解析器和服务
- async-rspec — 运行异步spec的共享上下文
许可证
遵循MIT许可。
版权所有,2017年,Samuel G. D. Williams。
根据以下条件,授权免费获得本软件及关联文档文件("软件")的副本:
保留此处的所有版权通知和其他版权声明;
不受任何限制,包括但不限于,复制、修改、合并、发布、分发、再许可、或销售本软件的副本,以及允许提供给您的人做同样的事情。
本软件“按原样”提供,不作任何明示或暗示的保证,包括但不限于对适销性、特定用途适用性的默示保证。在任何情况下,作者或版权持有者均不对因本软件或其使用而产生的任何损害承担责任。
了解更多
查看官方仓库以了解详细信息,参与讨论,提交问题或贡献代码。