最近牆越來越高了,隨著法西斯節和月餅的關係,不少梯子也被拆了。甚至幾個梯子開發者也被?,所以說,除了“如何科學上網”這個問題之外,“如何安全上網”這個問題也變得越來越不可讓人忽略。
不僅僅是為了你我都懂的用途,就是一般的使用電腦上網,我覺得這個問題也應當得到重視。你在網絡上面的一言一行都被你的服務商、ISP事無鉅細地記錄著……這原本是好的目的——一旦歹徒在通過網絡行凶,我們就能夠快速將其抓獲——不過,一旦這些信息落入了壞人之手,那將不堪設想。
一般我們會想,那些瀏覽記錄什麼的有什麼重要的呢?只要我的賬號密碼安全就好了啊!事實上,正是這些信息,給了黑客可乘之機。你的這些材料,都將成為社會工程學的攻擊素材。
那麼DNS洩露又是什麼呢?
使用瀏覽器上網,你輸入的域名就要依靠DNS來翻譯成IP地址——電腦可不懂什麼是域名。所以,也許你訪問的內容經過了https加密,但ISP一樣可以記錄你究竟訪問了那些網站!
就算你使用了VPN等代理來訪問網絡,你的DNS仍然有可能是本地解析的,這將導致你的隱匿行踪變得毫無意義! ——這就是個人隱私的頭號威脅:DNS洩露。
目前來講,當你使用VPN的時候,DNS應該是遠程解析的,但有些提供商並不支持它;另外如果你使用襪子代理,那麼只有 5 才支持遠程DNS解析
另外
你如果使用了pac,那你需要一份按照域名來選擇代理的 pac 而不是IP。——因為它還是會先解析出IP再判斷是否需要代理。
否則,你就可能洩露了DNS:
DNS透明轉發
這時候就有人提出,如果使用VPN,為了避免DNS污染(其實也是洩露的一種),要使用第三方的公共DNS服務,比如穀歌的 8.8.8.8 ,但如果你的DNS洩露了,即使使用了公共DNS也無濟於事:
你以為你訪問到了第三方的公共DNS上,其實你還是訪問了ISP的DNS服務器上。
關於DNS洩露的更多內容訪問:https://dnsleaktest.com/what-is-a-dns-leak.html
要測試DNS洩露,訪問:https://dnsleaktest.com
使用 dnscrypt 和 dnsmasq
dnscrypt 是 Open DNS 的一個項目,它允許你加密地訪問DNS服務器,並解析域名。就好像使用https訪問網站一樣。而 的dnsmasq 則是一個輕量級的DNS服務器,我們本地架設它來緩存DNS解析回复,這樣就不用在同一時間裡重複解析同一域名多次了——畢竟加密DNS解析不比明文解析快的。
注意
其實大多數 Linux 系統當中 dnsmasq 都是默認自帶的——它並不臃腫,也不會耗費多少資源。
準備
為了安裝 dnscrypt 和 dnsmasq ,你需要安裝 Xcode ——我們需要用到Xcode 附帶的一些命令行工具。
在安裝了Xcode之後,使用命令來安裝Homebrew:
1 |
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" |
它是個類似 apt-get的 或者 百勝 的包管理器,安裝它之後,你或許需要如下設置:
安裝 dnsmasq
使用 釀造 安裝 的dnsmasq 來安裝它。
我們編輯它的配置:
1 2 3 |
mkdir -p /usr/local/etc cp /usr/local/opt/dnsmasq/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf vim /usr/local/etc/dnsmasq.conf |
比如說如下配置:
1 2 3 4 5 6 7 8 |
# Never forward plain names domain-needed # Never forward addresses in the non-routed address spaces bogus-priv # Forward queries to dnscrypt on localhost server=127.0.0.1#5355 |
再寫入一條額外的配置: 迴聲 "CONF-DIR =在/ usr / local / etc中/ dnsmasq.d" >> /USR/本地/等等/的dnsmasq.CONF 來讓配置目錄生效以放入更多規則:
1 2 3 4 5 6 7 |
mkdir /usr/local/etc/dnsmasq.d //创建配置目录 wget -4 --no-check-certificate -O /usr/local/etc/dnsmasq.d/accelerated-domains.china.conf https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf //为国内常用网站取消DNS加密 |
對於國內比如淘寶京東這類網站,我想你不會去代理,那麼也就沒必要加密處理了,由於國內多用了cdn加速,我們有國外DNS解析的話會導致走到國外線路上,速度很慢。如果你需要加密,就跳過這一步即可?。
設置啟動:
1 2 3 |
sudo cp -fv /usr/local/opt/dnsmasq/*.plist /Library/LaunchDaemons sudo chown root /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist |
使用 須藤 lsof的 -妮 UDP:53 或者 PS -如果 | grep的 “[ð]nsmasq“ 來驗證dnsmasq已經啟動。
dnsmasq 雖然被用作了DNS緩存,它一般也會用在微型服務器上比如OpenWRT上作為DHCP服務器。事實上它在這方面用的更多。不過不用擔心,我們安裝的dnsmasq默認不開啟DHCP功能。
安裝 dnscrypt
使用 釀造 安裝 dnscrypt-代理 來安裝dnscrypt。
設置啟動:
1 2 |
sudo cp -fv /usr/local/opt/dnscrypt-proxy/*.plist /Library/LaunchDaemons sudo chown root /Library/LaunchDaemons/homebrew.mxcl.dnscrypt-proxy.plist |
編輯配置文件,把本地監聽地址改為 127.0.0.1:5355來配合dnsmasq:
1 |
sudo vi /Library/LaunchDaemons/homebrew.mxcl.dnscrypt-proxy.plist |
在 <串>/USR/本地/選擇/dnscrypt-代理/sbin目錄/dnscrypt-代理</串> 這行下面插入: <串>--本地-地址=127.0.0.1:5355</串> ,好避免和dnsmasq衝突並只允許dnsmasq訪問到它:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-/Apple/DTD PLIST 1.0/EN" "http:/www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>homebrew.mxcl.dnscrypt-proxy</string> <key>KeepAlive</key> <true/> <key>RunAtLoad</key> <true/> <key>ProgramArguments</key> <array> <string>/usr/local/opt/dnscrypt-proxy/sbin/dnscrypt-proxy</string> <string>--local-address=127.0.0.1:5355</string> <string>--ephemeral-keys</string> <string>--resolvers-list=/usr/local/Cellar/dnscrypt-proxy/1.6.0/share/dnscrypt-proxy/dnscrypt-resolvers.csv</string> <string>--resolver-name=dnscrypt.eu-dk</string> <string>--user=nobody</string> </array> <key>UserName</key> <string>root</string> <key>StandardErrorPath</key> //余下部分省略不写。 |
最後,使用 須藤 launchctl 加載 /Library。/LaunchDaemons/自製.mxcl.dnscrypt-代理.plist中 啟動服務。
使用 須藤 lsof的 -妮 UDP:5355 或者 PS -如果 | grep的 “[ð]nscrypt“ 來驗證服務已經生效。
dnscrypt 還有個對應的 dnscrypt-包裝,它兼容dnscrypt-proxy的加密——也就是說你可以用它來搭建自己的dnscrypt服務器而不必使用公用dnscrypt服務器。——這用來抵禦DNS污染~你可以參考頁尾“延伸閱讀”裡的鏈接來了解更多。
配置網絡
打開 偏好設置→網絡→高級→DNS選項卡 ,只填入 127.0.0.1 並保存即可。
驗證
使用dig來分別驗證二者是否正常工作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
╰─➤ dig www.twitter.com @127.0.0.1 -p 5355 ; <<>> DiG 9.8.3-P1 <<>> www.twitter.com @127.0.0.1 -p 5355 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12542 ;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 4, ADDITIONAL: 5 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.twitter.com. IN A ;; ANSWER SECTION: www.twitter.com. 490 IN CNAME twitter.com. twitter.com. 16 IN A 199.16.156.6 twitter.com. 16 IN A 199.16.156.102 twitter.com. 16 IN A 199.16.156.198 twitter.com. 16 IN A 199.16.156.230 ;; AUTHORITY SECTION: twitter.com. 112220 IN NS ns4.p34.dynect.net. twitter.com. 112220 IN NS ns2.p34.dynect.net. twitter.com. 112220 IN NS ns3.p34.dynect.net. twitter.com. 112220 IN NS ns1.p34.dynect.net. ;; ADDITIONAL SECTION: ns1.p34.dynect.net. 40536 IN A 208.78.70.34 ns2.p34.dynect.net. 40536 IN A 204.13.250.34 ns3.p34.dynect.net. 40536 IN A 208.78.71.34 ns4.p34.dynect.net. 40536 IN A 204.13.251.34 ;; Query time: 423 msec ;; SERVER: 127.0.0.1#5355(127.0.0.1) ;; WHEN: Wed Sep 2 21:10:55 2015 ;; MSG SIZE rcvd: 272 //你可能需要稍微等一会dnscrypt才能够建立连接。 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
─➤ dig www.google.com @127.0.0.1 ; <<>> DiG 9.8.3-P1 <<>> www.google.com @127.0.0.1 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6714 ;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 4, ADDITIONAL: 5 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.google.com. IN A ;; ANSWER SECTION: www.google.com. 297 IN A 173.194.112.116 www.google.com. 297 IN A 173.194.112.112 www.google.com. 297 IN A 173.194.112.113 www.google.com. 297 IN A 173.194.112.114 www.google.com. 297 IN A 173.194.112.115 ;; AUTHORITY SECTION: google.com. 112253 IN NS ns3.google.com. google.com. 112253 IN NS ns2.google.com. google.com. 112253 IN NS ns1.google.com. google.com. 112253 IN NS ns4.google.com. ;; ADDITIONAL SECTION: ns1.google.com. 300608 IN A 216.239.32.10 ns2.google.com. 300608 IN A 216.239.34.10 ns3.google.com. 300608 IN A 216.239.36.10 ns4.google.com. 300608 IN A 216.239.38.10 ;; Query time: 519 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Wed Sep 2 21:10:22 2015 ;; MSG SIZE rcvd: 259 //第一次查询略慢,因为要走dnscrypt。 ╰─➤ dig www.google.com @127.0.0.1 ; <<>> DiG 9.8.3-P1 <<>> www.google.com @127.0.0.1 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64399 ;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.google.com. IN A ;; ANSWER SECTION: www.google.com. 105 IN A 173.194.112.116 www.google.com. 105 IN A 173.194.112.115 www.google.com. 105 IN A 173.194.112.114 www.google.com. 105 IN A 173.194.112.113 www.google.com. 105 IN A 173.194.112.112 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Wed Sep 2 21:13:34 2015 ;; MSG SIZE rcvd: 112 //注意查询时间为0,以后的一段时间内,DNS就被缓存了:) |
延伸閱讀
編譯安裝 dnscrypt-wrapper 搭建防污染 DNS 服務器
本文由 落格博客 原創撰寫:落格博客 » 在 OS X 上 避免 DNS 洩露
轉載請保留出處和原文鏈接:https://www.logcg.com/archives/1311.html
偉大的提交, 信息非常豐富. 我想知道為什麼這個領域的其他專家不理解這一點. 你必須繼續你的寫作. 我很自信, 你已經擁有了龐大的讀者群!
現在有個stubby (DNS-過-TLS) https://github.com/getdnsapi/stubby 的工具很好用,配起來也簡單
確實不錯,回頭我看看寫個文章😏
現在有個 stubby https://github.com/getdnsapi/stubby 挺好用,配起來也方便
launchctl load 是否可以再開啟另外一個 dnscrypt 實例呢?
例如我想用兩個端口對應兩條線路
127.0.0.1:5301 — 思科
127.0.0.2:5302 — FVZ-REC-HK-ZTW-01
理論上可以,你需要再拷貝一份plist,然後把端口改掉,這樣應該能啟動兩個實例,我沒有試過,如果這樣不行,那應該就不行了,你自己試試看。
另外一種方法是用docker起服務,這樣的話起幾個都ok了。
或者用傳統linux方式寫腳本 :)
macOS最新系統中執行sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dnscrypt-proxy.plist啟動不生效,但是我可以通過shadowsocksx訪問google、Facebook的,這是什麼情況呢?執行dig http://www.google.com @ 127.0.0.1 -p 5355也是連接超時; 沒有服務器可以達成,但是可以訪問
找到原因了,mac不開啟1024以上的端口,換小於1024的端口就好了,感謝博主