1. 程式人生 > >《TCP IP 詳解卷1:協議》閱讀筆記 - 第七章

《TCP IP 詳解卷1:協議》閱讀筆記 - 第七章

還會在 列表 大量數據 序列 交換 算法 一個數 防火墻 交互式

閱讀須知:筆記為閱讀《TCP IP 詳解卷1:協議》後摘抄的一些知識點,其間也有加入一些根據英文原版的自己翻譯和結合網上知識後的理解,所以有些段落之間並不能夠串聯上或者知識點與書上略有差別(基本差別不大,參考的資料屬RFC官方文檔)。

第七章:防火墻和網絡地址轉換

防火墻是位於內部網和外部網之間的屏障,是系統的第一套防線,作用是防止非法用戶的進入。

網絡地址轉換是一種IP數據包通過路由器或防火墻時通過重寫來源IP地址或目的地址的技術,可以用來隱藏或保護內部網絡,同時也用來緩解IPv4資源緊缺(NAT普遍還是用於多臺主機共用一個公有IP地址訪問Internet網)。

防火墻

防火墻最常見的兩種是代理防火墻和包過濾防火墻,它們之間的主要區別是所操作的協議棧的層次及由此決定的IP地址和端口號的使用。包過濾防火墻是一個互聯網路由器,能夠對由外向內的流量進行過濾,丟棄符合(或者不符合)特定條件的數據包,一般而言由內向外的流量不做控制。簡單的過濾器包含網絡層或者傳輸層報頭中各個部分的範圍比較,常見的包括IP地址或選項、ICMP報文類型、根據數據包中端口號確定各種UDP或TCP服務。

一個典型的包過濾防火墻如下圖:

技術分享圖片

圖中防火墻有三個接口,一個是對內的,一個是對外的,一個是"隔離區(DMZ)"的接口。

其中"隔離區"部署的服務器可供外網訪問,其目的就是為了解決安裝防火墻後外網對內網服務器的訪問問題,是一個"安全區"和"非安全區"之間的緩沖區。

包過濾防火墻還分為有狀態和無狀態。有狀態包過濾防火墻能夠關聯已經或者即將到達的數據包來推斷流或者數據報的信息,繼而將屬於同一個傳輸關聯的數據包或構成一個IP數據報分片;無狀態包過濾防火墻則單獨處理每一個數據包。

以Linux中的iptables為例,iptables包含過濾表格和過濾鏈的概念,一個表格包含許多預定義的鏈以及自定義的鏈。三個預定義的表格為:filter、nat和mangle。

  1. filter表格用於處理基本的包過濾,包括預定義了INPUT、FORWARD、OUTPUT三條鏈,這些動作分別對應於目的地是防火墻路由器本身運行程序的流量、路由時通過防火墻的流量以及從該防火墻主機發出的流量。

  2. nat表格包含PREROUTING、OUTPUT、POSTROUTING三條鏈。

  3. mangle表格有五條鏈,用於任意修改數據包。

每條過濾鏈是一個規則列表,每條規則包含匹配條件及其對應的動作(也稱為target,目標),這些動作可能執行預定義的動作如:ACCEPT、DROP、QUEUE、RETURN。

  1. ACCEPT(DROP)指將數據包轉發(丟棄)。

  2. QUEUE指數據包將被提交給一個用戶程序處理。

  3. RETURN指處理將在之前觸發的一條鏈中繼續,形成一種包過濾鏈子調用。

Linux系統可用iptables命令配置包過濾防火墻:Try `iptables -h‘ or ‘iptables --help‘ for more information.

代理防火墻則不作為路由器,而是作為運行一個或多個應用層網關(ALG)的主機。對於代理防火墻內的主機,通常會做特殊配置以便關聯到代理防火墻,而不是連接到實際提供所需服務的終端主機。這個類型的防火墻相對是非常安全的,但犧牲的也是脆性和靈活性,因為每個傳輸層服務丟需要設置一個代理,任何要使用的新服務必須安裝一個相應代理,並通過該代理來操作發起連接。代理防火墻結構如下圖:

技術分享圖片

代理防火墻常見的有HTTP代理防火墻和SOCKS防火墻。前者也稱為Web代理,只用於HTTP和HTTPS協議,該代理常見的是功能有提供Web緩存、基於"黑名單"阻止用戶訪問Web網站;SOCKS防火墻用於Web之外的其他服務。

NAT

網絡地址轉換(NAT)允許在互聯網的不同地方重復使用相同的IP地址集。看似與IP地址是主機在網絡上唯一標識的規則相違背,先看看NAT怎麽實現的吧。

如圖是一個將私有地址及其內部系統與Internet網絡隔離的NAT:

技術分享圖片

如上圖,私有地址的數據報不會直接在互聯網上路由,而是有經過NAT路由器,NAT路由器內存在內外網絡地址相互對應的地址池(基礎NAT維護的是無端口號NAT表,NAPT支持端口映射的網絡地址轉換,也就是帶端口的NAT表),數據包在NAT路由器內經過網絡地址的轉換後由NAT路由器傳輸到互聯網就行路由而達到正確的目的主機。
然而,NAT也讓內外主機之間的通信變得復雜而導致通信效率的降低。

除了轉發數據包外,NAT還會在內部創建一個狀態用以記住當前正在處理的一個新連接,稱為NAT會話。對於NAT處理TCP請求,分別可以以TCP連接的SYS、ACK、FIN來標識連接的狀態,從而使得NAT路由器有效的清除會話狀態;而UDP則不同,UDP並沒有標識位,只有基於兩個端點的地址/端口號的組合。為了處理UDP會話狀態的清除問題,NAT采用一個映射計時器,[RFC4787]要求計時器至少為2分鐘,推薦5分鐘,還要求NAT保證對外的刷新,對內的刷新行為則是可選的。

NAT作為防火墻,同時也支持一些數據過濾功能。當客戶希望訪問位於同一個NAT私有地址空間內的服務器時,就會產生一個NAT環回,其過程是下面的:

  1. 主機A和主機B處於同一個NAT私有地址空間內,A希望訪問B,如果A知道B的私有地址,則可以直接訪問,但如果不知道B的私有地址,則需要向NAT服務器發送數據包;

  2. NAT數據包接收到數據包後,根據NAT內的私有地址的關聯表來映射到對應的B的私有地址;

  3. 從NAT服務器發送到主機B的數據包如果包含的"地址信息"是NAT中A的關聯地址,則B向A又通過NAT來通信。

於是... 形成了NAT環回。

在對於UDP/TCP這些可很好的被NAT支持的協議時,無須NAT做其他操作,但是當應用層協議與他們一起攜帶傳輸層或更低層的信息,如IP地址時,NAT的問題就變得復雜多了。如FTP交換傳輸及網絡層的端點信息,當傳輸大量數據時可以增加額外的連接,這時候經過的NAT不僅僅是改寫數據報的IP地址和端口號那麽簡單了,兩者的改寫同時導致有效載荷本身信息的改寫,如數據報的序列號、大小修改...具備有效載荷編輯的NAT被稱為NAT編輯器。

NAT穿越

由於如NAT編輯器的復雜性,一種可代替的方案是應用程序嘗試實現NAT穿越。NAT穿越通過NAT映射(針孔)實現。當NAT映射創建時,針對特定應用程序的流量通常允許在NAT的兩個方向傳輸,這種映射是臨時的,通常適用於在執行時間內的單一應用程序,映射會隨著程序之間的通信動態創建和刪除。

其過程如下:

  1. 私有地址S1的內部主機A和外部服務器C通信,私有地址S2的內部主機B和外部服務器C通信;

  2. 由於服務器C和每個客戶機都有連接,因此知道它們的外部尋址地址(NAT向外的接口IP地址及端口),於是C向主機A和主機B共享這些信息;

  3. 於是位於S1的主機A可以直接根據服務器C提供的地址訪問S2的指定地址/端口從而到達與主機B通信。

STUN(NAT會話穿越工具)是NAT穿越中確定地址的主力協議,TURN(NAT中繼的穿越)是一個特定的STUN用法,通過一個通常位於互聯網的經過特殊配置的TURN服務器來中繼流量,ICE(交互式連接創建)通過使用本地信息和由STUN和TURN確定的地址來確定一對通信端點之間所有可能的地址。

STUN是一個客戶機/服務器協議,依賴在互聯網上能被訪問的公共STUN服務器,能夠在多種環境下確定在NAT中使用的外部IP地址和端口號。 STUN服務器的主要工作是回顯發送給它的STUN請求,以確定客戶端的尋址信息。STUN基礎協議有兩種類型的事務:請求/響應事務和標誌事務。基礎的STUN頭部信息如圖:

技術分享圖片

報文類型字段給出方法和類型(請求、響應、錯誤、成功);

報文長度字段提供一個最大為2的16次方-1字節的完整STUN報文長度;

事務ID用於匹配請求和響應,或者在標誌情況下用於調試;

每個STUN報文能夠包含0個或者多個屬性,這取決於STUN的特定用法。

*註意:如果NAT是受限圓錐型或端口受限圓錐型[一(端口)對多(IP/端口)],雙方必須一起開始傳輸。

TURN通過6種方法、9個屬性以及6個錯誤響應代碼增強STUN。大致可以分為支持建立和維護分配、認證以及操作隧道。6種方法和它們的方法號如下:分配(Allocate)(3),刷新(Refresh)(4),發送(Send)(6),數據(Data)(7),創建權限(CreatePermission)(8),隧道綁定(ChannelBind)(9)。前兩種方法用於建立並保持分配存活;Send和Data使用STUN報文封裝從客戶端發送到服務器的數據,反之亦然;CreatePermission用於創建或刷新一個權限,ChannelBind通過一個16位的隧道號與一個特定的對等客戶端相關聯;錯誤報文表明與TURN功能相關的間題,如認證失敗或資源耗盡(隧道)。

ICE用於幫助位於NAT後的UDP應用程序主機建立連接。ICE使用並擴展了“請求/應答”協議,如單播SIP連接建立時的會話描述協議(SDP)。

通常ICE用於創建兩個SDP實體的通信,過程如下:

  1. 首先需要確定一組每個代理都能夠用來與其他代理進行通信的候選傳輸地址;

  2. ICE可同時使用STUN和TURN來確定候選的傳輸地址,接著根據優先分配算法對這些地址進行排序,相比於那些需要中繼的地址,該算法為能夠提供直接連接的地址分配更大的優先級;

  3. 然後ICE為對等代理提供優先的地址集合,其中對等代理也會有類似的行為;

  4. 最終兩個代理商量好一套最優的可用地址,並將選擇的結果告知對方。

IPv4/IPv6共存及NAT

由於一系列的原因,IPv4和IPv6將會共存很長的一段時間,甚至可能是無期限的...這就需要網絡支持IPv4和IPv6系統之間的通信。目前用於支持IPv4和IPv6組合的兩種方式是隧道和轉換。隧道方法包括Teredo、雙協議棧精簡版(DS-Lite)、IPv6快速部署(6rd)。

  Teredo(又稱為面向IPv6的IPv4 NAT網絡地址轉換穿越),是一項地址分配和自動隧道技術,能夠跨越IPv4 Internet實現IPv6單播連接,為能夠通過 IPv4 NAT,IPv6數據包作為基於IPv4的用戶數據包協議(UDP)消息發送。

  DS-Lite(雙協議棧精簡版)指在一臺設備上同時啟用IPv4協議棧和IPv6協議棧,這臺設備既能和IPv4網絡通信,又能和IPv6網絡通信。如果這臺設備是一個路由器,那麽這臺路由器的不同接口上,分別配置了IPv4地址和IPv6地址,並很可能分別連接了IPv4網絡和IPv6網絡。如果這臺設備是一個計算機,那麽它將同時擁有IPv4地址和IPv6地址,並具備同時處理這兩個協議地址的功能。

  IPv6快速部署(6rd)是一種特殊格式的PD(Prefix Delegation),以支持服務提供商快速部署IPv6。在DHCP Option的OPTION_6RD選項中保存IPv6 6rd前綴,用於根據客戶已分配的IPv4地址為客戶網站分配IPv6地址。

NAT64[RFC6146]被用於支持只有IPv6的客戶機與其他IPv4服務器進行通信。作為一個NAT,NAT64符合BEHAVE規格,支持獨立於端點的映射,以及獨立於端點和依賴於地址的過濾。因此,它是和上文的NAT穿越技術(如ICE、STUN、TURN)兼容的。一個NAT64設備被賦予一個IPv6前綴,能用於形成一個有效的IPv6地址。

由於IPv4地址空間的不足,在IPv6到IPv4這個方向的轉換利用了一個動態管理的IPv4地址池。這需要NAT64支持NAPT的功能,據此多個不同的IPv6地址可能會映射到一個相同的IPv4地址上。NAT64目前定義了由IPv6節點初始化的TCP、UDP和ICMP報文的轉換方法。

NAT64對於到達的傳輸層校驗和不為0的TCP或者UDP分片,可能會將分片排隊,然後一起或者單獨地轉換它們。NAT64必須處理分片,即便是那些亂序到達的。一個NAT64可能被配置一個時限,限制分片被緩存的時間(至少為2s)。否則,NAT可能受到DoS攻擊,耗盡保存分片的包緩沖空間。

小結

"防火墻、網絡地址轉換、IPv4/IPv6共存問題的解決方案"的相關知識點遠不止上文描述,文中知識僅當看書了解一下,做知識的拓展,並未深入的做學習和研究。

《TCP IP 詳解卷1:協議》閱讀筆記 - 第七章