1. 程式人生 > >iptables中DNAT、SNAT和MASQUERADE的理解

iptables中DNAT、SNAT和MASQUERADE的理解

href load pos get eth0 mage 讀取 轉發 wid

DNAT(Destination Network Address Translation,目的地址轉換) 通常被叫做目的映謝。而SNAT(Source Network Address Translation,源地址轉換)通常被叫做源映謝。

這是我們在設置Linux網關或者防火墻時經常要用來的兩種方式。以前對這兩個都解釋得不太清楚,現在我在這裏解釋一下。

首先,我們要了解一下IP包的結構,如下圖所示:
技術分享
在任何一個IP數據包中,都會有Source IP Address與Destination IP Address這兩個字段,數據包所經過的路由器也是根據這兩個字段是判定數據包是由什麽地方發過來的,它要將數據包發到什麽地方去。而iptables的DNAT與SNAT就是根據這個原理,對Source IP Address與Destination IP Address進行修改。

然後,我們再看看數據包在iptables中要經過的鏈(chain):
技術分享
圖中正菱形的區域是對數據包進行判定轉發的地方。在這裏,系統會根據IP數據包中的destination ip address中的IP地址對數據包進行分發。如果destination ip adress是本機地址,數據將會被轉交給INPUT鏈。如果不是本機地址,則交給FORWARD鏈檢測。
這也就是說,我們要做的DNAT要在進入這個菱形轉發區域之前,也就是在PREROUTING鏈中做,比如我們要把訪問202.103.96.112的訪問轉發到192.168.0.112上:

iptables -t nat -A PREROUTING -d 202.103.96.112 -j DNAT --to-destination 192.168.0.112

這個轉換過程當中,其實就是將已經達到這臺Linux網關(防火墻)上的數據包上的destination ip address從202.103.96.112修改為192.168.0.112然後交給系統路由進行轉發。

而SNAT自然是要在數據包流出這臺機器之前的最後一個鏈也就是POSTROUTING鏈來進行操作

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 58.20.51.66

這個語句就是告訴系統把即將要流出本機的數據的source ip address修改成為58.20.51.66。這樣,數據包在達到目的機器以後,目的機器會將包返回到58.20.51.66也就是本機。如果不做這個操作,那麽你的數據包在傳遞的過程中,reply的包肯定會丟失。

假如當前系統用的是ADSL/3G/4G動態撥號方式,那麽每次撥號,出口IP都會改變,SNAT就會有局限性。

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

重點在那個『 MASQUERADE 』!這個設定值就是『IP偽裝成為封包出去(-o)的那塊裝置上的IP』!不管現在eth0的出口獲得了怎樣的動態ip,MASQUERADE會自動讀取eth0現在的ip地址然後做SNAT出去,這樣就實現了很好的動態SNAT地址轉換。

iptables中DNAT、SNAT和MASQUERADE的理解