[喵咪開源軟體推薦(5)]開源DNS服務-bind
[喵咪開源軟體推薦(5)]開源DNS服務-bind
哈嘍大家好呀!~~ 今天又為大家帶來了一個有趣的東西就是DNS伺服器,稍微瞭解網路的童鞋都知道我們在使用域名訪問一個網站的時候是通過公共DNS伺服器解析到IP地址的,比如谷歌的8.8.8.8 比如 114.114.114.114 都是大家耳熟能詳的DNS IP 地址, 那麼我們在開發中DNS有什麼用呢?怎麼大家一個DNS服務呢?就是我們今天博文的主要內容了,話不多說讓我們來對DNS一探究竟吧!
附上:
喵了個咪的部落格:w-blog.cn
1.DNS是什麼
DNS協議執行在UDP協議之上,使用埠號53.有自己域名或使用過域名解析的童鞋應該常常接觸到如下解析方式:
A記錄:將域名指向一個IPv4地址(例如:10.10.10.10),需要增加A記錄
CNAME記錄:如果將域名指向一個域名,實現與被指向域名相同的訪問效果,需要增加CNAME記錄
MX記錄:建立電子郵箱服務,將指向郵件伺服器地址,需要設定MX記錄
NS記錄:域名解析伺服器記錄,如果要將子域名指定某個域名伺服器來解析,需要設定NS記錄
SRV記錄:記錄了哪臺計算機提供了哪個服務。格式為:服務的名字.協議的型別(例如:_example-server._tcp)
這種域名的解析方式就是對DNS進行的配置,所有的域名先回經過DNS伺服器獲取到這個域名需要做什麼(比如指向到IP 192.168.0.1 我們稱之為定址) 或者是其他的定址方式
一般DNS是在我們網路配置中可以配置一個主DNS一個備DNS,一般都有預設的DNS配置,我們也可以使用自己的DNS服務,擁有自己的DNS服務就相當於擁有了所有的域名你可以吧任何域名指導不同的地方,比如對baidu.com指向到你自己的伺服器上面,訪問baidu.com就是訪問你自己的伺服器(前提是必須要配置使用你的DNS服務才會有效)
2.DNS可以運用到那些場景?
2.1 環境遷移
為什麼要寫這篇文章主要也是在工作中有使用到自建DNS服務得到的啟發向分享給大家,場景是這樣的
運營伺服器需要遷移,方案是先準備一個一比一的環境驗證沒問題了遷移資料改變域名指向,這裡面就遇到一個問題了,伺服器準備好了域名怎麼配置呢?當然不能使用運營的域名第一版思路是在所有的域名前面加一級 RES.xxxx.com 這樣,這樣雖然能夠解決問題但是會在面臨兩個問題,
- 如果使用RES域名那麼在遷移的時候又要進行大量的配置檔案修改 沒法保證驗證完成後遷移時最小改動
- 如果使用RES域名 那麼端(APP端和WEB端) 都要改配置檔案程式碼 —我們公司光APP就塊10多個還要打包ROM
就上面這個問題看來成本很高,並且這個成本付出了價值之存在於對新的環境進行驗證而已後續這些配置檔案也好打包好的端也好都沒有價值,並且還有重複的配置工作量
在這個前提上在想什麼樣子是最好的呢?首先端不用改,伺服器的配置最好一步到位,但是我們又只有一套xxxx.com 域名,那麼如果有兩套不就好了嗎? 如果正常使用是指向到運營的服務,但是在特定網路下比如一個WIFI下就可以指向到新的伺服器那不就是兩全其美了嗎?
這個時候就需要自建DNS來對xxxx.com域名解析到新的伺服器環境,然後讓訪問的時候DNS解析找自建的DNS解析就可以達到端不變還是請求xxxx.com伺服器也不變還是監聽xxxx.com,然後使用自建DNS解析的網路環境就可以訪問到新的環境了
2.2 測試臨時解析
很多時候域名都會被統一的管理起來,一般開發人員很難直接使用域名解析服務,一般是交給運維同事,這個時候就出現了一個問題,新的一個程式是新的域名需要做解析,給了運維一個解析的IP發現解析後用不了,然後來回調了很多次花了很多時間(正常的域名解析都要2-10分鐘才能生效,頻繁的解析可能會到2個小時),如果有自己的DNS就可以每個人都能去進行DNS解析又不影響到外面正在使用的客戶,當解析完成後測試好了在交給運維同事會更好
2.3 批量hosts
有的時候我們需要更改一下本機的hosts來對一些域名更換指向,比如科學上谷歌等之類的,如果每個人都需要去搞hosts就太麻煩了,可以使用自建DNS服務來統一更改
3.使用bind搭建自己的DNS伺服器
有了上面的結論筆者就開始找開源的DNS服務軟體,最終是找到了bind這個相對比較簡單的LIUNX DNS服務,我們來看看怎麼使用這套服務
DNS伺服器IP地址:192.168.1.20 伺服器版本:centos6.8 64位
3.1 安裝bind搭建解析
- 安裝bind:
yum -y install bind*
- 修改配置檔案
cp /etc/named.conf /etc/named.conf.bak
vi /etc/named.conf
修改為如下:
options {
listen-on port 53 { any; }; // 監聽在主機的53埠上。any代表監聽所有的主機
directory "/var/named"; // 如果此檔案底下有規範到正反解的zone file 檔名時,該檔名預設應該放置在哪個目錄底下
// 下面三項是服務的相關統計資訊
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; }; // 誰可以對我的DNS伺服器提出查詢請求。any代表任何人
recursion yes;
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
forwarders { // 指定上層DNS伺服器
8.8.8.8;
};
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
- 自定義域名解析
vi /etc/named.rfc1912.zones
zone "baidu.com" IN { // 定義要解析主域名
type master;
file "baidu.com.zone"; // 具體相關解析的配置檔案儲存在 /var/named/baidu.com.zone 檔案中
};
- 自定義baidu.com.zone檔案對百度進行解析
vi /var/named/baidu.com.zone
# 內容如下
$TTL 86400
@ IN SOA ns.baidu.com. root (
1 ; serial
1D ; refresh
1H ; retry
1W ; expire
0 ) ; minimum
@ IN NS ns.baidu.com.
ns IN A 192.168.1.20
www IN A 192.168.1.20
bbs IN A 192.168.1.20
其中 ns.baidu.com 代表當前dns伺服器名稱。所以 ns.baidu.com 一定要解析到自己本身
- 修改許可權
chown root:named /var/named/baidu.com.zone
- 重啟服務
service named restart
追加解析後注意也要重啟服務,遇到如下異常執行命令yum install mysql安裝mysql即可
Starting named: /usr/sbin/named-sdb: error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or directory
- 防火牆開發埠
vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 953 -j ACCEPT
修改DNS服務指向測試解析情況
當我們準備好服務之後,這個時候我們伺服器還是在使用預設的DNS伺服器進行解析這個時候我們需要配置有限使用本地的DNS解析服務來進行解析
# 注意:雲主機需要註釋掉**options timeout:1 attempts:1 rotate single-request-reopen
vim /etc/resolv.conf
nameserver 192.168.1.20
然後使用ping baidu.com 就指向到了192.168.1.20了
[root@ ~]# ping www.baidu.com
PING www.baidu.com (192.168.1.20) 56(84) bytes of data.
64 bytes from (192.168.1.20): icmp_seq=1 ttl=64 time=0.017 ms
64 bytes from (192.168.1.20): icmp_seq=2 ttl=64 time=0.034 ms
64 bytes from (192.168.1.20): icmp_seq=3 ttl=64 time=0.033 ms
4 總結
使用自建DNS可以對任何的域名進行指向可以解決一些特定場景的特定問題,在這裡分享給大家,如果大家喜歡可以繼續關注喵咪的部落格,後續會帶來更多有趣的技術文章…
注:筆者能力有限有說的不對的地方希望大家能夠指出,也希望多多交流!