從《旅行青蛙》看網路安全
最近有一款遊戲火遍了朋友圈,它的名字是《旅行青蛙》,是遊戲公司HIT-POINT的作品。這款遊戲在短短几個星期之內就讓幾乎全中國的年輕人都知道了它的存在,不論你之前是否關注遊戲新聞,你總能從不同的渠道了解到它。
因為我之後的說明要用它來舉例,所以懇請大家耐心地聽我說下去。
《旅行青蛙》的玩法很簡單,青蛙不受你的任何控制,他會隨意外出旅行,玩家需要做的就是準備好旅行道具供青蛙去旅行,青蛙也會帶回來一些特產給你。
很多人會關心自己的青蛙到底去哪兒了,什麼時候會回來,怎麼還不寄照片回來......卻絲毫不擔心青蛙會掛掉。
那是因為所有人都知道這只是遊戲,遊戲本身是不會出現這種情況的。那如果這樣說,可能就會有如下的場景:
- 沒有任何人會漫無目的地去旅行,就算這個人想這樣玩,那他也不會說「我要去全球旅行」,而是會說我要去某某國家旅行。青蛙也是一樣,它一定會提前計劃好旅行的地點。
- 計劃好地點之後呢?就完了嗎?可以直接啟程了嗎?不是這樣吧,比如說你提前計劃好要去英國旅行,「英國」是什麼?「英國」只是一個名字而已,你要去「英國」,哇難道你就只需要知道有這麼個地方叫「英國」就ok了嗎?不對吧,你必須要知道「英國」的具體位置才能去,「英國」在哪?它在我們的西邊。
- ok,小青蛙,現在你已經知道了「英國」在哪兒了,你下一步要做什麼?你需要知道怎麼去「英國」,對不對?大家注意,這一步和上一步是不一樣的,剛才你只是知道了「英國」在中國的西邊,你知道了「英國」在地球上的位置,但是你並不知道怎樣才能到達這個地方,這是關鍵。那我們這一步要解決的就是這個問題,「英國」怎麼去?如果你知道你們縣城的路,那你就應該知道想出國得先出縣城,而出縣城的必經之路就是縣城車站,出了縣城之後你知道還得先走出你們市,出完你們市還要走出你們省,這時候就沒有什麼必經之路了,出市出省可能會有多條路,但是你的目標只有一個,那就是出國。就這樣一步步地,最終你會眺望著遠方的英國,深吸一口氣,然後緩緩吐出,「英國,我來了」。
- 開心嗎,小青蛙,不管你經歷了什麼,反正你已經來到了「英國」,好好在英國玩一玩吧!但是不要忘記哦,你是有任務的,你需要給你的主人帶回一些特產的。所以,就請暫時拋下你的小情緒,來找一些你主人需要的特產吧!
- 好的,特產我們找到了,這個時候我們是不是該回家了呢?但是請注意哦,此時的小青蛙已經和來時不一樣了(本山大叔:你大媽已經不是你六年前那大媽了),它經歷了旅行的成長,已經蛻變為另一隻小青蛙了,它將帶著特產回到它的家,有可能是完全順著來時的路,也有可能不一樣,但它此時的目的只有一個,帶著特產回家。
- 青蛙回到家,將自己旅行的特產拿給主人。這次旅行完美結束。
怎麼樣!是不是一下子豁然開朗!
ok,下面咱們將以上人類世界(青蛙世界)的場景翻譯一下,看看在網路中應該是什麼樣子的:在網路的世界裡,你點開一個網頁,或者從網上下載一個東西,又或者你在網上看一些視頻,本質上就是「旅行」,只不過主角這一次不是青蛙了,而變成了一個更小更抽象的東西,我們把它稱為「數據包」,這裡我們就拿「點開一次網頁」來舉例吧!
大家想要上網查找自己想要的資料通常第一步要做什麼呢?我覺得如果我猜的不錯的話可能是這樣:
其實我很不想拿這個來舉例子,因為大家通常認為打開瀏覽器就直接可以使用百度......這是不對的,實際上在這中間瀏覽器幫你做了一些事情,我這裡就不說做了什麼了,我來給大家示範一下完整的操作流程:
(1)首先,你要在瀏覽器里輸入百度的網址(那網址又是什麼東西呢?就是個名字啊,你要去「英國」旅行,你首先肯定知道了「英國」這個名字。同樣的,你要訪問百度,那肯定要知道百度的名字,他的名字是「www.baidu.com」,至於百度的名字為什麼要這麼寫,我覺得大家可以先放一放,我後續會單獨寫一篇文章來介紹)
如果您足夠細心就會發現,在「www.baidu.com」的前面還有「https://」這樣一個東西,「://」大家不要管了,這是固定的寫法,需要注意的是前面的「https」。如果您經常上網,您就會發現有時候這裡是「http」,我後續會單獨來寫一篇文章來介紹這兩個東西的作用以及適用的場景。這裡我拿「https」舉例:
在網址的前面加一個https是要做什麼嗎?很多人會有這樣的疑問,大家可以這樣想,你如果要去「英國」旅行,你就得決定怎麼去,你會說:「我坐飛機去啊」。
對呀,「飛機」是什麼?是一種交通工具吧,那「https」也是一樣,就可以把它理解成網路世界中傳輸數據的一種交通工具。在人類世界裡,有汽車、火車、動車、高鐵、輪船、飛機,在網路世界裡也有ftp、smtp、pop3、http、https、dns等等與之對應,在網路的世界裡我們把這些交通工具稱之為「協議」(有些人做比喻的時候習慣把tcp和udp比作交通工具,我覺得是不恰當的)
(2)ok,現在我們坐在「https」這架飛機上,我們告訴駕駛員我們的目的地是「www.baidu.com」,那麼我們現在只需按一下回車鍵,就會顯示如下內容:
恭喜,我們現在「到達」了百度的伺服器,這就是百度伺服器的初始界面,等等...我為什麼要加引號?我們真的「到達」了百度的伺服器嗎?好多人都是這樣認為的,但是大家細細一想,「到達」又是什麼意思?我們根本沒有「到達」吧!當我們按下回車鍵的時候,本質上只是向百度的伺服器發送了一個數據包,然後百度伺服器接收到之後又返回給我們(這裡的我們指的就是瀏覽器)一個數據包,這個數據包裡面有我們要的「特產」,這個「特產」本質上是一堆html代碼,只不過這些代碼在瀏覽器中呈現出來的樣子就是我們上面看到的「乾淨漂亮的百度頁面」,這就是請求和應答。(其實這裡還有一個問題,那就是百度伺服器返回給我們的數據包裡面就只有「特產」嗎?嘿嘿,我覺得說到這裡就好,這次我們只談表面)
(3)那麼當我們用百度去搜索的時候又是什麼樣子呢?
看,我們在搜索框里輸入「uzi」,然後點擊右邊的「百度一下」,就會顯示出上圖的界面,需要注意的就是最上面的網址欄裡面,在「www.baidu.com」的後面多了一些東西,這些東西是什麼呢?我後續寫關於http的文章裡面會詳細地給大家解釋裡面每一個欄位的含義,這一次大家就簡單的理解成「目錄和參數」就好,什麼意思,就是說後面的這一長串東西想要表達的,或者說想要告訴我們的就是:你搜索的這個東西在我伺服器的哪個位置,以及你發送給我的數據包裡面應該怎麼寫,我伺服器才會返回你想要的東西(這就跟寫信一樣,你寫的信中要說明你想要什麼,別人才會相應的按照你的要求回信啊)。
為了讓大家搞清楚數據包裡面到底是什麼樣子的,我抓了剛才的http數據包(咦?我為什麼不抓一個https的數據包看一下呢?):
大家看到了嗎?這就是一個http數據包裡面原本的樣子,看不懂對不對?沒關係,以後我會為大家解釋,大家現在只需要看藍色的部分,那就是我們需要提交給伺服器的信息,這個信息是當你在百度的搜索框中寫入「uzi」並回車之後,瀏覽器自動生成的,現在發現了瀏覽器的作用了沒有?瀏覽器的作用之一就是構建數據包並把它發送出去,作用之二就是接收數據包並以網頁的形式呈現給我們,當然還有其他作用。好了,我們現在知道了當我們在搜索框裡面輸入「uzi」的時候,瀏覽器會幫我們自動生成一個百度伺服器能看得懂的數據包,然後發給百度伺服器,而伺服器會將我們需要的內容返回給我們。
那又回到那個問題,我為什麼不直接抓https的數據包呢?因為「https」中的「s」代表的是「Secure」,安全,那要怎麼保證安全呢?加密啊,加密了以後你還能看懂數據包裡面的東西了嗎?看不懂的,裡面是這樣的:
(4)ok,我知道自己現在說的已經有點亂了,沒關係,咱們繼續。剛才已經獲得了百度伺服器返回給我們的網頁(數據包)了,如下圖,我們是不是隨意點擊一個鏈接,百度伺服器就會返回給我們想要的網頁了呢?
那就讓我們隨便點擊一個,就第二個紅色框吧!去「uzi直播間」看看!
是不是看到了什麼不得了的東西,網址欄里的東西完全變了,不是「www.baidu.com」了,變成了「www.huya.com」了,也就是說現在咱們訪問的已經不是百度的伺服器了,是虎牙的伺服器,我們給虎牙的伺服器發送了一個數據包,然後虎牙的伺服器將這個網頁以數據包的形式返回給我們。
所以這就間接證明了,百度的伺服器上存的並不是具體的內容,而是一些內容摘要和鏈接,當用戶點擊這些鏈接的時候(就像剛才),本質上是構建了一個去往其他伺服器的數據包,實際的內容是其他的伺服器返回給你的。這就和房屋中介一樣,中介手裡其實並沒有房子,但是中介知道哪裡有、怎麼聯繫房主,所以通俗一點說,百度......準確地說是百度搜索引擎的作用其實和房屋中介也差不了多少。
講到這裡我覺得已經差不多了,但有一些重要的東西我覺得我還是寫的不好,沒有和青蛙旅行對應起來,下面開始用專業術語來對應:
- 用戶要訪問百度,他知道了百度的名字,也就是域名,是:「www.baidu.com」
- 光知道名字是不行的,你要知道他在哪,在網路世界裡對應的就是他的ip地址。那麼如何知道百度的ip地址呢?要用到DNS解析,DNS伺服器會將域名轉換成對應的IP地址(關於DNS我後續會單獨寫一篇來介紹,這裡大家只需要知道DNS可以將域名轉換成ip地址,就好比你告訴他「我要去英國旅行」,他會告訴你「嘿,小青蛙,英國在西邊」)
- ok,一個基本的數據包已經構建好了,或者說一封信已經寫好了,裡面也有了收信人的地址(百度的ip地址)。下面我們要將數據包發出去了,我們要把數據包發給我們所在的網路內的「出口」,這個「出口」我們稱之為「網關」(我想了想,覺得只有這個比喻是最恰當的),從這個「出口」走出去之後,我們就到了浩瀚的公網了(這裡又涉及到公網和私網的概念了,我們以後再說):
我們現在需要一張地圖,這張地圖上面記錄了我們如何能從縣城的車站一步一步到達遠方的英國,這個地圖我們把它稱之為「路由」,我如果說路由器大家是不是會更熟悉?路由器的作用就是轉發和定址,就相當於縣城的車站,在車站裡面會有電子顯示器告訴坐哪輛車可以去哪裡(這就是定址,也就是路由,也就相當於地圖),在車站裡我們可以坐上車去別的地方(這就是轉發)。
4. 好的,現在數據包通過我們的地圖(路由)一步步終於來到了目的地,也就是百度伺服器,百度伺服器會將數據包拆開,發現這個數據包的目標是我(收信人寫的是百度),它會向源地址,也就是「寄信人」返回自己的搜索頁面,將這個搜索頁面放到一個數據包裡面。
5. 瀏覽器收到百度伺服器發回來的數據包之後,同樣是拆開,將裡面的內容以網頁的形式呈現給用戶。
6. 用戶這個時候要開始搜索東西了,他在搜索框裡面輸入一些東西,然後點擊「搜索」,這個時候又一個小青蛙就背著旅行箱出發了,他又去找百度伺服器,只不過這一次他是帶了搜索的內容過來的,百度伺服器根據這個來返回相應的內容。
7. 用戶又一次在瀏覽器裡面看到了百度返回的內容,只不過這一次不是只有簡簡單單的搜索框了,還有他想要找的東西的搜索列表,他想了想,隨便點了一個......這個時候,又一隻小青蛙背著旅行箱出發了,這次他就不去找百度了,他去找別的伺服器了,而具體去找哪個伺服器,這是剛才百度告訴他的。
8. ok,歷經千辛萬苦,小青蛙終於將用戶需要的網頁帶回來給主人看了。
那其實說到這裡,到底和網路安全有什麼關係呢?有關係啊!上面青蛙旅行的每一步,只要其中有一步出了,你的蛙可能就要進火鍋了。
- 首先如果你的DNS請求被攔截,並偽造一個假的DNS解析結果發給你呢?這樣就會導致你獲取到的目的ip地址不正確,總之你用這個ip地址到達不了英國,你會去哪兒呢?不知道,可能是美國,可能是阿富汗。這裡有人會問,就算我的數據包去了一個錯誤的地方,好像也對我沒什麼影響啊,頂多是訪問不了網頁了......emmm,其實訪問不了網頁已經是一個大問題了,那彈開這個不說,你訪問到了一個錯誤的地址到底有沒有什麼問題呢?這裡應該還有一個前提條件,就是這個錯誤的地址是否安全(你看,這裡又多了一個問題,到底什麼是安全啊)。如果說你訪問百度結果給你訪問的是google,那這肯定沒問題啊(好多人開心還來不及,因為幫你翻牆了呀),但是如果你獲取到的這個ip地址是有心人費盡心思搭建的一個非法的伺服器的地址呢?這裡就有問題了,因為當你訪問它的時候,它也會返回給你數據包(一來一回嘛,所有的訪問都是這樣,有來有回,這才叫一次合法的訪問),這些數據包裡面就有可能包含一些注入和下載程序,讓大家去下載一些東西,單純是下載還好,如果是在你的電腦上安裝一個控制項,監視你電腦上的一切呢?如果這個控制項可以修改你電腦上的配置,將你的網關和ip修改成為別人想要的,並且讓你所有的數據包都發給特定的人呢?如果控制項中的有這樣一段代碼,它讓你的電腦每次開機的時候都自動打開攝像頭,然後將攝像頭拍到的視頻信息通過網路傳輸到別人的電腦呢?(這裡還有一個問題,就是將域名解析成ip一定要用DNS伺服器返回的結果嗎?其實也不是,因為本機上還有HOST呢,你也可以人為的修改HOST嘛,HOST裡面就存放著一些ip和域名的對應關係)
- 其次,網路世界中充斥著大量的監聽、攔截和偽造。就像剛剛說的,非法的伺服器會返回給你一個充滿危險的數據包,那我最開始的時候就有一個疑問:為什麼這些非法的伺服器不直接發給我們包含非法程序的數據包呢?非要引誘我們先去訪問它,然後再來侵犯我們的隱私。這是因為有防火牆,它被部署在很多地方,比如說區域網的出口,甚至在我們自己的電腦上也有防火牆,只不過我們電腦上的防火牆功能比較差罷了。那防火牆到底是幹什麼用的?我個人理解,防火牆就是按照我們提前制定好的規則對數據包進行一些過濾和篩選用的。那這和我們剛才說的又有什麼關係呢?是這樣,一般的防火牆上都會有這樣的檢測規則,檢測來回的五元組是否一致,什麼意思呢?就是說百度要給我的電腦返回一個數據包,我的電腦上是有防火牆的,那麼我的電腦到底接不接收百度給我的這個數據包呢?那要看我是不是給你百度發了請求數據包,請求和應答一定是同時存在的,兩者缺一不可。如果我從未給百度發過請求數據包,那你百度突然間給我發了一個數據包,你說我能接嗎?我敢要嗎?所以這也是非法伺服器不能主動給我們發數據包的原因之一吧。
- 另外,如果是涉及到底層的安全問題還好,一旦涉及到高層,那往往就會產生很大的問題。舉個例子,https是加密的協議,如果你作為中間人想要破解的話幾乎是不可能的
- 現在該ip這種方法感覺已經過時了,都是在上層協議上做文章,比如http、ftp等等
感謝各位能一直看到現在,我也是第一次寫這種文章,但是我還想有些不一樣,我想讓所有人,包括零基礎的人也能看懂,所以有些地方拿捏的不是很准,但我會慢慢改正,下一次我會寫關於http和https的文章,請大家到時候來捧個場啊!(我在文中有任何不對的地方,請立即指正我,說的難聽一點也沒關係,我覺得慢慢就好了,知識就是在不斷的討論和修正中慢慢鞏固的)
就比如說知道今天我和朋友討論才發現,原來百度的http圖片資源已經不可用了,已經完全變成https的了,我是這樣做的,因為現在直接訪問http://www.baidu.com都會被轉成https類型的,所以我用nslookup查了一下百度的ip,然後在瀏覽器中輸入「http://111.13.100.91」,結果就發現沒有任何的圖片資源,全部都是文字,然後我看了一下請求,是這樣的:
所有對圖片資源的請求,返回的都是403......這個我以前還真的不知道,長見識了。
最後,推薦大家使用深信服的安全設備,我們的宗旨是:讓IT更簡單、更安全、更有價值
分割線--------2月11日更新,其實這篇文章一開始沒有過知乎的審查,我刪減了不少地方才通過的......
推薦閱讀: