CoreDNS笔记
因为项目的原因需要在客户端启动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笔记的更多相关文章
- Linux网络学习笔记(二):域名解析(DNS)——以 CoreDNS 为例
个人笔记,观点不一定正确. 适合对 Kubernetes 有一定了解的同学. 前言 最近一直在学习 Kubernetes,但是手头没有个自有域名,要测试 ingress 就比较麻烦,每次都是手动改 h ...
- kubernets学习笔记
K8s CI :持续集成CD :持续交付 D --DeliveryCD :持续部署 D --Deployment Kubernetes Cluster: Masters: (3-host 做高可用)A ...
- k8s kubernetes 核心笔记 镜像仓库 项目k8s改造(含最新k8s v1.16.2版本)
k8s kubernetes 核心笔记 镜像仓库 项目k8s改造 2019/10/24 Chenxin 一 基本资料 一 参考: https://kubernetes.io/ 官网 https://k ...
- Kubernetes 学习笔记(一):基础概念
个人笔记,仅本人查阅使用,不保证正确. 零.微服务 微服务架构专注于应用解耦合,通过将应用彻底地组件化和服务化,每个微服务只包含一个非常小的功能,比如权限管理.日志收集等等.由这一组微服务组合起来,提 ...
- Kubernetes笔记(二):了解k8s的基本组件与概念
前文 Kubernetes笔记(一):十分钟部署一套K8s环境 介绍了如何快速搭建一个k8s系统.为了继续使用k8s来部署我们的应用,需要先对k8s中的一些基本组件与概念有个了解. Kubernete ...
- 【k8s学习笔记】使用 kubeadm 部署 v1.18.5 版本 Kubernetes集群
说明 本文系搭建kubernetes v1.18.5 集群笔记,使用三台虚拟机作为 CentOS 测试机,安装kubeadm.kubelet.kubectl均使用yum安装,网络组件选用的是 flan ...
- Kubernetes学习笔记_尚硅谷
https://www.bilibili.com/video/BV1w4411y7Go?p=1 一.K8s介绍 k8s是一个编排容器的工具,其实也是管理应用的全生命周期的一个工具,从创建应用,应用的部 ...
- git-简单流程(学习笔记)
这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- SQL Server技术内幕笔记合集
SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...
随机推荐
- 01-UPF介绍
Mainstream Low Power techniques clock gating - 低功耗的设计风格,4bit以上可以通过综合工具增加ICG APR的时候可以更换器件VT Advanced ...
- 05-Shell索引数组变量
1.介绍 Shell 支持数组(Array),数组是若干数据的集合,其中的每一份数据都称为数组的元素. 注意Bash Shell 只支持一维数组,不支持多维数组. 2.数组的定义 2.1 语法 在 S ...
- C++中不支持strdup(),使用_strdup()
1.问题 C4996 'strdup': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conf ...
- Oracle ORA-01861: 文字与格式字符串不匹配(日期格式导致的问题)
1.问题 如图所示,Oracle ORA-01861: 文字与格式字符串不匹配.这里的日期格式出现问题,导致了ORA-01861错误. 2.解决方式 原因: 如果直接按照字符串方式,或者直接使用to_ ...
- Oracle建立索引前后性能比较
1.SQL语句 create table C##HR.t_noindex as select * from all_objects; create table C##HR.t_indexed as s ...
- [转帖]xtrabackup2.4备份恢复脚本
https://developer.aliyun.com/article/534230#:~:text=xtrabackup2.4%E5%A4%87%E4%BB%BD%E6%81%A2%E5%A4%8 ...
- [转帖]tidb 如何对 TiDB 进行 TPC-C 测试
https://docs.pingcap.com/zh/tidb/stable/benchmark-tidb-using-tpcc TPC-C 是一个对 OLTP(联机交易处理)系统进行测试的规范,使 ...
- [转帖][译]ARM大小核架构白皮书
https://zhuanlan.zhihu.com/p/33411449 ARM big.LITTLE Processing with ARM Cortex-A15 & Cortex-A7 ...
- [转帖]013 Linux 搞懂「文件所属者更改及权限的赋予」从未如此简单 (chmod、chgrp、chown)
https://my.oschina.net/u/3113381/blog/5435014 01 一图详解「ls -l」 02 两种符号区分表示文件和目录 -(横线) # 表示非目录文件 d # ...
- Docker 运行 Redis Rabbitmq seata-server ftp 的简单办法
公司里面用到了很多组件, 发现安装二进制太麻烦了, 所以想用Docker 进行安装. 这里面简单给总结一下就不在折腾了.. 1. redis docker run -d -p 6379:6379 -- ...