2022-11-05 分類: 網(wǎng)站建設(shè)
你是否是一個(gè)使用國(guó)外 DNS 的中國(guó)網(wǎng)民?你是否發(fā)現(xiàn)使用國(guó)外 DNS 之后訪問(wèn)某些國(guó)內(nèi)網(wǎng)站奇慢無(wú)比?這不是 DNS 慢,而是電信到聯(lián)通的線路太慢。如果你愿意小小地折騰一下,那么跟隨本文,你可以解決這一問(wèn)題。
一、為什么要用國(guó)外 DNS
由于眾所周知的問(wèn)題,國(guó)內(nèi) DNS 服務(wù)器解析國(guó)外網(wǎng)站會(huì)遭到 DNS 污染和投毒,使之解析到完全虛構(gòu)的 IP 上,造成「開了 VPN 也沒法訪問(wèn) Twitter 或 Facebook」等問(wèn)題。以下是一個(gè)例子:
wzyboy@vermilion:~$ dig twitter.com @8.8.8.8 +short
199.59.148.82
199.59.149.230
199.59.148.10
wzyboy@vermilion:~$ dig twitter.com @221.228.255.1 +short
93.46.8.89
Twitter 正確的 IP 地址應(yīng)該是 199.59.148.0/24 里的那幾個(gè),但是如果用 221.228.255.1 這臺(tái)中國(guó)電信的 DNS 服務(wù)器查詢,查到的就是不知道什么鬼地址了,地理信息是在意大利,亂七八糟的。正是因?yàn)檫@樣的 DNS 解析不正確的情況出現(xiàn),不少人轉(zhuǎn)而使用了國(guó)外的 DNS 服務(wù)器,如老牌的 OpenDNS 以及這幾年新崛起的好記又好用的 Google Pulic DNS 即 8.8.8.8 和 8.8.4.4。使用它們進(jìn)行查詢,再配合以 VPN 或者瀏覽器的遠(yuǎn)程 DNS 解析,便可避免 DNS 污染的情況出現(xiàn),從而解析出正確的地址。
此外,拒絕使用電信的 DNS 服務(wù)器,還可以避免煩人的「114 上網(wǎng)導(dǎo)航」頁(yè)面……
二、為什么使用國(guó)外 DNS 會(huì)「慢」
我是在「慢」上加了引號(hào)的,因?yàn)檫@其實(shí)不是國(guó)外 DNS 慢,而是你要訪問(wèn)的網(wǎng)站的 CDN 分配錯(cuò)誤,慢。由于國(guó)內(nèi)各大運(yùn)營(yíng)商之間的主干線路帶寬太窄,所以導(dǎo)致「最遠(yuǎn)的距離是從電信到網(wǎng)聯(lián)通」,電信用戶訪問(wèn)聯(lián)通的服務(wù)器非常慢,聯(lián)通用戶訪問(wèn)電信的服務(wù)器也非常慢,相信這都是大家有體驗(yàn)的。因此,國(guó)內(nèi)不少網(wǎng)站都用了雙線 CDN,在電信的機(jī)房里放點(diǎn)服務(wù)器,再在聯(lián)通的機(jī)房里放點(diǎn)服務(wù)器。運(yùn)用智能 DNS 技術(shù),當(dāng)你訪問(wèn)網(wǎng)站的時(shí)候,DNS 根據(jù)你的來(lái)源 IP 判斷你是電信用戶還是聯(lián)通用戶,然后再返回相應(yīng)的 IP 地址,這樣你會(huì)訪問(wèn)到就近的、同運(yùn)營(yíng)商的服務(wù)器,訪問(wèn)速度就大大提升了。而如果使用國(guó)外的 DNS 的話,你的查詢來(lái)源來(lái)自國(guó)外,國(guó)內(nèi)網(wǎng)站的 DNS 無(wú)法判斷你是電信用戶還是聯(lián)通用戶,就胡亂分配你一個(gè)服務(wù)器。比如我是一個(gè)江蘇電信的用戶,但當(dāng)我訪問(wèn)淘寶網(wǎng)的時(shí)候,淘寶的 DNS 把我解析到青島聯(lián)通的服務(wù)器上,奇慢無(wú)比。所以:
很多人認(rèn)為 Google Public DNS, OpenDNS 等「慢」,主要不是查詢慢,而是電信到聯(lián)通之間太慢。
當(dāng)然了,如果硬要比較查詢的話,倒也是會(huì)慢很少一點(diǎn)的:
;; 使用 8.8.8.8 解析 www.google.com 耗時(shí) 79 毫秒
;; Query time: 79 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Thu Sep 6 17:20:37 2012
;; MSG SIZE rcvd: 143
;; 使用中國(guó)電信 221.228.255.1 服務(wù)器解析 www.google.com 耗時(shí) 6 毫秒
;; Query time: 6 msec
;; SERVER: 221.228.255.1#53(221.228.255.1)
;; WHEN: Thu Sep 6 17:20:44 2012
;; MSG SIZE rcvd: 284
別看 6 毫秒和 79 毫秒差別很大的樣子,但是人類是很難感覺出來(lái)的,而且,這只是查詢時(shí)間,與實(shí)際的訪問(wèn)速度無(wú)關(guān),就算你一整天都在刷 www.google.com,也就每小時(shí)慢個(gè)幾百毫秒的樣子,根本感覺不出來(lái)。真正慢的原因,還是上文所說(shuō)的「電信到聯(lián)通」的問(wèn)題。
三、問(wèn)題的解決思路
現(xiàn)在問(wèn)題明確了:使用國(guó)外 DNS 之后,查詢來(lái)源變成國(guó)外的 IP,使用了 CDN 加速的國(guó)內(nèi)網(wǎng)站的 DNS 會(huì)無(wú)法判斷你的來(lái)源,胡亂給你分配一個(gè)地址,如果不是同一個(gè)運(yùn)營(yíng)商的,訪問(wèn)速度便會(huì)很慢。
那解決方案也就出現(xiàn)了:讓國(guó)內(nèi)網(wǎng)站的 DNS 服務(wù)器知曉你的來(lái)源,從而給你分配正確的服務(wù)器 IP。于是 Google 起草了一個(gè)專有協(xié)議,叫 EDNS,在 DNS 查詢請(qǐng)求中包含源地址,這樣淘寶就知道查詢來(lái)源不是 Google 服務(wù)器,而是電信的某用戶,就不會(huì)把你扔到聯(lián)通服務(wù)器上了 。聽起來(lái)很美好是吧?不過(guò)這個(gè)協(xié)議不開放,目前幾乎沒有人用,所以,問(wèn)題絲毫沒有解決。
新思路是:訪問(wèn)那些會(huì)因 CDN 加速解析錯(cuò)誤而極其緩慢國(guó)內(nèi)網(wǎng)站的時(shí)候,直接向國(guó)內(nèi)的服務(wù)器發(fā)送請(qǐng)求,讓 DNS 知曉你的來(lái)源,給你分配個(gè)正確的 IP。訪問(wèn)其他網(wǎng)站的時(shí)候,再通過(guò)國(guó)外的 DNS 查詢。
聽起來(lái)很簡(jiǎn)單的樣子,實(shí)現(xiàn)起來(lái)也不難:用 dnsmasq 在本地搭個(gè) DNS 緩存服務(wù)器,規(guī)定哪些域名用哪個(gè)服務(wù)器查就好了。
四、安裝及配置 dnsmasq
安裝 dnsmasq
dnsmasq 是一個(gè)非常輕量的 DNS 緩存及 DHCP 服務(wù)器,在我的 Arch Linux 上只占用了 368 KiB 的磁盤空間,相比功能極其強(qiáng)大的 BIND9 來(lái)說(shuō)小多了(BIND9 的安裝體積是 6.23 MiB)。不光是體積小,它的功能也很專一,配置起來(lái)也是十分方便的,五分鐘就可以搞定。
Ubuntu 12.04 及之后的版本應(yīng)該自帶了 dnsmasq。如果沒有,可以使用 sudo apt-get install dnsmasq 安裝。Arch Linux 直接 sudo pacman -S dnsmasq 即可。我的筆記本電腦需要給手機(jī) DHCP 及 IP 轉(zhuǎn)發(fā)用,因此早就安裝了 dnsmasq,但是直到今天才想起這么用它……
配置 dnsmasq
dnsmasq 的各參數(shù)可以通過(guò) man dnsmasq 查看,配置文件中也有許多清晰明了的注釋。默認(rèn)的配置文件位于 /etc/dnsmasq.conf,打開它,可以更改這幾個(gè)地方:
no-resolv
no-poll
server=8.8.8.8
server=8.8.4.4
server=/cn/114.114.114.114
server=/taobao.com/114.114.114.114
server=/taobaocdn.com/114.114.114.114
server=/tbcache.com/114.114.114.114
server=/tdimg.com/114.114.114.114
第一行的 no-resolv 和第二行的 no-pull 讓 dnsmasq 不要通過(guò) /etc/resolv.conf 確定上游服務(wù)器,也不要檢測(cè) /etc/resolv.conf 的變化(因?yàn)槲覀兙褪且帽緳C(jī)當(dāng)服務(wù)器嘛),接下來(lái)兩行指定 dnsmasq 默認(rèn)查詢的上游服務(wù)器,此處以 Google Public DNS 為例,喜歡用 OpenDNS 的也可以改 OpenDNS。接下來(lái)就是規(guī)定一張名單了,把一些國(guó)內(nèi)網(wǎng)站的域名寫在這里即可。比如 server=/cn/114.114.114.114 便是把所有 .cn 的域名全部通過(guò) 114.114.114.114 這臺(tái)國(guó)內(nèi) DNS 服務(wù)器來(lái)解析,你也可以改成其他的國(guó)內(nèi) DNS 比如你的運(yùn)營(yíng)商提供的 DNS。接下來(lái)四行是淘寶的幾個(gè)域名,讓它們也通過(guò)國(guó)內(nèi)的 DNS 服務(wù)器解析。
這樣分流操作之后,默認(rèn)所有域名都通過(guò) 8.8.8.8 和 8.8.4.4 解析,但是所有的 .cn 域名以及淘寶的域名通過(guò) 114.114.114.114 這臺(tái)國(guó)內(nèi) DNS 服務(wù)器解析。當(dāng)然,除了淘寶網(wǎng),你也可以添加更多的域名,根據(jù)自己的喜好,把經(jīng)常訪問(wèn),但是使用國(guó)外服務(wù)器解析到很慢的服務(wù)器上的網(wǎng)站域名都可以添加進(jìn)去,不過(guò):如果這個(gè)網(wǎng)站本身就只能一臺(tái)服務(wù)器,沒有 CDN 加速,那再怎么添加也是無(wú)濟(jì)于事的,得讓網(wǎng)站管理員去買雙線機(jī)房……另外,在寫這篇文章的時(shí)候,發(fā)現(xiàn) @felixonmars 維護(hù)了一張國(guó)內(nèi)常用的、但是通過(guò)國(guó)外 DNS 會(huì)解析錯(cuò)誤的網(wǎng)站域名的列表,據(jù)他所說(shuō),這是他在公司里部署這一套東西之后,公司里其他人報(bào)怨「慢」的網(wǎng)站域名收集來(lái)的,應(yīng)該囊括了絕大多數(shù)有此問(wèn)題的網(wǎng)站,值得依賴,歡迎選用。如果覺得直接把這么多域名加在 /etc/dnsmasq.conf 里不爽的話,可以在 dnsmasq.conf 里把 conf-dir=/etc/dnsmasq.d 這一行取消注釋,然后把在 /etc/dnsmasq.d 里弄點(diǎn)列表。比如我就是把 @felixonmars 維護(hù)的列表放在 /etc/dnsmasq.d/china.conf 里。
配置好之后,保存,Ubuntu 可用 sudo service dnsmasq restart,Arch Linux 可用 sudo rc.d restart dnsmasq 重啟 dnsmasq。如果沒有錯(cuò)誤的話,這時(shí)本地的 dnsmasq 已經(jīng)跑起來(lái)了。
測(cè)試 dnsmasq
測(cè)試一下:
wzyboy@vermilion:~$ dig www.taobao.com @8.8.8.8 +short
www.gslb.taobao.com.danuoyi.tbcache.com.
scorpio.danuoyi.tbcache.com.
119.167.195.251 → 這是淘寶的青島聯(lián)通的服務(wù)器,我用江蘇電信連奇慢無(wú)比
119.167.195.241 → 這也是青島聯(lián)通
wzyboy@vermilion:~$ dig www.taobao.com @127.0.0.1 +short
www.gslb.taobao.com.danuoyi.tbcache.com.
scorpio.danuoyi.tbcache.com.
222.186.49.251 → 解析到常州電信了,快!
61.155.221.241 → 這是上海電信
wzyboy@vermilion:~$ dig twitter.com @127.0.0.1 +short
199.59.150.7 → Twitter 還是用 8.8.8.8 解析的,所以解析出來(lái)是未經(jīng)污染的正確地址
199.59.148.82
199.59.149.230
效果很明顯,這時(shí)可以把本地的 DNS 設(shè)為 127.0.0.1 了。大部分 Linux 用戶直接更改 /etc/resolv.conf 的內(nèi)容為
nameserver 127.0.0.1
即可。Ubuntu 12.04 及以后的用戶,可能需要對(duì) resolv.conf 做一些手腳,具體參考這里。如果不愿意改的話,可能每次聯(lián)網(wǎng)都要手工改一次 resolv.conf,或者在 NetworkManager 中手工指定 127.0.0.1 為 DNS。DHCP 用戶的話,可以通過(guò) /etc/resolv.conf.head 之類的文件來(lái)保證 127.0.0.1 在第一行。
這樣配置完之后,如果你沒有在 dnsmasq 里限定查詢 IP,那么你的家人、朋友們也是可以把你的電腦作為 DNS 服務(wù)器的。如果你本地是 VPN 全局翻墻的話,需要把你選擇的國(guó)內(nèi) DNS 服務(wù)器通過(guò)路由表加入直連的范圍內(nèi)。當(dāng)然,已經(jīng)使用 chnroutes 的就不需要了。
五、我不是 Linux 用戶怎么辦?
如果你是 Windows 用戶
參考這個(gè)問(wèn)題,去配個(gè) BIND9 的 Windows 版本試試吧?;蛘呖梢匝b個(gè) dnsmasq 的 Windows 代替品。
如果你是 Mac OS X 用戶
Mac OS X 的 resolver 比較獨(dú)特,似乎有比較簡(jiǎn)陋的解決方法,參考這篇文章。另外,OS X 似乎也是自帶 named 的,所以……
其實(shí)還有更通用的方法
聽說(shuō)過(guò) VirtualBox 嗎?開源、免費(fèi)、強(qiáng)大的虛擬機(jī)軟件??梢匝b個(gè)最配置非常低下的虛擬機(jī),比如 32 MiB 內(nèi)存甚至 16 MiB 內(nèi)存的虛擬機(jī)(要知道 64M 內(nèi)存的 Linux 已經(jīng)可以跑 WordPress 這龐然大物了),裝個(gè)最簡(jiǎn)單的小 Linux,比如只有 37M 的 Ubuntu Core,然后裝上依賴包幾乎沒有的 dnsmasq,再把 Windows / OS X 的 DNS 設(shè)為虛擬機(jī)的 IP 地址,于是便可以用了。在當(dāng)今內(nèi)存動(dòng)輒 4 GiB 的情況下,拿 16MiB 內(nèi)存出來(lái)?yè)Q個(gè)更舒暢的上網(wǎng)體驗(yàn),還是很不錯(cuò)的。
六、尾聲
祝各位讀者折騰成功,上網(wǎng)愉悅。
補(bǔ)充:其實(shí)這樣本地 DNS 緩存服務(wù)器,還有這樣的好處:
wzyboy@vermilion:~$ dig wzyboy.im
;< >DiG 9.9.1-P2 < >wzyboy.im
;; global options: +cmd
;wzyboy.im. IN A
wzyboy.im. 103 IN A 198.244.51.13
;; Query time: 307 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Sep 6 21:32:07 2012
;; MSG SIZE rcvd: 54
wzyboy@vermilion:~$ dig wzyboy.im
;< >DiG 9.9.1-P2< >wzyboy.im
;; global options: +cmd
;wzyboy.im. IN A
wzyboy.im. 95 IN A 198.244.51.13
;; Query time: 2 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Sep 6 21:32:15 2012
;; MSG SIZE rcvd: 43
看出來(lái)了吧?
當(dāng)前標(biāo)題:使用國(guó)外DNS造成國(guó)內(nèi)網(wǎng)站訪問(wèn)慢的解決方法
標(biāo)題URL:http://www.rwnh.cn/news19/210869.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、電子商務(wù)、網(wǎng)頁(yè)設(shè)計(jì)公司、動(dòng)態(tài)網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容