JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

防火牆、VPN 與 IPsec

TLS 保護的是兩支程式之間的一段對話。本篇把鏡頭拉遠,談那些把整個網路、整台機器包起來的防護:一道決定哪些封包可以通行的防火牆,以及一條建立在 IPsec 之上、把你的流量在開放網際網路上再裹進一層加密信封的 VPN。

兩件不同的工作:過濾與包裹

在上一篇裡,你看著 TLS 在一個瀏覽器與一台伺服器之間建起一條私密通道,先用憑證證明伺服器身分,再把裡頭的一切加密。那很強大,卻很狹窄:它保護的是某一支應用程式的對話,而且只在兩端都會說 TLS 時才成立。真實的組織還需要更粗、更廣的工具——那些不管封包是哪支程式送出的、都會作用在每一個封包上的防護,以及那些連自己都不知道有安全在進行的機器也能罩住的保護。本篇談其中兩種:防火牆,它決定哪些封包根本被准許通行;以及 VPN,它把你的流量一路裹進一層保護性的外層信封,橫越整個網際網路。

把這兩件工作在腦中分開會很有幫助。防火牆做的是過濾:在抵達某個邊界的封包裡,哪些我們丟掉、哪些放行?VPN 做的是包裹:把那些原本會以明文走過開放網際網路的封包,放進一條加密且經過認證的通道裡,好讓任何盯著線路看的人——你在本梯級第一篇遇到的竊聽者與中間人——只看得到一個個封好的信封。過濾控制的是誰可以說話;包裹控制的是旁觀者能得知什麼。大多數組織兩者都用,而且分層使用,因為這兩者誰也做不了對方的工作。

無狀態防火牆與有狀態防火牆

最簡單的防火牆,是一張對每個封包逐一套用的規則清單,而且只憑封包自己標頭裡寫的東西來判斷它:來源與目的 IP 位址、通訊協定(TCP 或 UDP),以及埠號。一條規則可能寫著「允許任何前往 TCP port 443 的封包」(於是網頁流量進得來),以及「丟棄任何前往 TCP port 23 的封包」(於是沒人能連上那個古老又不安全的 Telnet 服務)。因為它在封包之間什麼都不記得,這就叫做無狀態防火牆,或封包過濾防火牆。它又快又便宜,對於粗略的規則來說也運作良好。

但無狀態有個真實的弱點。假設你網路裡有人對一台網頁伺服器開了一條連線:一個封包從 TCP port 443 離開,而伺服器的回覆要回來。無狀態防火牆並不記得是你發起了那段對話,所以為了讓正常的回覆進得來,它必須對高埠號的入站流量開著一條寬鬆的規則——而同樣這個寬鬆的開口,會被沒人請求過的流量濫用。解方是有狀態防火牆,它會記住它看過的連線。當它看著你的出站封包離開時,會把那段對話記進一張表裡;當回覆抵達時,它檢查這個回覆是否屬於一條你真的發起過的連線。對你自己連線的回覆會被歡迎;那些假裝成回覆、卻不在表裡的未經請求封包,則會被丟掉。

請注意,有狀態防火牆倚靠的是你已經知道的東西。為了辨認一條連線,它會追蹤三向交握——也就是開啟每一條 TCP 連線的 SYN、SYN-ACK、ACK 交換——並在之後跟著序號走。這也是有狀態防火牆能察覺麻煩的地方:一大批永遠不完成交握的 SYN 封包,正是經典的 SYN 洪泛,也就是你下一篇會遇到的阻斷服務攻擊。追蹤狀態,正是讓防火牆能把一段真正的對話跟雜訊區分開來的東西。

IDS 與 IPS:先看,再動手

因為防火牆的判斷很粗糙,組織會再加上第二雙眼睛。入侵偵測系統,也就是 IDS,會坐著盯住流量,拿它跟已知的攻擊樣式、以及一套「正常該長什麼樣」的感覺去比對,當有什麼看起來不對勁時就拉警報——一場在你機器之間悄悄爬行的埠掃描、一個已知的漏洞利用特徵、一大批半開的連線。IDS 只看與回報;它是煙霧偵測器,不是防火門。它的近親,入侵防禦系統(IPS),則被允許動手:當它認出一場攻擊時,可以丟掉那些惹事的封包,或乾脆把來源整個封鎖。差別只在一個字——IDS 偵測,IPS 防禦——而實務上,同一個產品往往兩者都做。

不過要對它的極限誠實。一個靠比對已知特徵的 IDS,對一場全新、還沒人有特徵可比的攻擊是瞎的;而一個會把任何「不尋常」都標起來的 IDS,會對真實流量裡那些無害的怪異之處狼來了喊個不停——假警報太多,人們就不再聽了。而且就跟防火牆一樣,IDS 很難檢查加密流量:如果酬載受 TLS 保護,它能研究信封(誰在跟誰說話、量多大、多頻繁),卻看不到裡頭的字句。這些工具縮小了單靠防火牆所留下的缺口;它們並沒有把缺口補滿。

VPN 與 IPsec:在你封包外的第二層信封

現在來談包裹。虛擬私人網路,也就是 VPN,能讓兩台機器——或一台筆電與一個辦公室網路——表現得彷彿共用一條私人連線,即使它們的封包其實是橫越公開網際網路的。訣竅在於一條通道:每個原始封包,連標頭一起,都被當成單純的資料,放進一個全新的外層封包裡,這個外層封包經過加密,被送過網際網路到達遠端,在那裡外層包裝被剝掉,原始封包就冒出來繼續它的旅程。這正是你在最初梯級就學過的封裝概念——封包裡裝封包——只是這裡用來保護,而不是用來分層。IPsec 是在網路層建立這類通道最常見的標準,它把普通的 IP 封包包起來,好讓整個整個網路能安全地連接起來。

Before the VPN (out in the open):

  [ IP hdr | TCP hdr | your data ]   <- readable by anyone on the path

Through an IPsec tunnel (ESP):

  [ new IP hdr | ESP hdr | ENCRYPTED{ IP hdr | TCP hdr | your data } | ESP auth ]
     |                       |                                          |
   to the VPN              hides the original               proves it wasn't
   gateway                 packet entirely                  forged or altered
一條 IPsec 通道在前面加上一個新的外層 IP 標頭,把整個原始封包當酬載加密,再附上一個完整性標記。旁觀者只看得到閘道對閘道的流量,看不到裡頭是什麼。

IPsec 不是單一機制,而是一個小工具箱,而且它重用了本梯級前幾篇的每一個概念。兩端先跑一場金鑰交換交握(叫做 IKE),用公開金鑰密碼學彼此認證、並商定一把全新的共用祕密——這正是 TLS 解決金鑰分發問題的同一套辦法。接著它們用一個叫 ESP 的協定保護每個封包,ESP 把酬載加密以達成機密性,並附上一個訊息驗證碼,也就是密碼學那篇講過的 HMAC 式完整性標記,好讓接收方能偵測任何竄改。IPsec 還在每個封包裡放進序號,專門用來擊敗重送攻擊——一個被擷取下來、稍後又被重送的封包,會被認出是過期的而丟棄。機密性、完整性、認證、防重送:整張 CIA 願望清單,不是套在某一支 app 上,而是套在線路上的每一個封包上。

  1. 兩個端點(比方說你的筆電與辦公室閘道)跑 IKE 交握:它們用憑證或一把共用金鑰彼此認證,並用公開金鑰密碼學商定一把全新的對稱會談金鑰——而那把金鑰從不曾被送上線路。
  2. 你的筆電有一個封包要送。它不直接把封包丟上網際網路,而是用會談金鑰把整個封包加密,再附上一個完整性標記與一個序號。
  3. 它把那團加密過的資料包進一個新的、收件人是辦公室閘道的外層 IP 標頭裡,把它送過開放的網際網路。任何盯著看的人,只看得到筆電對閘道、內容無法閱讀的流量。
  4. 閘道收到它,檢查完整性標記(拒絕任何偽造或被竄改的東西)與序號(拒絕重送),把酬載解密,還原出原始封包。
  5. 閘道把那個原始封包往前轉送進辦公室網路,彷彿你的筆電一直就坐在那裡。回覆也以同樣方式回來,在反方向上被加密。

VPN 承諾了什麼、又沒承諾什麼

對 VPN 抱持清醒的眼光是值得的,因為它被大力行銷,也被普遍誤解。VPN 真正給你的,是一段受保護的路段:在你的機器與 VPN 的出口之間,你的流量被加密、也受完整性保護,於是你的本地網路、你的咖啡店 Wi-Fi、你的網際網路供應商,都再也讀不到你在做什麼、也無法竄改它。這是真實而有用的。但保護到出口就停了。從 VPN 的出口往前到那個真正的網站,你的流量走的跟平常一模一樣——這意味著 VPN 業者成了那個新的、能看見你未加密流量的一方。你並沒有移除信任;你只是把信任從你的本地網路,搬給了那個營運 VPN 的人。

再說兩個誠實的重點。第一,VPN 跟 TLS 不是同一回事,它也不取代 TLS。如果你造訪的網站用 HTTPS——它應該要用——那麼不管有沒有 VPN,你的流量早已端對端加密到那個網站了;VPN 只是在你這一端附近多加了一段被包裹的路段。這兩種保護住在不同的層,解決的是重疊但不同的問題。第二,別把 VPN 跟匿名混為一談。你的流量總得從某處出去,那個出口有一個 IP 位址,而目的端仍會從請求本身得知不少關於你的事。VPN 把你的流量對你的本地網路與供應商藏起來;它並不會讓你隱形。