jabber服务器在dns中的srv记录设置
2010-08-29 14:00:47 阿炯

通常XMPP client连接服务器是无须指定IP的,比如登录Gtalk,只需填入账号username@gmail.com及密码,标准的客户端都可以自动解析需要的服务器和端口连接到服务器上。这个解析就是通过DNS的SRV record来实现的。由于Gtalk采用的是开放的Jabber协议,所以其它采用此协议的软件也能与Gmail账号聊天。但Google Apps用户使用的是自己的域名,若与Gmail的账户聊天则没问题,若要与其它域的账户聊天,则要设置相关域名的SRV记录。

标准的 XMPP client解析的流程为(以unixaid.info为例)
1. 解析 "_xmpp-client._tcp.unixaid.info" ,获得连接的服务器和端口;
2. 如果失败,则解析 "_jabber._tcp.unixaid.info",这个主要针对老的服务器配置;
3. 如果还是失败,则客户端认为该域没有配置SRV记录,则直接解析"unixaid.info"并使用默认端口5222连接。

SRV具体的格式为
_Service._Proto.Name TTL Class SRV Priority Weight Port Target

可使用 Linux 命令 dig 查看设置结果。
$ dig -t SRV _xmpp-client._tcp.gmail.com
; DiG 9.5.1-P1 -t SRV _xmpp-client._tcp.gmail.com
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56871
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 4, ADDITIONAL: 4

;; QUESTION SECTION:
;_xmpp-client._tcp.gmail.com.    IN    SRV

;; ANSWER SECTION:
_xmpp-client._tcp.gmail.com. 86400 IN    SRV    5 0 5222 talk.l.google.com.
_xmpp-client._tcp.gmail.com. 86400 IN    SRV    20 0 5222 talk1.l.google.com.
_xmpp-client._tcp.gmail.com. 86400 IN    SRV    20 0 5222 talk2.l.google.com.
_xmpp-client._tcp.gmail.com. 86400 IN    SRV    20 0 5222 talk3.l.google.com.
_xmpp-client._tcp.gmail.com. 86400 IN    SRV    20 0 5222 talk4.l.google.com.

;; AUTHORITY SECTION:
gmail.com.        172800    IN    NS    ns4.google.com.
gmail.com.        172800    IN    NS    ns1.google.com.
gmail.com.        172800    IN    NS    ns2.google.com.
gmail.com.        172800    IN    NS    ns3.google.com.

;; ADDITIONAL SECTION:
ns1.google.com.        169948    IN    A    216.239.32.10
ns2.google.com.        169948    IN    A    216.239.34.10
ns3.google.com.        169948    IN    A    216.239.36.10
ns4.google.com.        169948    IN    A    216.239.38.10

;; Query time: 460 msec
;; SERVER: 192.168.1.76#53(192.168.1.76)
;; WHEN: Mon Mar  1 17:16:48 2010
;; MSG SIZE  rcvd: 370
-------------------------------------------------------
下面就以域unixaid.info为例来设置XMPP服务器(在godaddy.com上注册的域名,国内很域名注册商都不支持这些少见域名设置啊)。

一、加入该im服务器主机的的域名(这里以最简单的一台im-server为例)
添加一条A记录傎,这里为im.unixaid.info,ip指向xx.xx.xx.xx

二、加入_xmpp-server与_xmpp-client 的相关信息

注意'Service'与'Port'的值,如法炮制,添加_xmpp-client 的信息。最后会像这样:

在设置好im服务后,就仅可以填写如下信息即可使用属于你自己的服务器了,且其能与像gtalk这样支持XMPP的协议的服务器沟通了。在pidgin下的使用截图:

“高级”页中都不用做任何选择,如果不设置相关的srv的设置时,在“高级”页还必须设置完整的服务器名”im.unixaid.info”。且与其它xmpp的服务器沟通时会有问题。下面会介绍如何在BIND DNS中设置jabberd服务器的解析方法:
Configure the DNS to provide XMPP information

xmpp服务器需要与互联网其它的xmpp服务、(客户端不一定需要)进行通信与信息交流,就需要借助于dns服务器来实现。在dns服务器中配置完成后,来测试一下查询结果:
$ dig SRV _xmpp-server._tcp.freeoa.net

[...]

;; QUESTION SECTION:
;_xmpp-server._tcp.freeoa.net. IN   SRV

;; ANSWER SECTION:
_xmpp-server._tcp.freeoa.net. 86400 IN SRV 5 0 5269 jabber.freeoa.net.

;; ADDITIONAL SECTION:
jabber.freeoa.net.     86400  IN      A       11.22.33.44

The query ask for the xmpp-server in charge of the domain freeoa.net. The DNS of freeoa.net replies that this xmpp is handled by jabber.freeoa.net on tcp port 5269, and that jabber.freeoa.net is located at the IP address 11.22.33.44.

jabber   IN   A       11.22.33.44
conference   IN   CNAME   jabber

;srvce.prot.name                      class   rr  pri weight   port    target
_jabber._tcp.freeoa.net.              IN   SRV  5    0       5269    jabber.freeoa.net.
_xmpp-server._tcp.conference.freeoa.net. SRV 10 10 5269 jabberserver.freeoa.net.
_xmpp-server._tcp.freeoa.net.         IN   SRV  5    0       5269    jabber.freeoa.net.
_xmpp-client._tcp.freeoa.net.         IN   SRV  5    0       5222    jabber.freeoa.net.


说明如下:

'conference'主要为公共聊天服务室为准备的。

All SRV records have a priority of 5, a weight of 0 and point to jabber.freeoa.net.

_jabber._tcp.freeoa.net.
is the legacy SRV record for jabber servers
过时的jabber服务器srv记录

_xmpp-server._tcp.freeoa.net.
is the record that will be queried by other xmpp servers to know where to send xmpp messages
与其它xmpp服务器交互时需要设置的记录

_xmpp-client._tcp.freeoa.net.
is used by xmpp clients softwares to know to which server to connect to when adding a user account
客户端连接服务时需要使用的查询

server requests are sent to TCP port 5269 and client request to TCP port 5222
服务器端通信从5269端口进行而与客户端的通信将使用5222端口


Jabber客户端和服务器,能够使用 DNS SRV 记录用户主机名解析。SRV记录允许服务通过端口委托给其他主机。所以,如果你希望你的Jabber服务器运行在一个非主要域主机的机器上,你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机。

注意:SRV 记录只对非主要主机是必要的

只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候,DNS SRV 记录才是必要的。例如,如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1,那么 SRV 记录就不必要了。

Jabberd使用SRV记录
对于一个 Jabberd 安装,可以创建三个SRV记录:
 _jabber._tcp.<domain>   ->    <host>.<domain>:5269
 _xmpp-server._tcp.<domain>    ->    <host>.<domain>:5269
 _xmpp-client._tcp.<domain>    ->    <host>.<domain>:5222

第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口,之所以有两个记录,是因为新的XMPP协议,对于SRV记录,已经取代了旧的Jabber标准。第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口。

在 Bind 里创建SRV记录

以下例子是在 BIND 服务器创建一组SRV记录:
 _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.
 _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.
 _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.

把 some_domain.com 替换成你的域名,把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 "."。

测试SRV记录
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:
dig @my.dns_server.com _jabber._tcp.some_domain.com any +short
 
从你的DNS SRV记录查询得到的结果应该如下:
10 0 5269 host.some_domain.com.

参考来源:http://wiki.xmpp.org/web/SRV_Records


说说DNS记录

1、什么是DNS解析记录

DNS是互联网中一项重要的基础服务,它将简单易记的域名转换成可由计算机识别的IP地址,以便客户端对服务器的正常访问。而由DNS构建起的域名与IP地址之间的对应关系,称之为“DNS记录”(record)。通过设置不同的解析记录,可以实现对主机名不同的解析效果,从而满足不同场景下的域名解析需求。

2、DNS解析哪些最常见的DNS记录类型

A记录 :用来指定主机名(或域名)对应的IP地址记录。

CNAME记录:当需要将域名指向另一个域名,再由另一个域名提供 IP 地址,就需要添加 CNAME 记录。

MX记录:记录是邮件交换记录,主要用于邮箱解析,在邮件系统发送邮件时根据收信人的地址后缀进行邮件服务器的定位。

TXT记录:允许管理员在记录中存储文本注释。

NS记录:域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析。

SRV记录 :指定特定服务的端口,即上文所述的。

3、几种不常见的DNS记录类型

AFSDB记录:此记录用于由Carnegie Melon开发的Andrew File System(AFS)的客户端。AFSDB记录用于查找其他AFS单元。

APL记录:“地址前缀列表”是一个实验记录,用于指定地址范围列表。

CAA记录:这是“证书颁发机构授权”记录,它允许域所有者声明哪个证书颁发机构可以为该域颁发证书。如果不存在CAA记录,则任何人都可以为域颁发证书。这些记录也由子域继承。

DNSKEY记录:“DNS密钥记录”包含用于验证域名系统安全扩展(DNSSEC)签名的公钥。

CDNSKEY记录:这是DNSKEY记录的子副本,旨在转移到父级。

CERT记录:“证书记录”存储公钥证书。

DCHID记录:“DHCP标识符”存储动态主机配置协议(DHCP)的信息,DHCP是IP网络上使用的标准化网络协议。

DNAME记录:“委托名称”记录创建域别名,就像CNAME一样,但此别名也将重定向所有子域。例如,如果'example.com'的所有者购买了域名'website.net'并给了它一个指向'example.com'的DNAME记录,那么该指针也将扩展到'blog.website.net'和任何其他子域名。

HIP记录:此记录使用“主机标识协议”,一种分隔IP地址角色的方法; 此记录最常用于移动计算。

IPSECKEY记录:“IPSEC密钥”记录与Internet协议安全性(IPSEC)一起使用,这是一种端到端安全协议框架,是Internet协议套件(TCP/IP)的一部分。

LOC记录:“位置”记录包含经度和纬度坐标形式的域的地理信息。

NAPTR记录:““name authority pointer”“域名权限指针”记录可以与SRV记录组合,以基于正则表达式动态创建指向的URI。

NSEC记录:“next secure record”“下一个安全记录”是DNSSEC的一部分,它用于证明所请求的DNS资源记录不存在。

RRSIG记录:“resource record signature”“资源记录签名”是用于存储用于根据DNSSEC验证记录的数字签名的记录。

RP记录:这是“responsible person”“负责人”记录,它存储负责该域的人员的电子邮件地址。

SSHFP记录:此记录存储“SSH公钥指纹”, SSH代表Secure Shell,它是一种加密网络协议,用于通过不安全的网络进行安全通信。



该文章最后由 阿炯 于 2021-11-30 20:46:18 更新,目前是第 2 版。