iptables配置——NAT地址轉換

iptables nat 原理
同filter表同樣,nat表也有三條缺省的"鏈"(chains):
linux

  •     PREROUTING:目的DNAT規則

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

  •     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)
app

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
tcp

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 你的eth0地址

            
    多個內網段SNAT,就是多條SNAT語句便可
spa

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)
server

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:9000

後來發現原來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

一段連續的地址,這樣能夠實現負載平衡。每一個流會被隨機分配一個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:9000
/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.24iptables -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地址 

相關文章
相關標籤/搜索