最近要做做系统测试,负载肯定比功能测试的要高,而且功能测试中的DNS查询一般都是本地查询,不需要额外的DNS服务器。
看网上用脚本写了DNS 模拟器,不太好用,当负载稍高些,这个模拟器就会挂掉,而且经常出现各种奇怪的问题。
所以就想能不能有一个稳定的,好用的DNS模拟器。研究发现LINUX系统里BIND架设的DNS就可以满足我的要求。
但是我的测试环境比较特殊,是对IMS网络中SIP消息涉及的DNS过程。
IMS URI主要有两种:TEL URI 和 SIP URI, 其中TEL URI不能再IMS里面路由,都需要转化成SIP URI. DNS的NAPTR查询会主动将TEL URI转换成SIP URI。
TEL URI, TEL就是telephone的缩写,就跟平时看见的一串数字的电话号码类似,分为国际号码和国内号码。国际号码前加国家码,国内号码在漫游时加地区码。
- 国际号码的格式 tel:+862512345000。 +86表示中国的国家码
- 国内号码的格式 tel:12345000;phone-context=+021。 phone-context=+021,表示上海的地区码
如果域名是tel格式,NAPTR查询会先将TEL URI转换成SIP URI,然后对获得的域名进行NAPTR查询,返回目标网元的新域名。
假设TEL号码为+86-021-12340000
TEL URI转换成SIP URI的过程如下:
- 将TEL URI号码变成包含国家码或地区码的全码 +86-021-12340000
- 去除首部的“+"和所有其他的非数字字符 8602112340000
- 在数字字符之间加上"." 8.6.0.2.1.1.2.3.4.0.0.0.0
- 将数字字符顺序翻转 0.0.0.0.4.3.2.1.1.2.0.6.8
- 在翻转后的字符串后面加后缀"e164.arpa" 0.0.0.0.4.3.2.1.1.2.0.6.8.e164.arpa
如sip:smith@zte.com.cn
sip:+862512345000@zte.com.cn
sip: +86251234500@10.10.10.10:6000;user=phone
SIP消息涉及到的DNS过程主要包括两个方面:
- 如何发送请求消息,发送方需要通过DNS过程得到传输层协议类型(TCP, UDP, SCTP),下一跳的IP和Port
- 如何返回相应消息,需要决定上一跳的IP和Port。
实例:
如果向下一跳发送请求消息是sip:example.com或者是tel:+86-021-12340000
- 对sip号码example.com进行NAPTR查询,获得传输层协议类型和获取目标网元的地址信息。对tel号码要先转换成0.0.0.0.4.3.2.1.1.2.0.6.8.e164.arpa,在进行NAPTR查询。
- 对目标网元进行SRV查询,获得端口和目标网元的域名
- 对目标网元的域名进行A或AAAA查询,得到目标网元的IP地址
具体分析过程如下:
1. 对域名example.com进行NAPTR查询,返回多条记录,查询结果为:
order pref flags service regexp replacement
IN NAPTR 50 50 "s" "SIPS+D2T" "" _sips._tcp.example.com.
IN NAPTR 90 50 "s" "SIP+D2T" "" _sip._tcp.example.com.
IN NAPTR 100 50 "s" "SIP+D2U" "" _sip._ucp.example.com.
IN NAPTR 100 10 "u" "SIP+E2U" "!^.*$!sip:info@tele2.se!" .
IN NAPTR 102 10 "u" "mailto+E2U" "!^.*$!mailto:info@tele2.se!"
*.e164.arpa. NAPTR 10 100 "u" "SIP+E2U" "!^.*$!sip:info@sipp.com!"
根据order和pref的数值,选择第一条记录,flags为s表示下一步进行SRV查询,service表示TCP作为传输层协议,用sips方式传输消息,replacement表示使用_sips._tcp.example.com.进行进一步的获取目标网元的地址信息。
flags为"u"表示regexp给出了替代规则,根据该规则和原来的域名得到新域名,service中的E2U表示从e.164(tel num)转换成SIP URI服务。
2.对NAPTR产生的新域名进行SRV查询,返回多条记录,查询结果为:
priority weight port target
IN SRV 0 1 5060 server1.example.com
IN SRV 0 2 5060 server2.example.com
_sip._udp.sipp.com IN SRV 0 0 590 sipp.com.
根据priority和weight选择第一条记录,port表示使用5060,target表示目标网元的域名为server1.example.com
3.对SRV产生的新域名进行A或AAAA查询,得到目标网元的IP地址
IN A 10.170.9.123
sipp.com IN A 192.30.0.120
到这里我们就得到了: 将请求消息sip:example.com或者tel:+86-021-12340000通过TCP方式传输,采用SIPS方式,发送的下一跳的IP:Port是 10.170.9.123:5060
如何发送响应消息,尤其是UAC发送完请求消息后发生故障无法接收响应消息?
主要是通过收到的上一跳的请求消息中的Top Via的IP, Port, Domain Name等来获得新的目标地址。
- 有IP:Port,直接发送到该IP:Port
- 有IP,无Port,使用NAPTR查询获得的传输协议的默认端口
- 有domain name和port,对domain name进行A或AAAA查询获得的IP列表,对获得IP和port发送消息
- 只有domain name,进行SRV查询获得Port,进行A或AAAA查询获得IP,向获得的IP和port发送响应消息
DNS服务器的原理及功能
- DNS的配置和管理
- DNS的应用
DNS查询有正向和反向查询,正向是将域名解析城IP地址。
DNS查询过程为:本地的/etc/hosts文件--->本地的DNS缓存---->本地局域网的DNS服务器----->迭代或递归查询公共DNS服务器。
/etc/hosts ------- 主机名查询静态表,主要用于在局域网内使用,将主机名解析到对应的ip
/etc/host.conf ------- 定义查询的先后顺序,是先host还是dns server
/etc/resolv.conf ------- 静态dns server
/etc/named.conf -------- 静态dns zone的定义
vim /etc/named.conf
options {
directory "/var/lib/named"; ### the name server's working directory
};
zone "." in { ###the root name servers
type hint;
file "root.hint";
};
zone "e164.arpa" in {
type master;
file "e164.arpa.zone";
};
zone "sipp.com" in {
type master;
file "sipp.com.zone";
};
vim /var/lib/named/e164.arpa.zone
$TTL 1W
@ IN SOA @ root (42 2D 4H 6W 1W)
IN NS .
*.9.9.9.e164.arpa. NAPTR 10 100 'u' "SIP+E2U" "!^.*$!sip:info@sipp.com!" .
vim /var/lib/named/sipp.com.zone
@TTL 1W
@ IN SOA @ root (42 2D 4H 6W 1W)
IN NS .
sipp.com IN A 172.30.0.120
_sip._udp.sipp.com IN SRV 0 0 5990 sipp.com.