使用CoreDNS自建dns

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 使用CoreDNS自建dns

前言

公司有些内网服务需要使用域名访问,安装bind比较麻烦,故使用coredns实现域名服务。

IP 说明
192.168.0.41 安装dns,作为dns服务器
192.168.0.20 测试服务器

安装

有docker和预编译二进制文件等更多方式,这里采用预编译二进制文件进行安装。

下载地址:https://github.com/coredns/coredns/releases

运行

  1. 编写配置文件 Corefile
.:53 {
  # 绑定本机IP
    bind 192.168.0.41
    # 因为需要用域名的服务比较少,这里就直接使用hosts方式。
    # 如果需要配置大量域名,建议使用文件方式
    hosts {
        192.168.0.41 web.local.com
        ttl 60
        reload 1m
        fallthrough
    }
    # 最后所有的都转发到系统配置的上游dns服务器去解析
    forward . /etc/resolv.conf
    # 缓存时间ttl
    cache 120
    # 自动加载配置文件的间隔时间
    reload 6s
    # 输出日志
    log
    # 输出错误
    errors
}
  1. 运行。这里写了脚本来启动

目录结构如下:

├── bin
│   ├── coredns
│   └── start.sh
├── conf
│   └── Corefile
└── logs
    └── start.log

启动脚本示例(注意,因为默认监听53端口,所以需要使用root用户启动)

#!/bin/bash
# description: 启动CoreDNS
set -u
scriptDir=$(cd $(dirname $0) && pwd)
baseDir=$(cd ${scriptDir}/.. && pwd)
pidFile=${baseDir}/logs/app.pid
function prepare(){
  # 检查当前用户是否为root
  if [[ $(whoami) != "root" ]]; then
    echo "please use root privilege"
    exit 1
  fi
  # 检查是否存在配置文件, 无则报错退出
  if [[ ! -f ${baseDir}/conf/Corefile ]]; then
    echo "${baseDir}/conf/Corefile not found"
    exit 1
  fi
  
  # 检测是否存在日志目录, 无则创建
  if [[ ! -d ${baseDir}/logs ]]; then
    mkdir -p ${baseDir}/logs
  fi
  
  # 检查进程是否已存在, 存在则退出
  ps -ef | grep -v grep | grep ${scriptDir}/coredns > /dev/null
  if [[ $? -eq 0 ]]; then
    echo "coredns is running"
    exit 1
  fi
}
function startApp(){
    nohup ${scriptDir}/coredns --conf ${baseDir}/conf/Corefile \
      -pidfile ${pidFile} > ${baseDir}/logs/start.log 2>&1 &
}
function check(){
  # 检查是否正常启动
  for i in $(seq 2); do
    echo "checking coredns whether is running or not ..."
    sleep 1
  done
  ps -ef | grep -v grep | grep ${scriptDir}/coredns > /dev/null
  if [[ $? -eq 0 ]]; then
    echo "coredns is running"
  fi
}
function main(){
  prepare
    startApp
    check
}
main
  1. 启动
./start.sh

测试

  1. 修改测试服务器的/etc/resolv.conf,示例:
nameserver 192.168.0.41
  1. ping测试
ping -c4 web.local.com
ping -c4 www.baidu.com
  1. 如果上一步都正常响应的话,则说明成功。

参考

补充

停止脚本

#!/bin/bash
# description: 停止CoreDNS
set -u
scriptDir=$(cd $(dirname $0) && pwd)
baseDir=$(cd ${scriptDir}/.. && pwd)
pidFile=${baseDir}/logs/app.pid
function prepare(){
  # 检查当前用户是否为root
  if [[ $(whoami) != "root" ]]; then
    echo "please use root privilege"
    exit 1
  fi
  
  # 检查进程是否已存在, 存在则退出
  ps -ef | grep -v grep | grep ${scriptDir}/coredns > /dev/null
  if [[ $? -ne 0 ]]; then
    echo "coredns is not running"
    exit 1
  fi
}
function stopApp(){
  if [[ -f ${pidFile} ]]; then
    kill $(cat ${pidFile})
    rm -f ${pidFile}
  else
    local pid=$(ps -ef | grep -v grep | grep ${scriptDir}/coredns | awk '{print $2}')
    kill ${pid}
  fi
}
function check(){
  # 检查是否已停止
  for i in $(seq 2); do
    echo "checking coredns whether is running or not ..."
    sleep 1
  done
  ps -ef | grep -v grep | grep ${scriptDir}/coredns > /dev/null
  if [[ $? -ne 0 ]]; then
    echo "coredns is stopped"
  fi
}
function main(){
  prepare
  stopApp
  check
}
main
相关文章
|
5月前
|
域名解析 网络协议 Ubuntu
【域名解析DNS专栏】搭建私有DNS服务器:从BIND到CoreDNS的选择
【5月更文挑战第26天】本文对比了两种流行的DNS服务器软件BIND和CoreDNS。BIND以其稳定性及丰富功能著称,广泛兼容各类平台,适合复杂环境;CoreDNS则以其高性能、模块化设计和易用性脱颖而出。根据需求、资源和技术水平,用户可选择适合自己的DNS服务器。安装示例包括BIND在Ubuntu上的apt安装及基本配置,以及CoreDNS的snap安装和YAML配置。
373 0
|
域名解析 存储 Kubernetes
抓包就明白CoreDNS域名解析
抓包就明白CoreDNS域名解析
|
Kubernetes 网络协议 Perl
使用 CoreDNS sidecar 来优化 Kubernetes Pod dns 性能
介绍一种给业务 Pod 添加 dns cache sidecar 来增强 dns 性能的方法。
4415 0
|
Kubernetes 网络协议 容器
k8s集群配置使用coredns代替kube-dns
简介 CoreDNS是一个Go语言实现的链式插件DNS服务端,是CNCF成员,是一个高性能、易扩展的DNS服务端。可以很方便的部署在k8s集群中,用来代替kube-dns。 使用kubeadm初始化时指定 安装方法与《centos7使用kubeadm安装k8s集群》基本一致 只需要简单修改kubeadm-master.
4943 0
|
Kubernetes 网络协议 容器
使用CoreDNS实现Kubernetes基于DNS的服务发现
1.Kubernetes基于DNS的服务发现 在Kubernetes集群推荐使用Service Name作为服务的访问地址,因此需要一个Kubernetes集群范围的DNS服务实现从Service Name到Cluster Ip的解析,这就是Kubernetes基于DNS的服务发现功能。
3217 0
|
6天前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
21 0
|
6天前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
20 0
|
6天前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
15 0
|
6天前
|
安全 Java 程序员
Collection-Stack&Queue源码解析
Collection-Stack&Queue源码解析
17 0
|
4天前
|
存储
让星星⭐月亮告诉你,HashMap的put方法源码解析及其中两种会触发扩容的场景(足够详尽,有问题欢迎指正~)
`HashMap`的`put`方法通过调用`putVal`实现,主要涉及两个场景下的扩容操作:1. 初始化时,链表数组的初始容量设为16,阈值设为12;2. 当存储的元素个数超过阈值时,链表数组的容量和阈值均翻倍。`putVal`方法处理键值对的插入,包括链表和红黑树的转换,确保高效的数据存取。
24 5

推荐镜像

更多