狀態檢測防火牆(stateful firewall)
基本的封包過濾器孤立地裁決每個封包,像一個沒有記憶的警衛,對每位訪客都得從頭重新判斷一次。這造成一個真實的問題:當你的電腦發出請求、回應送回來時,那個回應是一個入向封包——警衛怎麼知道它是你問的問題的歡迎答覆,而不是一個未經請求的探測?狀態檢測防火牆靠「記住」來解決這點。它追蹤進行中的連線,於是能辨認出某個封包是你發起的對話的一部分,並據此處理它。
它的運作方式是維護一張作用中連線的狀態表。當你的機器開啟一條出向 TCP 連線(三向交握朝某網頁伺服器送出的 SYN)時,防火牆把那條流——來源與目的 IP 及連接埠——記進它的表裡。當伺服器的回應抵達時,防火牆查表,看到它對應到一條已建立的出向連線,便放它通過。一個不對應任何被追蹤連線的封包(一個冒充回應的未經請求入向封包)找不到相符的項目,於是被丟棄。對 TCP,它甚至能跟隨交握的狀態,拒絕不符合預期順序的封包。
為什麼重要:有狀態讓防火牆能執行一套有用得多、也自然得多的政策——「允許我們發起的連線的回應,但阻擋未經請求的入向連線」——這正是大多數網路想要的,也是無狀態過濾器只能笨拙地近似的。幾乎所有現代防火牆都是有狀態的。誠實的提醒和任何防火牆一樣:追蹤連線狀態講的是「哪些封包屬於被允許的對話」,而不是「那些對話的內容是否安全」。狀態檢測防火牆仍然抓不到藏在你合法允許的連線裡送進來的惡意軟體;深度內容檢查是另一回事。
你的筆電開啟一條連到網頁伺服器的連線(出向 SYN)。狀態檢測防火牆記下這條流。伺服器的 SYN-ACK 入向抵達;防火牆找到相符的項目並放它進來。稍後,攻擊者送來一個冒充回應的未經請求封包——沒有相符的連線存在,於是它被丟棄。
記住你的連線,因此回應能被辨認出來。
狀態檢測追蹤的是「哪些封包屬於被允許的對話」——它仍然不讀內容是否惡意。連線狀態不是內容檢查;被允許的流量裡仍可能夾帶攻擊。