iptables中DNAT與SNAT的理解linux
設置Linux網關或者防火牆時的兩種方式ide
SNAT(Source Network Address Translation,源地址轉換):源映謝。post
DNAT(Destination Network Address Translation,目的地址轉換) :目的映謝。spa
首先,咱們要了解一下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上:blog
iptables -t nat -A PREROUTING -d 202.103.96.112 -j DNAT --to-destination 192.168.0.112ip
這個轉換過程中,其實就是將已經達到這臺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.66input
這個語句就是告訴系統把即將要流出本機的數據的source ip address修改爲爲58.20.51.66。這樣,數據包在達到目的機器之後,目的機器會將包返回到58.20.51.66也就是本機。若是不作這個操做,那麼你的數據包在傳遞的過程當中,reply的包確定會丟失。
在prerouting鏈裏面作不了SNAT,postrouting鏈裏面作不了DNAT。
當一個數據包進入linux系統之後,首先進入mangle表的prerouting鏈,進行某些預路由的修改(也可能不改),而後數據包進入nat表的 prerouting鏈,進行dnat之類(改變數據包的目的地址,好比咱們所說的網關,好比從外網返回的數據包並不知道是內網的哪臺機器須要這個數據包,都發給了網關的外網地址,而網關就要把這些數據包的目的地址改成正確的目的地址,而不是本身)的事情,而後進行判斷這個數據包是發給這臺計算機自身的仍是僅僅須要轉發的。若是是轉發,就發送給mangle表的FORWARD鏈,進行一些參數修改(好比tos什麼的參數)或者不修改,而後送給 filter表的forward鏈進行過濾(就是一般所說的轉發過濾規則),而後送給mangle表的postrouting鏈進行進一步的參數修改(或者不修改),而後發給nat表的postrouting鏈修改(或者不修改)源地址(好比網關這個時候會把原本發自內網ip的數據包的源地址改成本身的外網IP,這樣發送出去後,外面的主機就會覺得這是網關發出的數據包了),而後發給網卡設備發送到網上。
總結:
input —對進入本機的數據進行過濾
output —-對從本機出去的數據進行處理
forward—– 對本網段的數據進行處理
prerouting —— dnat 和 ports redirect
postrouting ——-snat 和 masquerade
iptables 其實 只有兩條chains 是對本機有用的 input 和 output
而 forwad 實際上是用來處理局域網中的數據包的(由於linux通常是用來充當網關或者是路由器的)
而 prerouting 和 postrouting 屬於nat 表,這個 —實際上是iptables的附加功能,主要是用來作翻譯的
轉自:http://blog.myhnet.cn/2009/01/12/my-understanding-about-dnat-and-snat-in-iptables/