1. 程式人生 > >【Linux 驅動】Netfilter/iptables (八) Netfilter的NAT機制

【Linux 驅動】Netfilter/iptables (八) Netfilter的NAT機制

問題: int eas for 數量 linux 提高 markdown 網絡安全

NAT是Network Address Translation的縮寫,意即“網絡地址轉換”。

從本質上來說,是通過改動IP數據首部中的地址,以實現將一個地址轉換成還有一個地址的技術。

當然在某種情況下。改動的不僅僅是IP首部的來源或目的地址。還包含其他要素。
隨著接入Internet的計算機數量不斷猛增。IP地址資源也就愈加顯得捉襟見肘。這也是Ipv6出現的一大原因。

我們如今全部的IP地址是32位,意味著其代表的主機數量是有限的(2^32 ~= 42億)。實際是不夠用的(計算機、路由器、網絡設備,PDA、無線網絡電話等等都要占用IP地址)。

當初劃分IP時。各保留一段私有IP區間。

私網IP(私有IP)是指這些IP僅僅能在企業內部使用,而無法應用在因特網上,簡而言之,就是私有IP不能直接與Internet進行互相通信。

眼下NAT技術很多其他地被使用在將一個私網IP地址網段。轉換為一個或幾個公網IP地址,以實現私網與Internet的互相通訊。


Internet上的路由器如果看到這些私有IP的數據包,就會將其丟棄。

我們先來通過一個樣例解釋下這個問題:
在下圖中,我們在192.168.0.0/24這個私有ip與10.0.1.0/24這個公有ip加了個路由器。如果10.0.1.200是公網ip。

技術分享

首先。192.168.0.1的這臺主機嘗試訪問Internet上的1.2.3.4這臺主機。因此。192.168.0.1主機會發送一個請求數據包給默認網關,這個數據包的源ip和目的ip如圖中標記的1所看到的,來源ip是192.168.0.1,目的ip是1.2.3.4,因為是路由器的緣故,這個數據包的源ip和目的ip地址都不會發生改變,接著,路由器會轉發這個數據包給1.2.3.4主機,當1.2.3.4主機收到請求數據包後,其源ip和目的ip如3所看到的。然後,1.2.3.4主機響應請求,回送一個數據包給192.168.0.1,可是該數據包中的目的ip是192.168.0.1。是一個私有ip。因此這個數據包不可能被回送給192.168.0.1,也就不能進行正常通信。

為了提高Internet上數據包的傳輸效率,Internet上的路由器通常不檢查數據包中的“來源IP”,而僅僅會看目的端的IP,所以私有IP的主機能夠發出請求,可是得不到回應。

這個問題的解決的方法就落到了我們今天要介紹的NAT機制上。僅僅要通過NAT的機制。就能夠讓成千上萬臺計算機同一時候通過一個公網IP來連接Internet。

以下我們大致介紹下NAT原理:

技術分享

與上面路由器的差別在於,我們多個個NAT機制,NAT主機將這個數據包內的“來源IP”改成NAT主機上的公網IP(10.0.1.200)。如標記2所看到的,這樣一來,該數據包的源ip和目的ip都變成了公有IP,同一時候。NAT主機會將這個數據包的信息記錄起來。接下來。這個數據包發送到了1.2.3.4。該主機響應,發回響應數據報的時候。這個數據包的目的ip成了10.0.1.200這個公網ip。而不是192.168.0.1這個私有ip,這樣該數據包就能夠順利的到達NAT主機,然後NAT主機依據之前記錄下來的信息中找到當初NAT主機關於這個的轉換記錄,再轉回來,該數據包的目的IP就成了真正的目的主機192.168.0.1這個私有ip。但此時已經不是在Internet上了,所以這個數據包是能夠通過NAT主機回送給我們的私有IP主機的。

這樣一來,通過NAT機制,就成功實現了私有IP通過NAT主機去訪問Internet上的資源。

除此之外,NAT機制應用在client,能夠隱藏client的IP。由此達到保護client主機免於Internet的攻擊行為。以及節省公用IP的使用量。應用在server端,則能夠保護server端主機在Internet上的安全。

(須要知道,其實。單靠NAT機制並非萬能的。)

對於NAT,有兩個名字須要了解:那就是SNAT和DNAT,依據上面的分析以及這個名字,我們非常easy得知。SNAT就是變更Source IP的機制。DNAT就是變更 Destination IP的機制。

NAT種類繁多。有一對一、多對多、一對多和NATP等四種。

從以下這張圖能夠看出,NAT機制出如今PREROUTING、OUTPUT和POSTROUTING這三個chain中

技術分享

以下以下圖NAT的結構為例。介紹NAT的完整結構,並解釋每一個鏈的用途。

技術分享

1、 PREROUTING
該鏈的位置在整個NAT機制的最前面,該鏈的功能在於運行DNAT的任務。因此在運行DNAT時,差點兒是數據包一旦進入NAT機制,數據包內的 “Destination IP” 即被改動,而這個順序問題在整個防火墻的設置上是非常重要的。
2、POSTROUTING
該鏈的任務是改動數據包內的“來源端IP”。也就是說。該鏈的功能用於運行SNAT的任務。該鏈位於整個NAT機制的最末端,因此當我們運行SNAT操作時,Source IP是在整個NAT機制的最末端才會被改動的。


3、OUTPUT
當本機進程生成數據包並向外發送時,這個數據包會先交給路由表來判決路由,接著數據包進入OUTPUT鏈,最後進入POSTROUTING鏈,然後離開本機。這個數據包是不可能經過PREROUTING鏈,前面說到PREROUTING鏈的功能是運行DNAT的任務。也就是改動目的端IP,所以由本機進程生成的數據包,須要通過OUTPUT鏈,而這個OUTPUT鏈的功能就是運行DNAT的任務

所以對於本機進程生成的數據包的DNAT規則是要放在OUTPUT鏈之內,而不是PREROUTING中。

關於NAT機制的分類。我們這裏就不贅述了。後面我們將深入到Netfilter 源代碼內部探索SNAT機制和DNAT機制。

參考資料:
《Linux網絡安全技術與實現》

【Linux 驅動】Netfilter/iptables (八) Netfilter的NAT機制