因为项目的原因需要在客户端启动DNS服务,拦截本机DNS请求,考察了一下开源的DNS Server项目,适合在Windows下使用的只有CoreDNS。

说明

CoreDNS的项目地址

https://coredns.io

https://github.com/coredns/coredns

这是go语言写的,所以默认支持大部分平台,在windows下有一些瑕疵(下面会说),但是总体已经是功能比较完整的一个DNS服务端实现。

使用

CoreDNS的使用很简单,coredns.exe配合一个Corefile配置文件直接就可以运行。配置文件的格式类似于

# 监听默认端口(53), .表示所有域名
. {
# 绑定lo网口,这样启动是静默的,否则默认绑定0.0.0.0会弹出windows防火墙
bind 127.0.0.1 # hosts插件,自定义域名的解析,解析的域名少就直接用hosts插件完成需求,如果有大量自定义域名解析建议用file插件使用 符合RFC 1035规范的DNS解析配置文件
hosts {
10.6.6.2 somewhere.com
10.6.6.3 ip.com
10.10.0.2 m.baidu.com
# ttl
ttl 60
# 继续执行
fallthrough
}
# 将走到这一步的所有解析请求转发给192.168.10.1,这里可以配置多个地址,转发时会同时对多个地址发起转发
forward . 192.168.10.1:53 # 重载hosts配置 windows下不支持
# reload 10s # 输出错误
errors # 输出日志
#log . "{remote}:{port} - {>id} \"{proto} Request: {name} {type} {rsize} {rcode}\""
}

在命令行执行下面的命令启动服务

coredns.exe -conf path\to\Corefile

然后新开一个窗口,验证dns服务是否正常。注意这里第二个参数就是DNS服务器地址,要用127.0.0.1不能用localhost

nslookup www.baidu.com 127.0.0.1

编译和定制

在Goland里可以直接通过go mod tidy && go build编译,在clone的代码上直接编译,产生的coredns.exe文件有60M。如果要减小文件尺寸,可以去掉一些不必要的插件。

插件的配置文件在plugin.cfg,可以将其中和k8s, aws相关的插件屏蔽,以下是我屏蔽插件后的列表

metadata:metadata
cancel:cancel
tls:tls
reload:reload
nsid:nsid
bufsize:bufsize
root:root
bind:bind
debug:debug
trace:trace
ready:ready
health:health
pprof:pprof
#prometheus:metrics
errors:errors
log:log
dnstap:dnstap
local:local
dns64:dns64
acl:acl
any:any
chaos:chaos
loadbalance:loadbalance
cache:cache
rewrite:rewrite
dnssec:dnssec
autopath:autopath
template:template
transfer:transfer
hosts:hosts
#route53:route53
#azure:azure
#clouddns:clouddns
#k8s_external:k8s_external
#kubernetes:kubernetes
file:file
auto:auto
secondary:secondary
etcd:etcd
loop:loop
forward:forward
grpc:grpc
#erratic:erratic
whoami:whoami
on:github.com/coredns/caddy/onevent
sign:sign

然后执行下面的命令就可以重新编译

# 根据plugin.cfg更新插件配置
go generate
# 编译
go build

这样产生的coredns.exe只有25M大小

通过coredns.exe -plugins命令可以看到包含插件的情况

coredns.exe -plugins
Server types:
dns Caddyfile loaders:
flag
default Other plugins:
dns.acl
dns.any
dns.auto
dns.autopath
dns.bind
dns.bufsize
dns.cache
dns.cancel
dns.chaos
dns.debug
dns.dns64
dns.dnssec
dns.dnstap
dns.errors
dns.etcd
dns.file
dns.forward
dns.grpc
dns.health
dns.hosts
dns.loadbalance
dns.local
dns.log
dns.loop
dns.metadata
dns.nsid
dns.pprof
dns.prometheus
dns.ready
dns.reload
dns.rewrite
dns.root
dns.secondary
dns.sign
dns.template
dns.tls
dns.trace
dns.transfer
dns.whoami
on

修改

因为要记录解析结果,但是CoreDNS的日志输出不包含解析结果,需要自己动手修改。这个修改在forward.go

在 ServeDNS() 方法下,在下面两行之前

		w.WriteMsg(ret)
return 0, nil

增加

		for _, a := range ret.Answer {
if a.Header().Rrtype == dns.TypeA {
for _, b := range ret.Question {
log.Printf("%v ", b.Name)
}
log.Printf("IP: %v\n", a.(*dns.A).A.String())
} else if a.Header().Rrtype == dns.TypeAAAA {
for _, b := range ret.Question {
log.Printf("%v ", b.Name)
}
log.Printf("IP: %v\n", a.(*dns.AAAA).AAAA.String())
} else if a.Header().Rrtype == dns.TypeCNAME {
for _, b := range ret.Question {
log.Printf("%v ", b.Name)
}
log.Printf("CNAME: %v\n", a.(*dns.CNAME).Target)
} else if a.Header().Rrtype == dns.TypePTR {
log.Printf("PTR: %v\n", a.(*dns.PTR).Ptr)
} else {
log.Printf("Type: %v\n", a.Header().Rrtype)
}
}

CoreDNS笔记的更多相关文章

  1. Linux网络学习笔记(二):域名解析(DNS)——以 CoreDNS 为例

    个人笔记,观点不一定正确. 适合对 Kubernetes 有一定了解的同学. 前言 最近一直在学习 Kubernetes,但是手头没有个自有域名,要测试 ingress 就比较麻烦,每次都是手动改 h ...

  2. kubernets学习笔记

    K8s CI :持续集成CD :持续交付 D --DeliveryCD :持续部署 D --Deployment Kubernetes Cluster: Masters: (3-host 做高可用)A ...

  3. k8s kubernetes 核心笔记 镜像仓库 项目k8s改造(含最新k8s v1.16.2版本)

    k8s kubernetes 核心笔记 镜像仓库 项目k8s改造 2019/10/24 Chenxin 一 基本资料 一 参考: https://kubernetes.io/ 官网 https://k ...

  4. Kubernetes 学习笔记(一):基础概念

    个人笔记,仅本人查阅使用,不保证正确. 零.微服务 微服务架构专注于应用解耦合,通过将应用彻底地组件化和服务化,每个微服务只包含一个非常小的功能,比如权限管理.日志收集等等.由这一组微服务组合起来,提 ...

  5. Kubernetes笔记(二):了解k8s的基本组件与概念

    前文 Kubernetes笔记(一):十分钟部署一套K8s环境 介绍了如何快速搭建一个k8s系统.为了继续使用k8s来部署我们的应用,需要先对k8s中的一些基本组件与概念有个了解. Kubernete ...

  6. 【k8s学习笔记】使用 kubeadm 部署 v1.18.5 版本 Kubernetes集群

    说明 本文系搭建kubernetes v1.18.5 集群笔记,使用三台虚拟机作为 CentOS 测试机,安装kubeadm.kubelet.kubectl均使用yum安装,网络组件选用的是 flan ...

  7. Kubernetes学习笔记_尚硅谷

    https://www.bilibili.com/video/BV1w4411y7Go?p=1 一.K8s介绍 k8s是一个编排容器的工具,其实也是管理应用的全生命周期的一个工具,从创建应用,应用的部 ...

  8. git-简单流程(学习笔记)

    这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...

  9. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  10. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

随机推荐

  1. DEV-C++调试报错

    1.报错信息如下: 2.原因 SIGSEGV是是当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号. 意思是程序接受一个无效的指针地址,Segmentation fault即是提示我们去 ...

  2. CSS 动画 : 创建 3D 立方体

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Go-单元测试-Test

    单元测试 文件名以 _test.go 结尾 函数名以 Test 开头 函数参数固定 t *testing.T 运行单元测试 go test Demo 源文件 package unit import & ...

  4. [转帖]SQL Server数据库重建索引、更新统计信息

    https://vip.kingdee.com/article/183932?productLineId=8 SQL Server数据库有时由于长期未做索引重建,导致SQL执行效率下降,当表的索引碎片 ...

  5. [转帖]如何使用coredump

    一.coredump 当用户态进程出现异常后,在该进程的执行目录下生成对应的coredump文件,如果我们想将coredump生成的位置做改变,就需要如下设置. echo "/home/co ...

  6. [转帖]Jmeter笔记:使用Jmeter向kafka发送消息

    https://www.cnblogs.com/daydayup-lin/p/14124816.html 日常工作中有时候需要向kafka中发送消息来测试功能或者性能,这时候我们怎么办呢?我之前是自己 ...

  7. Golang zip压缩文件读写操作

    创建zip文件 golang提供了archive/zip包来处理zip压缩文件,下面通过一个简单的示例来展示golang如何创建zip压缩文件: func createZip(filename str ...

  8. 【主流技术】实战之 Spring Boot 中集成微信支付(小程序)

    前言 微信支付是企业级项目中经常使用到的功能,作为后端开发人员,完整地掌握该技术是十分有必要的. 以下是经过真实商业项目实践的集成步骤,包括注册流程.调用过程.代码demo(经过脱敏)等,希望我的分享 ...

  9. 强化学习从基础到进阶-案例与实践[4.1]:深度Q网络-DQN项目实战CartPole-v0

    强化学习从基础到进阶-案例与实践[4.1]:深度Q网络-DQN项目实战CartPole-v0 1.定义算法 相比于Q learning,DQN本质上是为了适应更为复杂的环境,并且经过不断的改良迭代,到 ...

  10. 6.1 C++ STL 序列映射容器

    Map/Multimap 映射容器属于关联容器,它的每个键对应着每个值,容器的数据结构同样采用红黑树进行管理,插入的键不允许重复,但值是可以重复的,如果使用Multimap声明映射容器,则同样可以插入 ...