轉自:https://www.centos.bz/2017/09/iptables中dnat、snat和masquerade的理解
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地址轉換,
c/c++ 學習互助QQ群:877684253

本人微信:xiaoshitou5854
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/102259.html
標籤:其他
