HTTP簡要課程
當一個人解釋瀏覽器如何下載一個網頁的時候,他們常常會這麼說:
- 你的瀏覽器向伺服器傳送一個GET請求。
- 伺服器返回一個包含HTML的檔案響應。
這個系統就叫HTTP。
但是這個圖有點過於簡化了。你的瀏覽器不直接與伺服器通訊。可能是由於他們往往相離甚遠。
一般,伺服器可能距你幾千英里以外。這之間可能沒有直連你電腦和伺服器的線路。
所以這個請求從瀏覽器到服務端,會經過許多人的手。響應返回回來的時候也會如此。
我把這個比喻為同學們在課堂上傳遞紙條。紙條的外面會寫要傳給誰,然後寫的人把它交給附近的人,然後拿到紙條的這個人又把紙條傳給他附近的人——這些人不一定是最終的接收方,而是這個傳遞路線上的經手者。
這裡的問題在於,這條路徑上的所有人都可以開啟這個紙條然後讀裡面的內容。而且你事先無法知道這個紙條會經過哪些人手中。
可能其中的某人會做一些壞事...
比如把裡面的內容公之於眾
或者改變裡面的內容
為了防止這些問題,一個新的、安全的HTTP版本出現了,叫做HTTPS。什麼是HTTPS?就好比在每張紙條外面加了個鎖。
瀏覽器和服務端都知道怎麼處理這把鎖,但是中間的那些人並不知道。
有了這個,即使資訊被多人傳遞,只有你和網站能夠看到資訊的內容。
這解決了很多的安全問題。但是仍然有很多在瀏覽器和服務端之間傳遞資訊是沒有被加密的。這意味著中間的人仍然能夠發現你在做什麼。
一個資料會被暴露的地方是在與服務端建立連線的時候。當你傳送初始資訊給服務端的時候,你也傳送了伺服器名字(某些領域叫Server Name Indication)。這使得在一臺機器上執行多個網站成為可能,因為通過這個名字它知道你請求的是哪一個。這個初始請求是建立加密連線的一環,但是這個初始請求它本身是不加密的。
另外一個資訊暴露的地方是在DNS。所以,什麼是DNS?
DNS:域名系統
在上面傳紙條的比喻中,我說了接收方的名字會被寫在紙條的外面,這在HTTP請求中也是如此...這個名字用來表明這個紙條要去哪。
但事實上你無法使用名字告訴他們紙條要去哪。這之前的路由都不知道你說的是誰。然而,你需要告訴他們的是IP地址。這中間的路由才知道你要把訊息發往哪。
這裡就有一個問題。如果你是網站的運營方,你不會想你的使用者去記住你的IP地址。你會想給你的網站取一個上口的名字...好記的名字。
這就是為什麼我們需要域名系統(DNS)。你的瀏覽器使用DNS把網站名字轉換成IP地址。這個過程——把域名轉成IP地址——叫做域名解析。
然後瀏覽器怎麼知道如何去做這件事呢?
一個選項是你可以有一個很長的列表,像瀏覽器中的電話簿。但是當一個新的網站上線,或者遷移到新的伺服器去,很難使你的列表保持更新。
所以與其用一個列表儲存所有的域名,我們有許多互相關聯的更小的列表。這使得他們能被單獨地管理。
為了得到域名對應的IP地址,你需要找到包含這個域名的列表。這個過程就像尋寶遊戲一樣。
對於維基百科的英文版本網站en.wikipedia.org
的尋寶是怎麼樣的?
我們把這個域名分成幾部分:
有了這三部分,我們可以找到包含這個IP地址的列表。然而,我們在找尋的過程中需要一些幫助。這個幫我們找尋到寶藏(IP地址)的東西叫解析器(resolver)
首先,解析器會請求根DNS。它知道一些不同的根域名伺服器,所以它會給其中的一個傳送請求。解析器詢問根DNS可以去哪找到更多關於.org
頂級域名下的地址資訊。
這個根DNS會給出一個知道.org
下相關地址資訊的伺服器地址。
解析器會告訴告訴作業系統en.wikipedia.org
的IP地址。
這個過程叫做遞迴解析(recursive resolution),因為你從一個伺服器得到一個ip地址後,你需要回去向這個ip地址的伺服器發起另一個相似的請求。
我說過我們需要一個解析器幫我們完成這一系列請求。但是瀏覽器是如何找到這個解析器的呢?一般,瀏覽器會委託作業系統去獲得一個解析器。
那麼作業系統是如何知道該採用哪個解析器呢?這裡有兩種方式。
你可以配置你的計算機去使用一個你信任的解析器。但是基本沒多少人這麼做。
人們大多使用預設配置。預設地,作業系統會使用當前網路提供的解析器。當計算器連線到網路並獲得IP地址後,網路也會推薦一個解析器供使用。
這意味著你使用的解析器一天之內會變更好幾次。如果你下午決定去一家咖啡店上網,那麼你可能使用了一個與上午在家不同的解析器。當然如果你配置了你信任的解析器也是一樣的,因為在dns協議裡沒有安全可言。
DNS是怎麼被利用的
所以這個系統(DNS System)是如何讓使用者陷入一個弱勢地位呢?
通常解析器會告訴DNS伺服器你在查詢的域名是什麼。然而這個請求有時會包含你的整個IP地址。就算不是完整的IP地址,越多越多的請求會帶上你的大部分IP地址,這能和其他的資訊結合起來察覺出你的身份。
這意味著你詢問過的每一個伺服器都能知道你訪問的網站是什麼。不僅如此,還意味著你與伺服器之間的所有中間節點也能看到你的請求。
這裡有兩種對使用者的資料造成威脅的方式。主要是跟蹤(tracking)和欺騙(spoofing)
跟蹤(tracking)
就像我上面說的,很容易通過IP地址得知是誰在訪問這個網站。這意味著DNS伺服器和路徑上的中間人——叫做on-path routers——能夠建立一份你的畫像。他們可以記錄你訪問的所有網站。
這些資料是十分有價值的。很多人和公司會花很多錢來知道你瀏覽了些什麼。
於是你的資料就被收集和販賣了。因為網路給你的解析器可能根本靠不住。
即使你信任你的網路推薦的解析器。那也僅限於你在家的時候。如我前面提到的,當你去咖啡店或酒店等的時候,你可能使用了一個不同的解析器。誰知道它會怎麼處理你的資料。
在沒有得到你同意的情況下收集和販賣你的資料,這個系統還有一種更危險的利用方式。
欺騙(Spoofing)
說到欺騙,指的是你到DNS伺服器之前的某人改變了返回的結果。欺騙者可能會告訴你你訪問網站的假地址。這會阻止你訪問真的網站同時引導你進入了詐騙網站。
比如,你實體超市進行購物。你想要在某寶某東查詢某件商品的價格,看是否能在網上更便宜的買到。
但如果你連線的是超市的Wifi,你可能就用了他們的解析器。這個解析器可能劫持了你的電商的請求,然後欺騙你說網站不可訪問。
此篇只翻譯了文章中的教程部分,若想進一步瞭解Mozilla提出的安全解決方案Trusted Recursive Resolver (TRR) and DNS over HTTPS (DoH),請檢視原文