DNAT & SNAT

轉載地址:http://blog.tangjianwei.com/2009/01/12/my-understanding-about-dnat-and-snat-in-iptables/

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

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

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

然後,我們再看看數據包在iptables中要經過的鏈(chain):
netfilter_packet_flow
圖中正菱形的區域是對數據包進行判定轉發的地方。在這裏,系統會根據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的包肯定會丟失。


發佈了42 篇原創文章 · 獲贊 9 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章