DNAT(Destination Network Address Translation,目的地址轉換) 一般被叫作目的映謝。而SNAT(Source Network Address Translation,源地址轉換)一般被叫作源映謝。shell
這是咱們在設置Linux網關或者防火牆時常常要用來的兩種方式。之前對這兩個都解釋得不太清楚,如今我在這裏解釋一下 。centos
首先,咱們要了解一下IP包的結構,以下圖所示:微信
在任何一個IP數據包中,都會有Source IP Address與Destination IP Address這兩個字段,數據包所通過的路由器也是根據這兩個字段是斷定數據包是由什麼地方發過來的,它要將數據包發到什麼地方去。而iptables的DNAT與SNAT就是根據這個原理,對Source IP Address與Destination IP Address進行修改。學習
而後,咱們再看看數據包在iptables中要通過的鏈(chain):code
圖中正菱形的區域是對數據包進行斷定轉發的地方。在這裏,系統會根據IP數據包中的destination ip address中的IP地址對數據包進行分發。若是destination ip adress是本機地址,數據將會被轉交給INPUT鏈。若是不是本機地址,則交給FORWARD鏈檢測。blog
這也就是說,咱們要作的DNAT要在進入這個菱形轉發區域以前,也就是在PREROUTING鏈中作,好比咱們要把訪問202.103.96.112的訪問轉發到192.168.0.112上:ip
# 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鏈來進行操做get
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地址轉換。