iptables配置——NAT地址轉換

來源:互聯網
上載者:User

標籤:des   io   os   ar   for   資料   sp   on   c   

iptables nat 原理
同filter表一樣,nat表也有三條預設的"鏈"(chains):

  • PREROUTING:目的DNAT規則

把從外來的訪問重新導向到其他的機子上,比如內部SERVER,或者DMZ。
因為路由時只檢查資料包的目的ip地址,所以必須在路由之前就進行目的PREROUTING DNAT;
系統先PREROUTING DNAT翻譯——>再過濾(FORWARD)——>最後路由。
路由和過濾(FORWARD)中match 的目的地址,都是針對被PREROUTING DNAT之後的。

  • POSTROUTING:源SNAT規則

在路由以後在執行該鏈中的規則。
系統先路由——>再過濾(FORWARD)——>最後才進行POSTROUTING SNAT地址翻譯
其match 源地址是翻譯前的。

  • OUTPUT:定義對本地產生的資料包的目的NAT規則



========================內網訪問外網 -J SNAT============================

-j SNAT
-j SNAT:源網路位址轉譯,SNAT就是重寫包的源IP地址
SNAT 只能用在nat表的POSTROUTING鏈裡
only valid in the nat table, in the POSTROUTING chain.

-j SNAT --to-source ipaddr[-ipaddr][:port-port]
ipaddr:

  • a single new source IP address
  • range of IP addresses
  • or you can add several --to-source options. a simple round-robin takes place between these adresses.

port range(only valid if the rule also specifies -p tcp or -p udp)
If no port range is specified, then source ports below 512 will be
mapped to other ports below 512


-j MASQUERADE
用於外網口public地址是DHCP動態擷取的(如ADSL)
iptables -t nat -A POSTROUTING –o eth1 –s 192.168.1.0/24 –j MASQUERADE
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE 

MASQUERADE --to-ports port[-port]
only valid if the rule also specifies -p tcp or -p udp.


固定public 地址(外網介面地址)的最基本內訪外SNAT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 你的eth0地址 

多個內網段SNAT,就是多條SNAT語句即可
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE 

非外網口地址為NAT用,必須先要綁定到介面上,如eth0 :1,eth0 :2




================================外網訪問內網 –J DNAT===========================


DNAT
only valid in PREROUTING
--to-destination ipaddr[-ipaddr][:port-port]
DNAT:目的網路位址轉譯,重寫包的目的IP地址

典型的DNAT的例子
外部介面ip:210.83.2.206
內部介面ip:192.168.1.1

ftp伺服器 : ip 192.168.1.3
web伺服器 : ip 192.168.1.4 iptables -t nat -A PREROUTING -d 210.83.2.206 -p tcp --dport 21 -j DNAT --to 192.168.1.3
iptables -t nat -A PREROUTING -d 210.83.2.206 -p tcp --dport 80 -j DNAT --to 192.168.1.4 


DNAT靜態映射
IPTABLES沒有CISCO那種static map


DNAT用於內部SERVER的load-balance(即CISCO的rotery)
iptables –t nat –A PREROUTING –d 219.142.217.161 –j DNAT --to-destination 192.168.1.24-192.168.1.25 

DNAT 帶連接埠映射(改變SERVER的連接埠)
一個FTP SERVER從內部192.168.100.125:21映射到216.94.87.37:2121的例子
iptables -t nat -A PREROUTING -p tcp -d 216.94.87.37 --dport 2121 -j DNAT --to-destination 192.168.100.125:21 通常外網DNAT訪問內網SERVER,內網SERV ER回包的源地址是經過另一個單獨的SNAT進程的。而不屬於DNAT STATIC進程的一部分。
這樣對於P-t-P的網路應用,就必須另設一個和DNAT相適應的SNAT。
對於穿過NAT,被NAT映射改變連接埠號碼的應用,也必須用一個單獨的SNAT對回包的連接埠進行映射
iptables -t nat -A POSTROUTING -p tcp -s 192.168.100.125 --sport 21 -j SNAT --to-source 216.94.87.37:2121 不這樣做的話,FTP SERVER會返回21到外網的客戶機,外網使用者發出一個to 2121的FTP request,收到一個from 21的,會不認
上面的好象不必,做過實驗了:
/sbin/iptables -t nat -A POSTROUTING -s 10.4.0.0/16 -o $WAN_INT -j SNAT --to 124.126.86.137
/sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp --dport 2022 -j DNAT --to-destination 10.4.3.150:22 

DNAT照樣要做RULE,DNAT只是翻譯,仍要做ACCEPT。(而且注意是FORWARD,不是INPUT)
/sbin/iptables -A FORWARD -i $WAN_INT -m state --state NEW -p tcp --dport 9000 -j ACCEPT
/sbin/iptables -A FORWARD -i $WAN_INT -m state --state NEW -p tcp --dport 9001 -j ACCEPT
/sbin/iptables -A FORWARD -i $WAN_INT -m state --state NEW -p tcp --dport 22 -j ACCEPT

##########NAT CHAIN###############
/sbin/iptables -t nat -A POSTROUTING -s 10.4.0.0/16 -o $WAN_INT -j SNAT --to 124.126.86.137
/sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp --dport 2022 -j DNAT --to-destination 10.4.3.150:22
/sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp --dport 9001 -j DNAT --to-destination 10.4.3.150:9001
/sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp --dport 9000 -j DNAT --to-destination 10.4.3.150:9000


DNAT的FORWARD RULE總是出錯,原來:DNAT RULE是在PREROUTING語句之後執行的,即DNAT RULE要match翻譯過來的新介面號
一開始按翻譯前的原始介面做RULE,發覺9000和9001都通過,但2022總通不過
/sbin/iptables -A FORWARD -i $WAN_INT -m state --state NEW -p tcp --dport 9000 -j ACCEPT
/sbin/iptables -A FORWARD -i $WAN_INT -m state --state NEW -p tcp --dport 9001 -j ACCEPT
/sbin/iptables -A FORWARD -i $WAN_INT -m state --state NEW -p tcp --dport 2022 -j ACCEPT

##########NAT CHAIN###############
/sbin/iptables -t nat -A POSTROUTING -s 10.4.0.0/16 -o $WAN_INT -j SNAT --to 124.126.86.137
/sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp --dport 2022 -j DNAT --to-destination 10.4.3.150:22
/sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp --dport 9001 -j DNAT --to-destination 10.4.3.150:9001
/sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp --dport 9000 -j DNAT --to-destination 10.4.3.150:900 後來發現原來9000和9001都是連接埠不變的翻譯,只有2022是由2022到22的翻譯。
而FORWARD是在PREROUTING執行後執行的,此時2022已經被翻譯成22了,當然不匹配2022那個rule了
改正:
/sbin/iptables -A FORWARD -i $WAN_INT -m state --state NEW -p tcp --dport 9000 -j ACCEPT
/sbin/iptables -A FORWARD -i $WAN_INT -m state --state NEW -p tcp --dport 9001 -j ACCEPT
/sbin/iptables -A FORWARD -i $WAN_INT -m state --state NEW -p tcp --dport 22 -j ACCEPT 



==============================NAT troubleshooting===================================

-i ,-o 參數在NAT中的用途
對於PREROUTING鏈,只能用-i,通常是外網口
對於POSTROUTING和OUTPUT,只能用-o,通常也是外網口

linux iptables通常都用外網口地址做NAT public地址
用非外網口的同網段地址做DNAT public地址,失敗
失敗原因是,非外網口地址為DNAT用,必須要綁定到介面上,如eth0 :1,eth0 :2

連續public 地址SNAT (也要先綁定到子介面上eth0:x)
iptables –t nat –A POSTROUTING –s 192.168.1.0 –j SNAT --to-source 219.142.217.161-219.142.217.166 一段連續的地址,這樣可以實現Server Load Balancer。每個流會被隨機分配一個IP。


不存在所謂的PAT。理由:沒有PAT相關的RFC
PAT是CISCO自己的概念

Linux實現的就是完整的NAT和NAPT(可以進行連接埠替換,參見RFC3022)
但是連接埠並沒有bind到本地協議棧上。所以不受本地連接埠資源65535的限制。

源連接埠必須>1024
iptables –t nat –A POSTROUTING -p tcp,udp –s 192.168.1.0 –j SNAT --to-source 219.142.217.161:1024-32000 這樣包的源連接埠就被限制在1024-32000了


連接埠轉換限定
iptables –A POSTROUTING –o eth1 –s 192.168.1.0/24 –j MASQUERADE --to-ports 1024-30000 只轉換1024以上低於30000的源連接埠

對於”內網訪問內網SERVER在外網的地址”的特殊處理
o 網內客戶機10.4.3.119發起一個訪問請求給映射後的地址124.126.86.138(10.4.3.150)
o 防火牆收到這個向124.126.86.138請求後根據策略表匹配發現是一個對內部伺服器10.4.3.150映射,防火牆會通過純路由的方式將資料包轉寄給伺服器 10.4.3.150
o 伺服器10.4.3.150收到請求後,發現源地址為10.4.3.119的客戶機發來了一個請求,並且這台主機與自己在同一個網段內,於是直接將回應包SYN+ACK發送給主機10.4.3.119(就不再經過FW)
o 10.4.3.119收到這個包後會感覺很奇怪,因為它從來就沒有給10.4.3.150發送過串連請求報文(他只給124.126.86.138)發送過,所以就會將回應報文丟棄
解決:增加一個朝向內部網10.4.3.150訪問的POSTROUTING SNAT
/sbin/iptables -t nat -A POSTROUTING -s 10.4.0.0/16 -o $WAN_INT -j SNAT --to 124.126.86.137
/sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp --dport 2022 -j DNAT --to-destination 10.4.3.150:22
/sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp --dport 9001 -j DNAT --to-destination 10.4.3.150:9001
/sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp --dport 9000 -j DNAT --to-destination 10.4.3.150:900 /sbin/iptables -t nat -A POSTROUTING -d 10.4.3.150 -j SNAT --to 10.4.0.198
把發往內部server ip 10.4.3.150的包的源地址改成FW內網口地址10.4.0.198
這樣就能從內部訪問內部SERVER的外部地址 


上例的另一種情況:禁止server在內網訪問他自己在外網的公有地址
iptables -t nat -A PREROUTING -d 219.142.217.161 -j DNAT --to 192.168.1.24
iptables -t nat -A PREROUTING -d 210.83.2.206 -s ! 192.168.1.24 -p tcp --dport 21 -j DNAT --to 192.168.1.24
-s !內網SERVER地址 DNAT --to 內網server地址

iptables配置——NAT地址轉換

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.