- 最近,到處看到有人問這個問題,怎么以前沒人問,現在這么多人問呢?前兩天我還在華為的論壇上仔細的說了這個問題,現在復制到這邊來。希望能幫助大家理解這個問題。
- 這是個理論問題,我們先從NAT講起:NAT有兩種基本類型,一種是SNAT(Source NAT),一種是DNAT(Dest. NAT).SNAT即源NAT是改變數據包的IP層中的源IP地址,一般是用來將不合法的IP外出請求轉換成合法的IP的外出請求,就是普通的用一個或者幾個合法IP來帶動一整個非法IP段接入。 DNAT即目的NAT,就是改變數據包的目標IP地址,使得能對數據包重新定向,可以用做負載均衡或者用於將外部的服務請求重定向到內網的非法IP的服務器上。
- 好了,羅嗦了一通,大致就是這樣了。 那么之所以會出現無法在DNAT的內部網絡通過DNAT服務的外部IP地址來訪問的情況,是因為,如果服務從內部請求,那么經過DNAT轉換后,將目標 IP改寫成內網的IP地址,譬如172.16.10.254,而請求的機器的IP是 172.16.10.100,數據包被網關172.16.10.1順利的重定向到172.16.10.254的服務端口,然后,192.16.10.254根據請求發送回應給目的IP地址,就是172.16.10.100,但是,問題出現了,因為172.16.10.100請求的地址是外部IP 假設是221.232.34.56,所以他等待着221.232.34.56的回應,而172.16.10.254的回應請求被看做是非法的,被丟棄了。這就是問題的所在了。
- 呵呵,寫的有點混亂,不好意思。不知道大家明白沒有.那么如何解決這個問題,我說個用iptables實現的例子,
- #我們先把發向外網IP221.232.34.56 80號端口的數據重定向到172.16.10.254 理論上來講,如果只要從外網訪問,這就完成了。
- iptables -t nat -A PREROUTING -p tcp -d 221.232.34.56 --dport 80 -j DNAT --to-destination 172.16.10.254
- #解決內網通過外網IP訪問的情況
- iptables -t nat -A POSTROUTING -p tcp -d 172.16.10.254 --dport 80 -j SNAT --to-source 172.16.10.1
- 我們將內網的請求強行送回到網關172.16.10.1,依靠網關在內核建立的狀態表再轉發到真實的請求地址172.16.10.100.
- 當然,這並不是最好的解決方法,最好的解決方法是將服務器放在另外一個網段,也就是說所謂的DMZ(解除武裝區),這樣就不會出現上面所說的問題了。
- 如果大家還不清楚,給個參考文檔:
- http://iptables-tutorial.frozentux.net/iptables-tutorial.html#DNATTARGET
