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為客戶端IPiptables查詢路由,準備傳送(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- source 1.1.1.1
|
別忘記開啟核心轉發功能:
1 |
echo 1
> /proc/sys/net/ipv4/ip_forward
|