用了一段時間的 DNSCrypt,在前幾個月 DNSCrypt Proxy 的專案開發維護者-Frank Denis,忽然(其實也不是忽然,他在 Twitter 上也有事先貼文,只是沒有比專案直接不見鬧得大 😂)把 Github 專案移除後,在 Reddit 上也有需多討論,這中間經過有公司願意接手,但是過了幾天後,Frank Denis 開了新的 dnscrypt-proxy 專案,也就是第二版。
在這些日子,越來越多公司/組織也提供 DNS 加密的服務協定,從之前支持 DNSCrypt 專案的 OpenDNS 及 OpenNIC 專案中志願者提供的 DNSCrypt 服務外,還有 Google Public DNS 蠻早也支援 DNS-Over-HTTPS,到去年(2017 年)11 月 IBM 推出的 Quad9 支援 DNS-Over-TLS、12 月 Tenta 發表 Tenta DNS 支援 DNS-Over-TLS,也將 DNS 伺服器專案的程式碼開源,到了今年(2018 年),Cloudflare 也在 04/01 發布他們也提供 DNS 服務,並支援 DNS-Over-HTTPS 與 DNS-Over-TLS 兩個協定。
為什麼 DNS 需要加密?
從上面了解到,越來越多公司/組織提供的 DNS 服務,也會提供將 DNS 連線加密。原本的 DNS 查詢請求是透過 UDP 協定,這些請求(詢問網域名稱對應到那些 IP 位址)與回應(DNS 伺服器回應的結果)都是明文,也就是在傳輸過程中,都可能在某些的節點被看到並紀錄,舉例來說,瀏覽器上瀏覽 https://fmbase.tw/blog 前,會先要取得 fmbase.tw 域名的 IP 位址,因為,網路上的連線方式都是透過 IP 位址,這時候就需要向 DNS 伺服器詢問此域名的 IP 位址,得到結果後,瀏覽器才能連線到網頁伺服器、取得網頁資源,當 DNS 連線沒有被加密時,在傳輸過程中,可能會擷取、紀錄,能知道你瀏覽、使用過哪些服務,所以有些人會認為使用 DNS 加密能加強個人在網路上的隱私。
凡事都有不過,有人認為就算把 DNS 連線加密了,網路服務供應商(ISP)還是能知道你連線到哪些網站,因為,當透過 IP 位址連線後,ISP 還是可能透過 DNS 來反解析 IP 位址來得知,只是,利用 IP 來反解析的話,也不是每個都一定能取得精確的資訊。另外一點則是,DNS 服務供應商還是可以紀錄你,所以請謹慎選擇你覺得信任的 DNS 伺服器,在網路上能看看別人的看法。
使用 DNS 加密
目前常見的 DNS 加密協定有 “DNS-Over-HTTPS”, “DNS-Over-TLS” 與 “DNSCrypt”,其中前兩者目前(2018 年 10 月)是 IETF 支持的標準,DNSCrypt 則不是。所以,如果以協定的趨勢來看,DNS-Over-HTTPS 與 DNS-Over-TLS 會是未來會被支持的協定,
DNSCrypt 相較於 DNS-Over-HTTPS、DNS-Over-TLS,是較早提出的協定,原作者 Frank Denis,在 Reddit 上回覆 DNSCrypt 功能設計的原有,裡頭有提到 DNSCrypt 一開始的目的不是來保護隱私,而是 DNS 查詢的完整性,也就是避免 DNS 查詢結果的傳輸過程中,遭到中間人的竄改,DNSSEC 被廣泛採用後,也能提供檢查查詢結果完整性,後來加入了加密功能,是因為作者曾經為一家公司做大規模的 DNS 紀錄。
DNS-Over-HTTPS (aka. DOH)、DNS-Over-TLS 兩者顧名思義,分別是以 HTTPS、TLS 協定來傳輸 DNS 查詢的請求與回應,像 DNS-Over-HTTPS 就能以 HTTP GET 等方法來查詢、伺服器則以 JSON 格式來回應查詢結果。
目前自己是有使用 jedisct1 開發並開源的 dnscrypt-proxy 2,支援了 DNSCrypt v2 與 DNS-Over-HTTPS。
macOS 上安裝、設定 dnscrypt-proxy 2
以下會使用到指令操作,請先開啟 Terminal.app(終端機) 或 iTerm.app 等。
1. 下載 dnscrypt-proxy
在這裡選擇 dnscrypt-proxy-macos-*.tar.gz,來下載最新版的 dnscrypt-proxy,解壓縮後,放到 /Applications
或家目錄等位置。
指令:
$ mkdir /Users/USERNAME/dnscrypt-proxy $ cd /tmp/ $ wget https://github.com/jedisct1/dnscrypt-proxy/releases/download/x.x.x/dnscrypt-proxy-macos-x.x.x.tar.gz $ tar -xvf dnscrypt-proxy-macos-x.x.x.tar.gz $ cp macos/* /Users/USERNAME/dnscrypt-proxy $ cd /Users/USERNAME/dnscrypt-proxy
注意,請將 x.x.x 換成最新的 dnscrypt-proxy 版本
2. 設定 dnscrypt-proxy
在解壓縮後的資料夾內可以看到 example-dnscrypt-proxy.toml
的範本檔案,將這個檔案複製,並命名為 dnscrypt-proxy.toml
。
接下來可以設定要使用的伺服器,編輯 dnscrypt-proxy.toml
:
可以直接移除 # server_names = [‘scaleway-fr’, ‘google’, ‘yandex’, ‘cloudflare’] 這行(大約是第 30 行)的註解,設定為想要的 DNS 伺服器,例如只使用 Cloudflare 的 DNS 伺服器的話:
server_names = ['cloudflare']
更多可用的 DNS 伺服器:https://dnscrypt.info/public-servers/
啟用 dnscrypt-proxy,來確認設定是否正確:
$ sudo ./dnscrypt-proxy
3. 修改 macOS 的 DNS 設定
啟用 dnscrypt-proxy 可以視為在電腦上開啟了一個 DNS 伺服器,讓 macOS 透過 DNS 協定向 dnscrypt-proxy 送出查詢的請求後,dnscrypt-proxy 會以 DNSCrypt、DNS-Over-HTTPS (DOH) 協定,向網路上公有或私有 DNS 主機詢問,再回傳給 macOS,會這麼做是因為,macOS 目前(2018 年 10 月)尚未有 DNS-Over-HTTPS, DNS-Over-TLS 等協定,需要透過 dnscrypt-proxy 來達成。
透過 macOS 中的「網路」來設定使用的 DNS 伺服器為本機:
儲存設定後,就能來確認主機上的 DNS 查詢是不是有透過 dnscrypt-proxy:
$ cd /Users/USERNAME/dnscrypt-proxy $ sudo ./dnscrypt-proxy -resolve example.com
如果能成功看到查詢 example.com 域名,就是設定成功了!
4. 將 dnscrypt-proxy 安裝為系統的服務
先以 Ctrl + C
,將第 2 步驟中,啟動的 dnscrypt-proxy 中止,再將 dnscrypt-proxy 註冊成系統服務:
$ sudo ./dnscrypt-proxy -service install
啟動 dnscrypt-proxy 服務:
$ sudo ./dnscrypt-proxy -service start
設定完成後,之後開機 macOS,dnscrypt-proxy 也會隨著 macOS 啟動。
更多資訊
- 討論關於 DNS 加密對於隱私保障,在 Ars Technica 的 How to keep your ISP’s nose out of your browser history with encrypted DNS 文章:https://arstechnica.com/information-technology/2018/04/how-to-keep-your-isps-nose-out-of-your-browser-history-with-encrypted-dns
- jedisct1/dnscrypt-proxy 安裝、使用、設定等資訊:https://github.com/jedisct1/dnscrypt-proxy/wiki/Home
發佈留言