1. 程式人生 > >iptables的理解問題兼及iptables配置dnat, snat

iptables的理解問題兼及iptables配置dnat, snat

iptables的netfilter框架是基於會話的,因而理解起來和單包傳送不同,和路由器的理解也不同。

參考中的文件是我剛看到的文件,我認為其配置是不太對的,其人對事情的理解是錯誤的、模糊的。

特在此寫一下我的理解

拓撲

z-xp(1.1.1.3)--(1.1.1.1)iptables(2.2.2.1)---WebServer(2.2.2.2)

配置示例

iptables -F

iptables -t nat -F

以上清空對應型別的規則表

iptables -t nat -A PREROUTING -p tcp -d 1.1.1.1 --dport 80 -j DNAT --to 2.2.2.2:80

iptables -t nat -A POSTROUTING -p tcp -d 2.2.2.2 --dport 80 -j SNAT --to 2.2.2.1

正確的原理:

客戶端1.1.1.3訪問1.1.1.1:80,iptables將資料包翻譯為發往2.2.2.2:80(PREROUTING未做路由前, DNAT),此時源IP為客戶端IP
iptables查詢路由,準備傳送(POSTROUTING,路由後,SNAT),

傳送時將這個會話(即目的地址是2.2.2.2:80的tcp會話)又做了新翻譯,
翻譯的方法是將其源地址改為2.2.2.1(埠未變),然後發出去。這個翻譯就是後面加的一條SNAT規則,

將發到webserver的資料包SNAT
因而從WebServer看收到的資料包全都是來自於2.2.2.1,這樣webServer可以直接回給2.2.2.1。

iptables裝置收到回包,由於其是基於會話的,

因而將這個回包視為與原請求包相對應的迴應報文(雖然做了2次翻譯),在發回到z-xp之前,

從z-xp角度看,迴應報文的源地址使用1.1.1.1,目的地址使用1.1.1.3。

抓包分析證明了這個理解,在webserver側抓包,

發現收到的都是2.2.2.1傳送的報文,並無來自外網IP的報文

參考:

http://www.haiyun.me/archives/iptables-dnat-public-ip.html

原文章:

Iptables實現NAT是最基本的功能,大部分家用路由都是基於其SNAT方式上網,使用Iptables實現外網DNAT也很簡單,不過經常會出現不能正常NAT的現象。
以下命令將客戶端訪問1.1.1.1的HTTP資料DNAT到2.2.2.2,很多人往往只做這一步,然後測試不能正常連線。

1 iptables -t nat -A PREROUTING -p tcp -d 1.1.1.1 --dport 80 -j DNAT --to 2.2.2.2:80

想像一下此時客戶端訪問1.1.1.1的資料流程:

1 2 3 4 客戶端訪問1.1.1.1 1.1.1.1根據Iptables DNA將資料包發往2.2.2.2,此時源IP為客戶端IP 2.2.2.2處理後根據源IP直接向客戶端返回資料,要知道此時客戶端是直接和1.1.1.1連線的 然後呢,客戶端不知所云,不能正常連線

最後還要新增一條SNAT規則,將發到2.2.2.2的資料包SNAT,1.1.1.1充當代理伺服器的角色。

1 iptables -t nat -A POSTROUTING -d 2.2.2.2 -j SNAT --to-source1.1.1.1

別忘記開啟核心轉發功能:

1 echo1 > /proc/sys/net/ipv4/ip_forward