FQDN: Fully Qualified Domain Name
RR: Resource Record
在實做之前先來談談一般 client 是如何找到 server,可能情形有
1. 已經知道確切的 server IP address
2. 知道 server 的 FQDN,透過 DNS 取得 IP address
3. 使用 broadcast 方式去詢問,例如:DHCP discover
而 DNS SRV 是一種取得 server FQDN 的方法,用 service name, 使用的協定 (ex: TCP/UDP) 與 domain name 來詢問 DNS server,以得知 domain 裡支援此服務之 server(s) 的 FQDN,取得的 FQDN 可能不只一個。
接著根據 DNS SRV response 的 additional section 內含之資訊有兩種可能
1. 包含 FQDN 的 IP address,不需再詢問 DNS server
2. 不包含,所以需要再用 FQDN 去詢問 DNS server 以取得 IP address
用一句節錄自 RFC 2782 的敘述來說明 DNS SRV RR 的用途
The SRV RR allows administrators to use several servers for a single domain, to move services from host to host with little fuss, and to designate some hosts as primary servers for a service and others as backups.
SRV RR 允許管理者在單一個 domain 裡使用多個 server(s)(多個 servers 提供相同服務),當提供服務的主機換成另外一台主機時,還能夠維持良好的使用者體驗,且能指定某些主機做為服務的主要 servers 而其他主機做為備份 servers。
Bind9 設定實例
DNS SRV RR 的 format 如下
_Service._Proto.Name TTL Class SRV Priority Weight Port Target
底下是 bind9 的 SRV RR 實例 (domain 以 example.com 為例)
_xmpp-client._tcp IN SRV 0 5 5222 xmpp.example.com
_xmpp-server._tcp IN SRV 0 5 5269 xmpp.example.com
對應到 DNS SRV RR 的格式如下
_Service._Proto Class SRV Priority Weight Port Target
安裝設定步驟 (以 Ubuntu 為例)
1. 安裝 bind9
apt-get install bind9
2. 建立 db.example.com
cd /etc/bind/
cp db.empty db.example.com
3. 設定 db.example.com
把 db.example.com 中的 localhost 都取代成 example.com
再將上面兩行實例加入 db.example.com
還要新增對應的 A RR or AAAA RR
4. 新增 zone
將底下四行加入 named.conf.local
zone "example.com" {
type master;
file "/etc/bind/db.example.com";
};
5. 重啟 bind9
service bind9 restart
測試 DNS SRV
此處使用 dig 指令來做測試
dig -t SRV _xmpp-client._tcp.example.com
從 dig 輸出可以看到查到的 FQDN 是 xmpp.example.com 且 additional section 還有包含 xmpp.example.com 的 IP address
DNS SRV(RFC 2782)指出 SRV RR 的 service name 由 RFC 1700 定義,但 RFC 6335 (RFC 2782 的 update) 提到 DNS SRV 並沒有指出是 RFC 1700 的哪個章節有定義,且 IANA 也沒有分配 service name 的程序,造成不受 IANA 管理的非正式 service name 的產生。