Tungsten Fabric SDN — SmartNIC vRouter
881
2025-03-31
2.7 iptables
iptables與前文介紹的tap/tun等不同,它并不是一個網絡設備。不過它們又有相同點:都是Linux的軟件。通過iptables可以實現防火墻、NAT等功能,不過這句話也對,也不對。說它對,我們確實是通過iptables相關的命令行,實現了防火墻、NAT的功能;說它不對,是因為iptables其實只是一個運行在用戶空間的命令行工具,真正實現這些功能的是運行在內核空間的netf?ilter模塊。
它們之間的關系如圖2-15所示。
我們不必太在意這個圖是什么意思,那樣有點偏離主題,只需有個直觀的感覺即可。本節所要描述的內容位于圖中“iptables命令”方框。
iptables內置了三張表:f?ilter、nat和mangle。
f?ilter和nat顧名思義,是為了實現防火墻和NAT功能而服務的。mangle,翻譯成漢語是“亂砍;損壞;用軋布機砑光”等意思,它在這里指的是“主要應用在修改數據包內容上,用來做流量整形”。
iptables還內置了另外2張表raw和security,這里不詳細介紹了。
iptables內置的既是三張表,也是三條鏈(chain),或者換個角度說,iptables內置的是三種策略(policy),而這些策略,是由不同規則(rule)串接而成。什么叫規則呢?我們以防火墻為例,講述一條規則:
iptables -A INPUT -i eth0 -p icmp -j ACCEPT
這條規則表達的意思是:允許所有從eth0端口進入且協議是ICMP的報文可以接受(可以進入下一個流程)的。
這就是一條規則,至于iptables的命令行格式(語法)只是一個表象,它的本質是對進入的IP報文進行說明,如:符合什么樣的條件(比如本條命令的條件是“允許所有從eth0端口進入且協議是ICPM的報文”)、做什么樣的處理(比如本條命令的處理是“接受”,可以進入下一個流程)。
iptables可以定義很多策略/規則,從圖2-16中我們知道,這些規則最終會傳遞到內核netf?ilter模塊,netf?ilter模塊會根據這些規則做相應的處理。netf?ilter的處理方式是:從報文進入本機(linux host或vm)的那一刻起,到報文離開本機的那一刻止,中間這段時間(或者是發自本機的報文,從報文準備發送的那一刻,到報文離開本機的那一刻止,中間這段時間),netf?ilter會在某些時刻點插入處理模塊,這些處理模塊根據相應的策略/規則對報文進行處理。
至于nat、f?ilter、mangle三張表也可以這么理解:僅僅是為了達到不同的目的(功能)而實現的三個模塊而已。
netf?ilter插入的這些時刻點如圖2-16所示。
圖2-16 Netf?ilter處理報文的時刻點
在這些時刻點中,上文提到三張表(模塊)并不是所有的時刻都可以處理。在同一個時刻點,也可以有多個模塊進行處理,那么這些模塊就有一個處理順序,誰先處理,誰后處理。這么說有點繞,具體請參見圖2-17。
圖2-17 Netf?ilter處理報文的詳細時刻點
圖中的幾個關鍵時刻點,含義如下:
1)PREROUTING:報文進入網絡接口尚未進入路由之前的時刻;
2)INPUT:路由判斷是本機接收的報文,準備從內核空間進入到用戶空間的時刻;
3)FORWARD:路由判斷不是本機接收的報文,需要路由轉發,路由轉發的那個時刻;
4)OUTPUT:本機報文需要發出去,經過路由判斷選擇好端口以后,準備發送的那
一刻;
5)POSTROUTING:FORWARD/OUTPUT已經完成,報文即將出網絡接口的那一刻。
三張表,所能對應的時刻點,如表2-4所示。
表2-4 三張表所能處理的時刻點
這三張表(三個模塊)在這些時刻點,到底是做什么處理呢?下面我們逐個講述。
2.7.1 NAT
1.?NAT的基本概念
在講述nat這張表做何處理之前,我們首先介紹一下NAT的基本概念。
NAT(Network Address Translation,網絡地址轉換),顧名思義,就是從一個IP地址轉換為另一個IP地址。當然,這里面的根本原因還是IP地址不夠用的問題(解決IP地址枯竭的方法一個是IPv6,另一個就是NAT)。所以,NAT,大家基本做的還是公網地址與私網地址的互相轉換。如果一定要在公網地址之間互相轉換,或者私網地址之間互相轉換,技術上是支持的,只是這樣的場景非常非常少。
NAT,從實現技術角度來說,分為:靜態NAT、動態NAT和端口多路復用三種方案。
(1)靜態NAT(Static NAT)
靜態NAT(Static NAT),有兩個特征(如圖2-18所示)。
①私網IP地址與公網IP地址的轉換規則是靜態指定的,比如10.10.10.1與50.0.0.1互相轉換,這個是靜態指定好的。
②私網IP地址與公網IP地址是1∶1,即一個私網IP地址對應1個公網IP地址。
(2)動態NAT
一般情況是公網IP比私網IP地址少的時候,用到動態NAT方案。如果公網IP地址比私網IP地址還多(或者相等),則用靜態NAT就可以了,沒必要這么麻煩。
動態NAT,就是一批私網IP與公網IP地址之間不是固定的轉換關系,而是在IP報文處理過程中由NAT模塊進行動態匹配。雖然,公網IP比私網IP地址少,但是,同時在線的私網IP需求小于等于公網IP數量,不然某些私網IP將得不到正確的轉換,從而導致網絡通信失敗。
動態NAT,有三個特征(如圖2-19所示)。
①私網與公網IP地址之間不是固定匹配轉換的,而是變化的;
②兩者之間的轉換規則不是靜態指定的,而是動態匹配的;
③私網IP地址與公網IP地址之間是m∶n,一般m < n
(3)端口多路復用/PAT
如果私網IP地址有多個,而公網IP地址只有一個,那么,靜態NAT顯然是不行了,動態NAT也基本不行(只有一個公網IP,不夠用)。此時,就需要用到端口多路復用。多個私網IP映射到同一個公網IP,不同的私網IP利用端口號進行區分,這里的端口號指的是TCP/UDP
端口號。所以端口復用又叫PAT(Port Address Translation)。
端口多路復用(PAT)的特征是(如圖2-20所示)。
①私網IP:公網IP = m∶1;
②以公網IP +端口號來區分私網IP。
(4)SNAT/DNAT
前面說的是靜態NAT(Static NAT)、動態NAT。很遺憾,不能簡稱SNAT、DNAT,因為SNAT/DNAT有另外的含義,是另外的縮寫。要區分SNAT(Source Network Address Translation,源地址轉換)與DNAT(Destination Network
Address Translation,目的地址轉換)這兩個功能可以簡單地由連接發起者是誰來區分。
①內部地址要訪問公網上的服務時(如Web訪問),內部地址會主動發起連接,由路由器或者防火墻上的網關對內部地址做個地址轉換,將內部地址的私有IP轉換為公網的公有IP,網關的這個地址轉換稱為SNAT,主要用于內部共享IP訪問外部。
②當內部需要提供對外服務時(如對外發布Web網站),外部地址發起主動連接,由路由器或者防火墻上的網關接收這個連接,然后將連接轉換到內部,此過程是由帶有公網IP的網關替代內部服務來接收外部的連接,然后在內部做地址轉換,此轉換稱為DNAT,主要用于內部服務對外發布。
2.?Netfilter中的NAT Chain
說chain有點太學究,大白話就是時刻點。通過前文介紹我們知道,NAT一共在三個時刻點對IP報文做了處理。下面我們一個一個描述。
(1)NAT-PREROUTING(DNAT)
NAT-PREROUTING(DNAT)的處理時刻點,如圖2-21所示。
IP報文流的順序是圖中的“1-2-3-4-5”,在圖2-21中A處,即PREROUTING時刻點進行NAT處理。IP報文的目的地址是IP1(公網IP),這個IP1就是Linux內核空間對外(公網)
呈現的IP地址(說明這樣的IP地址可以有多個)。當報文到達PREROUTING這個時刻點時,NAT模塊會做處理。如果需要(即提前做了相關NAT配置),NAT模塊會將目的IP從IP1
轉換成IP2(這個是提前配置好的),這也就是所謂的DNAT。
(2)NAT-POSTROUTING(SNAT)
NAT-POSTROUTING(SNAT)的處理時刻點,如圖2-22所示。
圖2-21 NAT-PREROUTING(DNAT) 圖2-22 NAT-POSTROUTING(SNAT)
IP報文流的順序是圖中的“1-2-3-4-5”,在圖中“E”處,即POSTROUTING時刻點進行NAT處理。IP報文的源地址是IP3(私網IP),這個報文最后經過POSTROUTING這個時刻點時,如果需要(即提前做了相關NAT配置),NAT模塊會做處理。NAT模塊會將源 IP從IP3轉換成IP1(這個是提前配置好的),這也就是所謂的SNAT。這個IP1就是Linux內核空間對外(公網)呈現的IP地址(說明,這樣的IP地址可以有多個)。
(3)NAT-OUTPUT(DNAT)
NAT-OUTPUT(DNAT)的處理時刻點,如圖2-23所示。
圖2-23給人一種“迷惑/詭異”的感覺,這個IP報文是誰發出來的?如果我們把Linux內核空間(Netf?ilter)
往“外”設想一下,把它想象成一個網元,比如防火墻(防火墻里可以有NAT功能),這個防火墻自己對外發送一個報文。這個報文在D處,即OUTPUT時刻點,會做一個DNAT。這樣這個報文不需要在“3”處,即POSTROUTING時刻點再做NAT,因為內核空間的IP源地址已經是公網IP,而目的地址已經在“2”處,即D處/OUTPUT時刻點已經做了DNAT。
(4)小結
Linux內核空間Netf?ilter模塊的NAT處理,一共有三個Chain(處理時刻點),如表2-5所示。
表2-5 Linux內核空間Netfilter模塊的NAT處理
OpenStack 云計算
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。