jenkins的active directory plugin之DNS查询
为什么在jenkins上Active Directory 插件那里的Domain Name只配置个 company.com 就行了呢?
DNS查询,通过udp通信查询到公司的所有的DC(domain controller)地址,然后进行AD域认证。
其实是通过一个查询获取到了具体的dns服务器的IP,返回的是好几个ip,
这个根据公司配置了几个DC(domain controller)服务器有关系的。
DNS报文格式,不论是请求报文,还是DNS服务器返回的应答报文,都使用统一的格式。
DNS format
+--+--+--+--+--+--+--+
| Header |
+--+--+--+--+--+--+--+
| Question |
+--+--+--+--+--+--+--+
| Answer |
+--+--+--+--+--+--+--+
| Authority |
+--+--+--+--+--+--+--+
| Additional |
+--+--+--+--+--+--+--+
下面是整理的一次查询发送报文
首先是头部区域
Header format
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ID |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR| opcode |AA|TC|RD|RA| Z | RCODE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QDCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ANCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| NSCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ARCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
0~1字节, 最前面的2个字节表示会话表示,也就是报文ID。ID: 2个字节(16bit),标识字段,
客户端会解析服务器返回的DNS应答报文,获取ID值与请求报文设置的ID值做比较,如果相同,则认为是同一个DNS会话。
0 = 0x8C 演示例子给个 35935 -> 1000 1100 0101 1111 = 0x8C5F -> 右移8位,得到高8位的 0x8C
1 = 0x5F 35935的低8位存放到这里。
2~3字节表示falg,标识。16位,2个字节表示。 QR(1bit),0为查询,1为响应。
opcode(4bit),通常值为0(标准查询),其他值为1(反向查询)和2(服务器状态请求),[3,15]保留值。
AA(1bit),表示授权回答。TC(1bit)表示可截断。RD(1bit)表示期望递归。RA(1bit)表示可用递归。
rcode(4bit)表示返回码,0表示没有错误,其他表示错误,[6,15] : 保留值,暂未使用。
2 = 0x01 0000 0001
3 = 0x00 0000 0000
4~11字节,8个字节数量字段
4 = 0x0 问题数
5 = 0x1
6 = 0x0 回答资源记录数
7 = 0x0
8 = 0x0 授权资源记录数
9 = 0x0
10 = 0x0 附加资源记录数
11 = 0x0
到此是header头部结束。
下面是Question区域了
Question format
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ... |
| QNAME |
| ... |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QTYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QCLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
qname这一段比较长,也就是存放的我们的域名地址了,格式是 len+data,最后是个0.
12 = 0x03 十进制3 后面放了3个byte, 字符串是 "_gc"
13 = 0x5F
14 = 0x67
15 = 0x63
16 = 0x04 十进制4 后面放了4个byte, 字符串是”_tcp"
17 = 0x5F
18 = 0x74
19 = 0x63
20 = 0x70
21 = 0x0A 十进制10 后面10个byte,字符串 “company"
22 = 0x62
23 = 0x6C
24 = 0x61
25 = 0x63
26 = 0x6B
27 = 0x73
28 = 0x68
29 = 0x61
30 = 0x72
31 = 0x6B
32 = 0x03 十进制3 后面放了3个byte,后面3个byte,存放的是 字符串 “com”
33 = 0x63 字母 c
34 = 0x6F 字母 o
35 = 0x6D 字母 m
36 = 0x00 十进制 0, qname最后放的0
37 = 0x00
38 = 0x2