你有登入百度被封鎖的情況嗎?
你有登入後沒有辦法同步的情況嗎?
你有使用凱擘網路的情況嗎?
恭喜你,請改解析
180.97.107.95 openapi.baidu.com
你有登入百度被封鎖的情況嗎?
你有登入後沒有辦法同步的情況嗎?
你有使用凱擘網路的情況嗎?
恭喜你,請改解析
180.97.107.95 openapi.baidu.com
看了2天RFC,終於讓DNS支持edns-client-subnet協議,通過google dns resolver的請求,可以獲取用戶的ip地址。
國內很多CDN和DNS提供商都已經實現了,但網上的中文資料比較少,所以在這裡分享一下,能力有限,錯誤之處還請諒解。
- 國內用戶設置nameserver 8.8.8.8 (dig xxx.com @8.8.8.8)
- 我們得到的DNS query IP是74.125.16.208,判斷IP屬於美國,,,加利福尼亞州山景市谷歌公司
- 這個時候,我們的DNS會返回離美國加州最近的CDN節點IP給用戶。
- 國內用戶錯誤的調度到美國節點……
![]()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
./dig www.baidu.com @8.8.8.8 +client=104.119.200.200
; <<>> DiG 9.7.3 <<>> www.baidu.com @8.8.8.8 +client=104.119.200.200
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1068
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
; CLIENT-SUBNET: 104.119.200.200/32/0
;; QUESTION SECTION:
;www.baidu.com. IN A
;; ANSWER SECTION:
www.baidu.com. 1030 IN CNAME www.a.shifen.com.
www.a.shifen.com. 130 IN A 220.181.112.143
www.a.shifen.com. 130 IN A 220.181.111.148
;; Query time: 42 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Wed Jun 26 14:38:13 2013
;; MSG SIZE rcvd: 113
|
注意上面的OPT PSEUDOSECTION,已經可以發送和接收edns-client-subnet請求了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
/ /
/ NAME /
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| CLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TTL |
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| RDLENGTH |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
/ RDATA /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|
重點描述edns-client-subnet的結構
1
2
3
4
5
6
7
8
|
Field Name Field Type Description
------------------------------------------------------
NAME domain name empty (root domain)
TYPE u_int16_t OPT
CLASS u_int16_t sender's UDP payload size
TTL u_int32_t extended RCODE and flags
RDLEN u_int16_t describes RDATA
RDATA octet stream {attribute,value} pairs
|
1
2
3
4
5
6
7
8
9
|
(A, NS, MD, MF, CNAME, SOA, MB, MG, MR, NULL, WKS, PTR, HINFO, MINFO, MX, TXT,
RP, AFSDB) = range(1, 19)
AAAA = 28
SRV = 33
NAPTR = 35
A6 = 38
DNAME = 39
SPF = 99
OPT = 41
|
1
2
3
4
5
6
7
8
9
10
11
12
|
+0 (MSB) +1 (LSB)
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
0: | OPTION-CODE |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
2: | OPTION-LENGTH |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
4: | FAMILY |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
6: | SOURCE NETMASK | SCOPE NETMASK |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
7: | ADDRESS... /
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|
註:讀取到的地址長度為4,可以用socket.inet_ntoa變成ip地址,如果不夠4個字節,需要後面補\x00如果支持source netmask,將請求中的source netmask複製到scope netmask中,OpenDNS要求必須支持scope netmask)
