|
DNAT(Destination Network Address Translation,目的地址轉(zhuǎn)換) 通常被叫做目的映謝。而SNAT(Source Network Address Translation,源地址轉(zhuǎn)換)通常被叫做源映謝。
這是我們在設(shè)置Linux網(wǎng)關(guān)或者防火墻時經(jīng)常要用來的兩種方式。以前對這兩個都解釋得不太清楚,現(xiàn)在我在這里解釋一下。
首先,我們要了解一下IP包的結(jié)構(gòu),如下圖所示:
![]() 在任何一個IP數(shù)據(jù)包中,都會有Source IP Address與Destination IP
Address這兩個字段,數(shù)據(jù)包所經(jīng)過的路由器也是根據(jù)這兩個字段是判定數(shù)據(jù)包是由什么地方發(fā)過來的,它要將數(shù)據(jù)包發(fā)到什么地方去。而iptables
的DNAT與SNAT就是根據(jù)這個原理,對Source IP Address與Destination IP Address進行修改。
然后,我們再看看數(shù)據(jù)包在iptables中要經(jīng)過的鏈(chain):
![]() 圖中正菱形的區(qū)域是對數(shù)據(jù)包進行判定轉(zhuǎn)發(fā)的地方。在這里,系統(tǒng)會根據(jù)IP數(shù)據(jù)包中的destination ip
address中的IP地址對數(shù)據(jù)包進行分發(fā)。如果destination ip
adress是本機地址,數(shù)據(jù)將會被轉(zhuǎn)交給INPUT鏈。如果不是本機地址,則交給FORWARD鏈檢測。
這也就是說,我們要做的DNAT要在進入這個菱形轉(zhuǎn)發(fā)區(qū)域之前,也就是在PREROUTING鏈中做,比如我們要把訪問202.103.96.112的訪問轉(zhuǎn)發(fā)到192.168.0.112上: iptables -t nat -A PREROUTING -d 202.103.96.112 -j DNAT --to-destination 192.168.0.112
這個轉(zhuǎn)換過程當(dāng)中,其實就是將已經(jīng)達到這臺Linux網(wǎng)關(guān)(防火墻)上的數(shù)據(jù)包上的destination ip address從202.103.96.112修改為192.168.0.112然后交給系統(tǒng)路由進行轉(zhuǎn)發(fā)。
而SNAT自然是要在數(shù)據(jù)包流出這臺機器之前的最后一個鏈也就是POSTROUTING鏈來進行操作
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 58.20.51.66
這個語句就是告訴系統(tǒng)把即將要流出本機的數(shù)據(jù)的source ip
address修改成為58.20.51.66。這樣,數(shù)據(jù)包在達到目的機器以后,目的機器會將包返回到58.20.51.66也就是本機。如果不做這個
操作,那么你的數(shù)據(jù)包在傳遞的過程中,reply的包肯定會丟失。
|
|
|