iOS 端 DNS 相關技術

weixin_34293059發表於2017-09-07

iOS 端 DNS 相關技術

1.Mac下 關於 DNS 外掛包

在 Mac OS X 上通過 pdnsd 和 dnsmasq 加速 DNS 以及避免汙染

Note

在預設情況下,dnsmasq在解析一個域名時,會首先查詢/etc/hosts檔案中的定義,如果找不到的話,再去/etc/resolv.conf中去找。

2.程式實現 DNS 解析 ip
2.1 通過第三方介面地址 http://119.29.29.29/d?dn= 來獲取

比如解析 www.163.com&ttl=1
返回結果:111.206.186.244;111.206.186.245,23
其中23是ttl快取時間 也有可能不存在

具體程式碼可以看AppDNSParser類

2.2 通過iOS系統提供的CFHostRef 方式來獲取

//通過系統CFHostRef方式獲取 新增libresolv

  • (NSString *)fetchIPFromHost:(NSString *)host;

具體程式碼可以看AppDNSMapper.h類

2.3 通過 gethostbyname(hostName);

其中有一個注意點:iOS需要支援ipv6,需要呼叫 phost = gethostbyname2(hostName, AF_INET6);

具體程式碼可以看AppDNSMapper.h類

2.4 自己伺服器返回

在替換host時,有一個注意點

HTTP 標準中規定,伺服器會將請求頭中的 host 欄位的值作為請求的域名。我們們使用 IP 替換 URL 中的 host 進行訪問,此時網路庫會將 IP 當作 host,伺服器就會解析異常了.

解決方案: request 新增header <host,originHost>

4.如何獲取ip 時間,多個ip如何選擇

思路: 客戶端 採用ping的方式,在github上找了一個第三方

具體程式碼可以看IpManage類

程式碼不夠完善Demo地址--https://github.com/softwarefaith/JiOSDNS

參考文章

  1. https://program-think.blogspot.com/2014/01/dns.html
  2. 在 Mac OS X 上通過 pdnsd 和 dnsmasq 加速 DNS 以及避免汙染
  3. http://xintq.net/2017/05/16/mac-dnsmasq/
  4. https://elliotsomething.github.io/2016/10/18/DNS快取/
  5. DNS解析失敗的處理 (支援IPv6)http://nszzy.me/2016/09/07/dns-resolving/
  6. DNS 劫持
  7. https://github.com/music4kid/PPDNSMapping

相關文章