当前位置:   article > 正文

详解域名解析服务_开源域名解析服务器

开源域名解析服务器

目录

域名系统简介

完全限定域名

域名解析流程

dns资源记录

域名解析返回码

BIND

配置⽂件

RNDC

CoreDNS

配置⽂件


域名系统简介

    DNS全称Domain Name System,即域名系统,主要作用是实现域名和IP地址之间的相互解析,提供这种解析服务的就是DNS服务器,这些服务器本质上是和IP映射关系的数据库,宏观上组成了域名解析分布式集群。

    域名解析服务器集群是一种树状结构,树的顶端是根域名服务,其下是顶级域名服务,再下依次是次级域名服务,三级域名服务等。如google.com是一个次级域名,而www.google.com是一个三级域名。

    全世界有13组根域名服务器(各国还会维护一些根镜像服务器),通过根域名可以找到各顶级域名服务器,依此类推。对互联⽹上某级域名直接负责(即可解析)的域名服务器称为权威DNS服务器, 而直接服务于⽹络终端设备(也即DNS客⼾端, 如个⼈计算机, 应⽤服务器等)的通常是LocalDNS LocalDNS即本地DNS服务器。本地DNS服务器可以缓存域名和IP的映射关系, 也可以⾃ 定义私有域名, 而对于互联⽹域名则会请求上层的域名服务器。

完全限定域名

    完全限定域名(Fully Qualified Domain Name, FQDN) ⼜称完全资格域名, 绝对域名, 完整域名 等, 它是包含从主机域到顶级域到根域的完整域名结。通常情况下我们习惯使⽤⾮完全限定域名,非完全限定域名形如 google.com , www.google.com 等, 域名均是以顶级域(如com)作为结尾。但完全限定域名是以根域结尾的。根域以 . 表⽰, 因此 www.google.com. 才是完全限定域名。完全限定域名的意义在于它没有模糊空间, 只能⽤⼀种⽅式解析。

    ⼀般而⾔, DNS客⼾端(通常操作系统内置)都会默认为应⽤请求的域名追加根域以构成完全限定域名供DNS服务器进⾏解析, 所以我们通常将根域省略。但有时候情况却不⼀样。

     如 /etc/resolv.conf 是Linux系统上DNS客⼾端默认的域名解析配置⽂件, 假设其中作如下配置:

  1. nameserver 10.43..10
  2. search default.svc.cluster.local svc.cluster.local cluster.local
  3. options ndots:5
  • nameserver: 域名解析服务器地址, 表⽰默认情况下域名解析请求发往之处, 这个字段通常是必须的, 否则客⼾端只能依靠 /etc/hosts 的固定映射进⾏有限解析。
  • search: ⾮完全限定域名的搜索路径,DNS客⼾端会依据该字段指定的搜索路径列表,依次将这些路径拼接到请求的域名之后,形成新的域名向DNS服务器发出请求,⼀旦解析完成就不再继续尝试。如原始域名请求为 foo.bar , 则依此配置, DNS客⼾端将依此向DNS服务器发送 foo.bar.default.svc.cluster.local. , foo.bar.svc.cluster.local. , foo.bar.cluster.local. 请求, 当上述请求均⽆法解析时再发送 foo.bar. 请求。但搜索路径不会对完全限定域名⽣效. 如果原始请求为 foo.bar. , 则DNS客⼾端只会发送原始请求。
  • options ndots: 请求域名的点号阈值, 只有当原始请求的域名中的点号数量低于该值时, 才会让搜索路径⽣效, 进⾏完全限定域名的拼接。如果该值为 1 , 则对原始域名 foo.bar 就不会进⾏域名拼接, 直接发起请求了。

域名解析流程

域名解析查询主要分为递归和迭代两种⽅式:

  • 递归查询: DNS客⼾端向DNS解析服务器发起域名解析请求, DNS服务器要么返回域名对应的IP地址, 要么返回找不到的错误。递归查询⼀般发⽣在⽹络终端设备与本地DNS服务器之间, 因此本地DNS服务器通常⼜称为递归DNS服务器。
  • 迭代查询: DNS客⼾端向DNS解析服务器发起域名解析请求, DNS服务器会返回"距离最近"的顶级, 次级或权威域名服务器, 不会直接返回解析结果, DNS客⼾端需要再次向返回的域名服务器发出域名解析请求。迭代查询⼀般发⽣在DNS服务器与与DNS服务器之间, 发起请求的DNS服务器充当了DNS客⼾端的⻆⾊, 本地DNS服务器通常就是向各级域名服务器完成了迭代查询请求后将最终解析结果返回给终端设备(当然本地DNS服务器的上层也可能是⼀个递归DNS服务器)。

  1. 客⼾端通过域名发起⽹络请求, 本地解析器⾸先查询/etc/hosts本地映射和本地缓存, 查询不到后通过/etc/resolve.conf中配置的本地域名服务器发起域名解析请求。通常这是⼀次递归查询。
  2. 本地域名服务器会⾸先查询其缓存或本地配置的域名映射, 查询不到后再以递归的⽅式向上层DNS服务器发起域名解析请求或者以迭代的⽅式向根域名服务器, 顶级域名服务器等依次查询最终获取解析结果。
  3. 客⼾端得到域名对应的IP地址后通过相应应⽤发出⽹络请求。

dns资源记录

    域名和IP地址映射关系是以dns资源记录(ResourceRecord: RR)的特定格式存储在DNS服务器 中的, dns资源记录中除映射关系外还包括⼀些额外字段:

  • Domain: 域名
  • TTL: 本条资源记录在DNS服务器Cache上保留的时⻓
  • class: ⽹络协议类型, 通常是IN, 表⽰internet 
  • type: 资源记录类型, dns资源记录有多种类型
  • rdata: 域名关联的信息数据 

资源记录的类型(type字段)主要有以下⼏种:

类型描述功能
AIPv4地址解析记录域名到IPv4地址映射关系
AAAAIPv6地址解析记录域名到IPv6地址映射关系
CNAME别名解析记录域名到域名别名(另⼀条域名)的映射关系
NS域名服务器记录域名到解析该域名的域名服务器映射关系
MX邮件交换记录邮件域名到相应邮件服务器映射关系
TXT⽂本记录对某个域名或主机名的说明
PTR反向DNS记录IP地址到域名的映射关系
SRV服务定位记录服务到域名的映射关系, 可⽤于服务发现与负载均衡
SOA权威记录起始多个权威域名服务器的主服务器
CAA权威认证授权记录DNS认证机构授权
URI统⼀资源标识符记录从域名或主机名到URI的映射
LOC位置记录域名所对应的地理位置

域名解析返回码

与HTTP类似, DNS服务器收到域名解析请求后会在响应中返回相应的状态码, DNS客⼾端会根据返回的状态码执⾏不同的操作。常⻅的域名解析返回码如下:

BIND

BIND(即Bekerley Internat Name Domain) 是最流⾏的开源DNS解析服务器软件, 可以通过yum install bind进⾏安装, BIND由named后台服务进程和配置⽂件构成, 其中named后台服务进程默认通过systemctl管理, 配置⽂件分为named主配置⽂件和zone解析库⽂件。BIND原⽣⽀持主从同步, 主服务器解析库(zone内数据)发⽣变化时, 会⾃动通知从服务器实现解析库同步。

配置⽂件

BIND配置⽂件分为named主配置⽂件zone解析库⽂件。其中主配置⽂件为对BIND的整体配置信息, 包含控制通道段, 全局配置段, ⽇志配置段区域配置段等。解析库⽂件⼀般根据不同的域分为多个zone⽂件, 每个zone⽂件中包含该域的宏定义, 缓存时间, 注释资源记录条⽬ (Resource Record, RR)等。

named.conf 配置⽂件格式如下:

  1. key "rndc-key" { #远程控制使⽤的认证key信息
  2. algorithm hmac-md5;
  3. secret "eoiWMiCwCYPwNLWxl05rNw==";
  4. };
  5. //控制通道段
  6. controls { #允许对named服务进⾏远程控制
  7. inet 127.0.0.1 port 953 #远程控制开放的地址和端⼝
  8. allow { 127.0.0.1; } #允许远程控制的主机列表
  9. keys { "rndc-key"; }; #远程控制使⽤的认证key
  10. };
  11. //全局配置段
  12. options {
  13. listen-on port 53 { 192.168.31.113; }; #设置通信的⽹段,这⾥建议使⽤本机
  14. IP,并⾮127.0.0.1
  15. listen-on-v6 port 53 { ::1; }; #监听bind端⼝
  16. directory "/var/named"; #指定区域⽂件存放路径
  17. dump-file "/var/named/data/cache_dump.db"; #设置当执⾏rndc dumpdb
  18. 命令后导出⽂件存放路径
  19. statistics-file "/var/named/data/named_stats.txt";
  20. memstatistics-file "/var/named/data/named_mem_stats.txt"; #服务器输出的
  21. 内存使⽤统计⽂件名
  22. recursing-file "/var/named/data/named.recursing";
  23. secroots-file "/var/named/data/named.secroots";
  24. allow-query { any; }; #允许查询来源(这⾥建议修改为IP地址,localhost代
  25. 表只允许本机查询) any代表所有⽹段
  26. allow-transfer { none; } #允许查询的⽹段
  27. recursion yes; #是否开启递归查询
  28. dnssec-enable yes; #是否⽀持DNSEEC开关
  29. dnssec-validation yes; #是否开启dnsec确认开关
  30. bindkeys-file "/etc/named.root.key";
  31. managed-keys-directory "/var/named/dynamic";
  32. pid-file "/run/named/named.pid";
  33. session-keyfile "/run/named/session.key";
  34. };
  35. //⽇志配置段
  36. logging {
  37. channel default_debug {
  38. file "data/named.run";
  39. severity dynamic;
  40. };
  41. #本段参数解释,将⽇志写⼊⼯作⽬录下的named.run⽂件。注意:如果服务器⽤-f参数启动,
  42. 则named.run会被stderr所代替,severity 按照服务器当前Debug级别记录⽇志
  43. #bind⽇志可以写到很多地⽅,具体写⼊⽅式可以参考
  44. https://blog.csdn.net/zhu_tianwei/article/details/45103455
  45. };
  46. //区域配置段
  47. zone "." IN { #.代表根域
  48. type hint; #代表根服务器,除hint还有master 代表主域名服务器,slave代
  49. 表辅助域名服务器,forward 代表转发服务器
  50. file "named.ca"; #域信息源数据库信息⽂件名
  51. };
  52. zone "cobb.com" IN { #域cobb.com的zone⽂件
  53. type master; #该域名服务器是主域名服务器,这个选项主要⽤在主备部
  54. 署中
  55. file "cobb.com.zone"; #解析域名cobb.com的zone⽂件内容,其路径由options
  56. 的directory指定
  57. allow-update { any; }; #定义了允许向主zone⽂件发送动态更新的匹配列表
  58. };
  59. include "/etc/named.rfc1912.zones"; #区域管理⽂件(包含资源记录、宏定义和注释)
  60. #通常定义在/var/named⽬录下且以.zone结尾
  61. include "/etc/named.root.key";
  62. zone "1.168.192.in-addr.arpa" in { #反向解析
  63. type master;
  64. file "cobb.com.rev"; #存放反向解析的⽂件
  65. allow-update { none; };
  66. };

*.zone 解析库⽂件格式如下:

  1. $ORIGIN . #宏定义段,代表根,否则在下⾯name段需要输⼊abcdocker.com.
  2. $TTL 600; #根缓存时间(10分钟)
  3. abcdocker.com IN SOA ns1.abcdocker.com. dnsadmin.abbcdocker.com. { #SOA代表
  4. 域下的资源记录全局配置,⼀个zone中有且只有⼀个
  5. 20200816; #序列号
  6. 10800; #刷新时间
  7. 900; #重试时间
  8. 604800; #过期时间
  9. 86400; #⾮权威应答ttl
  10. }
  11. NS ns1.abcdocker.com.
  12. $ORIGIN abcdocker.com #代表域名,下⾯的配置都相当于配置解析ns1.abcdocker.com,
  13. 这⾥如果不写,下⾯就需要写ns1.abcdocker.com
  14. $TTL 60; #域名过期时间,时间为60秒过期
  15. ns1 IN A 192.168.31.113 #A记录

BIND⽀持DNS动态更新机制, 如果在zone的区域配置段中配置了 allow-update 相关配置(可设置基于IP或key等ACL安全控制), 则该zone可在BIND的named服务不重启的情况下进⾏动态更新, ⽆需⼿动修改zone⽂件。

在BIND运⾏过程中, 通过 nsupdate 命令添加或删除域名资源记录(RR)时, 更新将存在于与该 zone同名的 .jnl ⽂件中, ⼀段时间后(默认15分钟)才会⾃动刷新到zone⽂件。因此对于BIND的备份, 要注意如果存在频繁的动态更新, 则jnl⽂件也需要备份, 否则恢复时可能出现资源记录丢失。

named服务的重启会导致.jnl⽂件中的记录被同步到zone⽂件中, 此外rndc⼯具的freeze和sync 命令也能够实现记录的⼿动同步。

RNDC

rndc(Remote Name Domain Controller) 是⼀个远程管理bind的⼯具, 通过这个⼯具可以在本地或者远程了解当前服务器的运⾏状况, 也可以对服务器进⾏关闭、重载、刷新缓存、增加删除 zone等操作。

使⽤rndc可以在不停⽌DNS服务器⼯作的情况进⾏数据的更新, 使修改后的配置⽂件⽣效。在实际情况下, DNS服务器是⾮常繁忙的, 任何短时间的停顿都会给⽤⼾的使⽤带来影响, 因此使⽤rndc⼯具可以使DNS服务器更好地为⽤⼾提供服务。

在使⽤rndc管理bind前需要使⽤rndc⽣成⼀对密钥⽂件, ⼀半保存于rndc的配置⽂件中, 另⼀半保存于bind主配置⽂件中。rndc与DNS服务器实⾏连接时, 需要通过数字证书进⾏认证, 而不是传统的⽤⼾名/密码⽅式。

rndc常⽤命令:

  1. # 命令格式:
  2. rndc -c /etc/rndc.conf -s <remote-dns-addr> -p <remote-dns-port> <option>
  3. # options:
  4. status #显⽰bind服务器的⼯作状态
  5. reload #重新加载配置⽂件和区域⽂件
  6. reload zone_name #重新加载指定区域
  7. reconfig #重读配置⽂件并加载新增的区域
  8. querylog #关闭或开启查询⽇志
  9. dumpdb #将⾼速缓存转储到转储⽂件 (named_dump.db)
  10. freeze #暂停更新所有动态zone
  11. sync #bind9⽀持, 将动态更新的记录同步到zone⽂件中
  12. sync [-clean] [zone [class [view]]] #动态更新同步到zone
  13. freeze zone [class [view]] #暂停更新⼀个动态zone
  14. flush [view] #刷新服务器的所有⾼速缓存
  15. flushname name #为某⼀视图刷新服务器的⾼速缓存
  16. stats #将服务器统计信息写⼊统计⽂件中
  17. stop #将暂挂更新保存到主⽂件并停⽌服务器
  18. halt #停⽌服务器,但不保存暂挂更新
  19. trace #打开debug, debug有级别的概念,每执⾏⼀次提升⼀次级别
  20. trace LEVEL #指定 debug 的级别, trace 0 表⽰关闭debug
  21. notrace #将调试级别设置为 0
  22. restart #重新启动服务器(尚未实现)
  23. addzone zone [class [view]] { zone-options } #增加⼀个zone
  24. delzone zone [class [view]] #删除⼀个zone
  25. tsig-delete keyname [view] #删除⼀个TSIG key
  26. tsig-list #查询当前有效的TSIG列表
  27. validation newstate [view] #开启/关闭dnssec

CoreDNS

CoreDNS是golang编写的基于插件的DNS服务器。CoreDNS本⾝对DNS相关规范进⾏了抽象, 其提供的⼏乎⼀切功能都是通过构建于抽象层的插件实现的。CoreDNS预编译版本内置了⼤量常⽤插件, 开发者也可以⾃⾏编写插件将其编译进CoreDNS中, CoreDNS功能强⼤且灵活, 内置的kubernetes插件能够⾃动发现并解析kubernetes集群内域名, 因此成为Kubernetes平台的标准DNS解析服务。

配置⽂件

默认情况下, CoreDNS会读取当前运⾏⽬录下的 Corefile ⽂件作为配置⽂件(当然也可以通过 - conf 标记⾃定义), 配置⽂件中指定了⼀个或多个 Server Block , 每个 Server Block 中包含⼀个或多个 Plugin Block , 而这些Plugin就是提供各项DNS或⾮DNS功能的插件。在Kubernetes环境中, CoreDNS的 Corefile 通常是以 configmap 资源的形式挂载到CoreDNS容器中的。

除 Corefile 外, CoreDNS还存在⼀个⾮常重要的配置⽂件plugin.cfg , 该⽂件在CoreDNS编译时⽣效, 指定了启⽤的插件列表以及各插件的调⽤顺序。插件的调⽤顺序并不取决于各插件在 Corefile 的 Plugin Block 中的顺序, 而是取决于编译时在 plugin.cfg ⽂件中指定的顺序。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/264159
推荐阅读
相关标签
  

闽ICP备14008679号