2018年11月02日 更新,切換到 DoT 一天后,所有 stubby 內置服務器運行異常緩慢,直到日常使用都難……只好放棄。
2018年11月01日 更新,使用了 5 天 DoH 後,由於目前提供此服務的服務器只有 1.1.1.1,這個地址在我這裡被運營商屏蔽了。
1 2 3 4 5 6 |
PING 1.1.1.1 (1.1.1.1): 56 data bytes Request timeout for icmp_seq 0 Request timeout for icmp_seq 1 ^C --- 1.1.1.1 ping statistics --- 3 packets transmitted, 0 packets received, 100.0% packet loss |
三年前,我寫了一篇文章《在 OS X 上 避免 DNS 洩露》來談如何保護你的隱私,並避免 DNS 洩露,那時候主要用的技術是 dnscrypt——實際上後來我就放棄了這個方案,原因是公共服務器受干擾嚴重,配置複雜延遲高。現在三年過去了,我們來看看最新的 點 和 衛生部,實際上就是 DNS通過TLS 和 DNS通過HTTPS
那些 DNS 加密方案
實際上我們早就已經談過,DNS 是明文傳輸所有內容的,設計之初就沒考慮安全這回事,甚至是搶答的,你問 A www.logcg.com 是哪個 IP 地址,A 還沒來得及回复, B 搶答說 127.0.0.1 !於是,你就信了。
這也是如今 gfw 牆網站的常用手段,也是 DNS 污染的原理。總之,dnscrypt 出現了,但它使用了一個自定的協議,並配置需要互相交換密鑰,這導致了很多麻煩。如今,又有了兩個全新的 DNS 加密(顯然也就反污染了),這次我們就來談談,他倆到底哪裡不同。
DNS通過TLS
TLS 加密實際上就是我們上網的 HTTPS 所用加密了,安全性得到了很好的保障——這東西如果失效了,那整個互聯網估計也就完蛋了。
DoT 使用 853 端口,使用 TCP 進行傳輸——基本上可以理解為加密版本的普通 DNS 了。
現如今,DoT 已經有了相當成熟的客戶端,使用 釀造 安裝 短而粗硬的 即可安裝,再使用 須藤 釀造 服務 開始 短而粗硬的 就能啟動了,stubby 推薦使用默認配置,已經集成了多個可信的 DoT 服務器。我這邊測試查詢速度為最慢 1 秒……是的,你還是需要一個前置的 DNS 緩存服務,比如 dnsmasq,這裡我就直接用 Surge 充當了。
一些未來的疑惑
DoT 看起來很美妙,幾乎是完成了我們對加密 DNS 的一切幻想,但有一點還是應當注意,在中國這樣的國家,DoT 一旦流行起來,那麼它對然不能再被污染,但卻很容易被封禁——因為它有一個固定的獨立端口,雖然別人不知道你在訪問什麼網站了,但卻能夠知道你在用 DoT ,乾脆直接干擾你 TCP 包不就行了?
(當然,DoT 也是可以專門佔用 443 端口就是了)
DNS通過HTTPS
總之,混淆才是王道,雖然這樣會讓網管很頭疼,但在嚴重審查的地區,還是值得一試的。儘管現在人們對於 DoH 的態度還頗有爭議,但還是有很多互聯網機構支持了它——直接使用 HTTP / 2 或者 HTTPS 協議進行請求,這下你就很難專門把 DNS 流量單獨分離出來進行干擾了。
尤其對於自建 DNS 服務器來說,甚至可以直接隱藏在網站之後!
要使用 DoH,使用 釀造 安裝 CloudFlare的/CloudFlare的/cloudflared 即可安裝,運行命令 須藤 cloudflared 代理-DNS 來臨時啟動它進行測試,你可以看到它使用了兩個上游服務器:
1 2 |
INFO[0000] Adding DNS upstream url="https://1.1.1.1/dns-query" INFO[0000] Adding DNS upstream url="https://1.0.0.1/dns-query" |
待服務啟動後就可以嘗試查詢,第一次測試的時候我遇到了大量明顯的報錯:
1 2 3 |
ERRO[0051] failed to connect to an HTTPS backend "https://1.1.1.1/dns-query" error="failed to perform an HTTPS request: Post https://1.1.1.1/dns-query: net/http: request canceled (Client.Timeout exceeded while awaiting headers)" ERRO[0051] failed to connect to an HTTPS backend "https://1.1.1.1/dns-query" error="failed to perform an HTTPS request: Post https://1.1.1.1/dns-query: net/http: request canceled (Client.Timeout exceeded while awaiting headers)" ERRO[0090] failed to connect to an HTTPS backend "https://1.1.1.1/dns-query" error="failed to perform an HTTPS request: Post https://1.1.1.1/dns-query: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)" |
但結果還是正常返回了,第一次查詢時間穩定在 300ms 以內,服務本身自帶了緩存功能,第二次查詢之類的自然就是 0ms 了。
測試成功後,需要給 cloudflared 進行配置,這樣它才能以服務的形式自動啟動:
1 2 3 4 5 6 7 |
mkdir -p /usr/local/etc/cloudflared cat << EOF > /usr/local/etc/cloudflared/config.yml proxy-dns: true proxy-dns-upstream: - https://1.1.1.1/dns-query - https://1.0.0.1/dns-query EOF |
你可以看到,在 /USR/本地/等等/cloudflared/配置.陽明海運 文件中我們給了這兩個默認的上游服務器,你也可以在這裡添加更多。
總之,在創建好配置文件之後,我們再來執行命令將服務安裝到系統當中:
1 2 3 4 |
sudo cloudflared service install INFO[0000] Applied configuration from /usr/local/etc/cloudflared/config.yml INFO[0000] Installing Argo Tunnel as an user launch agent INFO[0000] Outputs are logged in /tmp/com.cloudflare.cloudflared.out.log and /tmp/com.cloudflare.cloudflared.err.log |
現在,你就可以按 ctrl + c 停掉剛剛測試用的臨時服務了,然後用命令啟動系統服務: 須藤 launchctl 開始 同.CloudFlare的.cloudflared
系統配置
現在,不論是 DoT 還是 DoH,我們都已經啟動了(注意,這兩者你只能同時啟動一個,因為 dns 都會佔用本地的 53 端口)你只需要配置系統的 dns 解析到 127.0.0.1 即可。
額外的內容
如果你和我一樣在使用 Surge,那麼你可能會發現在開啟了 Enhance Mode 之後似乎出現了 DNS 環路的問題,導致查詢結果為空……似乎是 DNS 服務和 Surge 互相搶答了。這裡我們要配置 Surge 不使用自定義 DNS,轉而使用系統設置中的 DNS:
結論
就目前來看,在中國使用 DoT 要相對穩定,但速度慢一點,使用 DoH 速度快些但乾擾嚴重——這也可能和 DoH 公共服務器還不是很多有關(畢竟很容易就給你幹掉 IP 了),總之,這兩種手段都是自建服務器絕佳的選擇,簡單、快捷,還很輕鬆。
行文倉促,我目前已經在使用 argo tunnel ,也就是 cloudflared 了,自帶 DNS 緩存,及時不使用前置 DNS 緩存也能很好的運行,過段時間我會來重新編輯這篇文章並附上效果體驗。(希望不會因為頻繁訪問 1.1.1.1 而被禁掉)
參考文獻:
- HTTPS://github.com/getdnsapi/stubby
- HTTPS://developers.cloudflare.com/argo-tunnel/reference/service/
本文由 落格博客 原創撰寫:落格博客 » DoT DoH 除了 DNSCrypt,你還可以了解一下更好的 DNS 加密方案
轉載請保留出處和原文鏈接:https://www.logcg.com/archives/3127.html
請問博主自建的dot在安卓手機私人DNS裡填入域名能直接使用嗎?我自建的Adguard_Home,dot端口853,手機顯示無法連接。
試試 telnet 到對應端口能不能行,很有可能是端口被干擾了。 或者是Android 默認端口和這個不匹配?實際需要是 doh, 443?
DNSCrypt、DoH和DoT可以獨立搭建使用嗎?
還是DNSCrypt必須要和DoH和DoT搭配使用,謝謝
dns 這種東西,鍊式請求沒毛病,你都套一層也ok,不過那樣意義不大,這三種都是dns的加密解決方案,你只要使用其中一種就足夠了,三種套在一起用,也ok,不過就是加密冗餘罷了,同一個請求,要請求三次,加密三次,你說慢不慢。
博主的文章乾貨很多啊
我這邊測試4個1被封鎖,所以使用1.0.0.1貌似還可以使用
確實是的,1.0.0.1 勉強可用。
效率真的高🤣,Surge 有緩存 DNS 麼
根據我的使用經驗來看,是有DNS緩存的。
那為什麼不是瀏覽器或者係統的呢🤔️,ps 我郵件無法收到你的回复消息
系統或者瀏覽器都有DNS緩存,只是緩存的時間上比較短罷了。
你使用一個國際郵箱就能正確收到郵件了。(大概
我的發信服務其實就是 foxmail aka qq