什么是DNS服務
DNS的解析流程分析
遞歸查詢
迭代查詢
DNS相關的術語說明
生產環境中的應用
Bind9常見配置說明
使用ansible自動部署主從DNS
什么是DNS服務
DNS(Domain Name Service)是Internet上用于名稱解析的服務,簡單來說,就是將域名轉換為IP地址的服務(正向解析),也可以用于將IP地址解析為對應的域名(反向解析)。例如,訪問http://www.google.com.hk時,DNS會先將www.google.com.hk解析為59.24.3.173,用戶再通過59.24.3.173這個IP地址去打開google的網站。DNS服務默認監聽在udp/tcp的53端口,一般來說,udp53用于接收用戶的dns請求,tcp53用于dns服務器之間的通信。
DNS的解析流程分析
遞歸查詢
client向local dns請求www.google.com.hk ,假設local dns第一次接收到該域名的查詢請求,因此本地沒有緩存,從而需要至上而下的分別向根域(“.”)、頂級域(“hk.”)、二級域(“com.hk”)、三級域(“google.com.hk”)發起查詢直到獲得www.google.com.hk 的ip地址,然后local dns將最終的查詢結果(ip地址)返回給client。這個由client向local dns請求,local dns直接返回最終結果的過程就叫做遞歸,遞歸的顯著特點是client僅需一次查詢就獲得了最終結果,而不需要關心local dns中間復雜的逐級查詢過程。
迭代查詢
由local dns從根域自上往下發起查詢直到獲得最終解析結果的過程,稱之為迭代。迭代的特點是一次查詢不能獲得最終的解析結果。
DNS相關的術語說明
local dns: 客戶端本地指定的dns地址。 權威dns: 提供所管理的域下面的所有主機解析的dns服務器。例如,www.google.com 的域名最原始的解析是由dns.google.com這臺dns提供的,dns.google.com就是www.google.com 的權威dns。 資源解析記錄: A,SOA,NS,MX,CNAME,PTR等,下面分別對其進行介紹: SOA:Start Of Authority,起始授權記錄;一個區域解析庫有且僅能有一個SOA記錄,而必須為解析庫的第一條記錄; A:internet Address,最常用的資源記錄,用于將域名解析為IP; PTR: PoinTeR,反向指針記錄,用于將IP解析為域名,常用于反垃圾郵件系統; NS: Name Server,專用于標明當前區域的DNS服務器,配合A記錄使用; CNAME:Canonical Name,別名記錄,用于將別名指向另一個域名,配合A記錄使用; MX: Mail eXchanger,郵件交換記錄,配合A記錄使用,用于解析email地址中的域名 ;
生產環境中的應用
舉個我們目前生產環境中的例子,應用做成服務化之后,服務之間需要通過RPC來相互調用,為了避免服務前移時IP地址出現變更需要修改服務的配置文件,所以服務之間都使用了域名來訪問,這就需要搭建一套內部DNS了。另一方面,如果使用外部dns做泛域名解析的話,都會解析為一個公網ip,如果內部的應用都使用這個dns解析的話,應用之間通信的流量就會跑到公網,從而浪費的帶寬和增加了網絡時延,這也是考慮搭建內部DNS的原因。
Bind9常見配置說明
這里介紹的是直接使用rpm包安裝的方式,這種方式最簡單直接。以下是相關配置文件的介紹: /etc/named.conf: #主配置文件,用于定義dns的全局配置,include其他配置文件片段 acl ACL_NAME { //用來定義ip或網絡地址列表,后面配置需要應用該ip列表時可以通過ACL_NAME來引用 1.1.1.1; 192.168.0.0/24; ... }; options { listen-on port 53 { any; }; //指定dns服務的監聽地址和端口,any表示在本機所有ip上監聽53端口 directory "/var/named"; //指定區域解析數據庫文件的根目錄 allow-query { any; }; //設置允許哪些client做dns查詢 forward only; //開啟轉發dns功能,可選項有first|only,first表示先讓轉發的dns服務器解析,如果沒有得到結果,再由本地dns解析;only表示僅讓轉發目標dns去解析 forwarders { 114.114.114.114; //轉發的目標dns地址列表 }; allow-recursion { ACL_NAME; }; //指定接收遞歸的客戶端ip列表 dnssec-enable no; //協議安全加密通信相關的,一般關閉 dnssec-validation no; //協議安全加密通信相關的,一般關閉 }; logging { //日志記錄相關的 channel default_debug { file "data/named.run"; severity dynamic; }; }; include "/etc/named.rfc1912.zones"; //包含其他配置文件 include "/etc/named.root.key"; /etc/named.rfc1912.zones: #被主配置文件包含,一般用于定義每個zone的類型、zone數據庫文件的路徑及相關的安全策略 view VIEW_NAME { //設置視圖,用于根據客戶端源IP來選在不同的解析。如果使用了視圖,那么所有的zone配置必須位于視圖之內 match-clients { //指定匹配的客戶端ip列表 internal; }; zone "." IN { //定義根區域的配置 type hint; //根區域的類型為hint file "named.ca"; //根區域的數據庫文件 }; zone "gateray.org" IN { //自定義區域 type master; //類型為master,表示為該區域的主dns file "gateray.org.zone"; //指定區域數據庫文件的路徑 allow-update { none; }; //指定允許哪些ip可以動態的更新區域數據的資源記錄,none表示不允許更新 allow-transfer { slaves; }; //允許向哪些從dns服務器返回區域數據更新 }; }; /var/named/gateray.org.zone: #保存dns資源解析記錄的文件數據庫,一般以ZONE_NAME.zone方式命名 $TTL 1D @ IN SOA @ admin ( 2016062801 ; 更新的序列號 2H ;主從同步間隔時長 10M ;同步失敗的重試間隔 1W ;主dns掛掉時,從服務器能夠提供服務的最大時長 6H ) ;用于告訴客戶端,將解析失敗的結果緩存多久 IN NS ns1 ; NS記錄 IN NS ns2 ns1 IN A 192.168.124.71 ;權威dns的A記錄 ns2 IN A 192.168.124.72 www IN A 192.168.124.71 ;主機A記錄 m IN CNAME www ;主機別名記錄 * IN A 192.168.124.72 ;泛域名A記錄
使用ansible自動部署主從DNS
ansible工作空間目錄結構如下: [root@host1 deploy]# tree dns dns ├── ansible.cfg ├── deploy.yml ├── hosts └── roles ├── dns-master │ ├── files │ │ └── gateray.org.zone │ ├── tasks │ │ └── main.yml │ ├── templates │ │ ├── named.conf │ │ └── named.rfc1912.zones │ └── vars │ └── main.yml └── dns-slave ├── files │ └── gateray.org.zone ├── tasks │ └── main.yml ├── templates │ ├── named.conf │ └── named.rfc1912.zones └── vars └── main.yml #cd到dns目錄下執行如下命令,即可完成部署: [root@host1 dns]# ansible-playbook deploy.yml PLAY [masters] ***************************************************************** TASK [dns-master : Install bind9] ********************************************** ok: [192.168.124.71] => (item=[u'bind', u'bind-libs', u'bind-utils', u'libselinux-python']) TASK [dns-master : Config to bind9] ******************************************** ok: [192.168.124.71] => (item=named.conf) ok: [192.168.124.71] => (item=named.rfc1912.zones) TASK [dns-master : Add zone databases] ***************************************** ok: [192.168.124.71] => (item=gateray.org) TASK [dns-master : Reload named daemon] **************************************** changed: [192.168.124.71] PLAY [slaves] ****************************************************************** TASK [dns-slave : Install bind9] *********************************************** ok: [192.168.124.72] => (item=[u'bind', u'bind-libs', u'bind-utils', u'libselinux-python']) TASK [dns-slave : Config to bind9] ********************************************* ok: [192.168.124.72] => (item=named.conf) ok: [192.168.124.72] => (item=named.rfc1912.zones) TASK [dns-slave : Add zone databases] ****************************************** ok: [192.168.124.72] => (item=gateray.org) TASK [dns-slave : Reload named daemon] ***************************************** changed: [192.168.124.72] PLAY RECAP ********************************************************************* 192.168.124.71 : ok=4 changed=1 unreachable=0 failed=0 192.168.124.72 : ok=4 changed=1 unreachable=0 failed=0 # 下載地址:https://github.com/gateray/dns 補充說明: 在執行部署命令前,需要根據你的實際環境,修改dns/hosts及dns/roles/dns-master|dns-slave/vars/main.yml的變量值即可 變量說明: # dns/hosts: [all:vars] ansible_ssh_port=22 #指定ssh端口 ansible_ssh_user=root #ssh用戶 ansible_become=1 #ssh用戶為非root用戶時指定 ansible_become_user=root #將普通用戶切換至root用戶執行 ansible_become_method=sudo #用戶切換方法使用sudo [masters] 192.168.124.71 #指定主dns服務器的ip [slaves] 192.168.124.72 #指定從dns服務器的ip # dns/roles/dns-master/vars/main.yml --- slaves_list: #允許同步的dns從服務器列表 - 192.168.124.71 - 192.168.124.72 internal_list: # 內部網絡地址列表,表示允許遞歸查詢的客戶端列表,一般為內部服務器ip所在的網段 - 192.168.124.0/24 forwarder_list: # 轉發dns的地址列表 - 114.114.114.114 zones_list: # 指定區域名稱的列表 - gateray.org # dns/roles/dns-slave/vars/main.yml --- slaves_list: #允許同步的dns從服務器列表 - 192.168.124.71 - 192.168.124.72 internal_list: # 內部網絡地址列表,表示允許遞歸查詢的客戶端列表,一般為內部服務器ip所在的網段 - 192.168.124.0/24 forwarder_list: # 轉發dns的地址列表 - 114.114.114.114 zones_list: # 指定區域名稱的列表 - gateray.org gateray_org_masters_list: "192.168.124.71;" #用于在從服務器上指定master服務器的ip列表,不同ip之間需要“;”隔開,并以";"結尾
項目下載地址:
https://github.com/gateray/dns
原創文章,作者:gateray,如若轉載,請注明出處:http://www.www58058.com/20986