iptable埠重定向 MASQUERADE

tycoon1988發表於2014-11-04

首先簡述下NAT伺服器在負載均衡中做了什麼,簡單的說就是Linux (核心2.4以後是Netfilter肩負起這個使命滴)核心緩衝區修改來源,目標地址。

但是,由於Netfilter工作在Linux 核心我們無法直接操作它,所以Linux提供了iptables。


用iptables實現:

說到iptables目前最多應用在防火牆了,我們公司的所有的伺服器都配置了iptables防火牆,比如

它完成的是,告訴核心當前伺服器只允許外部通過TCP訪問80埠。

另外iptables還可以實現埠重定向,比如

它將外部訪問80埠轉發到8000埠。

因為某些原因需要把訪問10.0.3.49上的httpd服務重定向到10.0.3.26上.所以研究了一下用iptables的NAT實現IP與埠的重定向,其實很簡單,只需要兩步。

1,首先需要確保linux伺服器10.0.3.49開啟了資料轉發功能:

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

2.10.0.3.49做NAT的ip和埠80的重定向。

iptables -t nat -A PREROUTING -p tcp --dport 80 -d 10.0.3.49 -j DNAT --to 10.0.3.26:80

iptables -t nat -A POSTROUTING -d 10.0.3.26 -p tcp --dport 80 -j SNAT --to 10.0.3.49:80

iptables -A FORWARD -d 10.0.3.26 -j ACCEPT

iptables NAT規則

nat表需要的三個鏈:

  1.PREROUTING:可以在這裡定義進行目的NAT的規則,因為路由器進行路由時只檢查資料包的目的ip地址,所以為了使資料包得以正確路由,我們必須在路由之前就進行目的NAT;
  2.POSTROUTING:可以在這裡定義進行源NAT的規則,系統在決定了資料包的路由以後在執行該鏈中的規則。
  3.OUTPUT:定義對本地產生的資料包的目的NAT規則。

需要用到的幾個動作選項:(真實環境中用大寫)

 redirect  將資料包重定向到另一臺主機的某個埠,通常用實現透明代理和對外開放內網某些服務。
snat 源地址轉換,改變資料包的源地址
dnat 目的地址轉換,改變資料包的目的地址
masquerade IP偽裝,只適用於ADSL等動態撥號上網的IP偽裝,如果主機IP是靜態分配的,就用snat

PRERROUTING:DNAT 、REDIRECT   (路由之前)只支援-i,不支援-o。在作出路由之前,對目的地址進行修改

 POSTROUTING:SNAT、MASQUERADE (路由之後)只支援-o,不支援-i。在作出路由之後,對源地址進行修改

 OUTPUT:DNAT 、REDIRECT   (本機)DNAT和REDIRECT規則用來處理來自NAT主機本身生成的出站資料包.

一、開啟核心的路由功能。

   要實現nat,要將檔案/proc/sys/net/ipv4/ip_forward內的值改為1,(預設是0)。

 

二、nat不同動作的配置

 1)MASQUERADE:是動態分配ip時用的IP偽裝:在nat表的POSTROUTING鏈加入一條規則:所有從ppp0口送出的包會被偽裝(MASQUERADE)

 [root@localhost]# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

要想系統啟動時自動實現nat,在/etc/rc.d/rc.local檔案的末尾新增

   [root@localhost]# echo "1">/proc/sys/net/ipv4/ip_forward

   [root@localhost]# /sbin/iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

 2) SNAT:一般正常共享上網都用的這個。

 所有從eth0(外網路卡)出來的資料包的源地址改成61.99.28.1(這裡指定了一個網段,一般可以不指定)

 [root@localhost]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 61.99.28.1

3)DNAT:目的nat 做智慧DNS時會用到

 智慧DNS:就是客戶端在dns項裡無論輸入任何ip,都會給他定向到伺服器指定的一個dnsip上去。

 在路由之前所有從eth0(內網路卡)進入的目的埠為53的資料包,都傳送到1.2.3.4這臺伺服器解析。

 [root@localhost]# iptables -t nat -I PREROUTING -i eth0 -p udp --dport 53 -j DNAT --to-destination 1.2.3.4:53

 [root@localhost]# iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 53 -j DNAT --to-destination 1.2.3.4:53

4)REDIRECT:重定向,這個在squid透明代理時肯定要用到它

 所有從eth1進入的請求80和82埠的資料,被轉發到80埠,由squid處理。

 [root@localhost]# iptables -t nat -A PREROUTING - -i eth1 -p tcp -m multiport --dports 80,82 -j REDIRECT --to-ports 80


問題

  iptablessnat和MASQUERADE的區別

  解決方案

  iptables中可以靈活的做各種網路地址轉換(NAT)

  網路地址轉換主要有兩種:snatDNAT

  snat是source network address translation的縮寫

  即源地址目標轉換

  比如,多個PC機使用ADSL路由器共享上網

  每個PC機都配置了內網IP

  PC機訪問外部網路的時候,路由器將資料包的報頭中的源地址替換成路由器的ip

  當外部網路的伺服器比如網站web伺服器接到訪問請求的時候

  他的日誌記錄下來的是路由器的ip地址,而不是PC機的內網ip

  這是因為,這個伺服器收到的資料包的報頭裡邊的“源地址”,已經被替換了

  所以叫做snat,基於源地址的地址轉換

  DNAT是destination network address translation的縮寫

  即目標網路地址轉換

  典型的應用是,有個web伺服器放在內網配置內網ip,前端有個防火牆配置公網ip

  網際網路上的訪問者使用公網ip來訪問這個網站

  當訪問的時候,客戶端發出一個資料包

  這個資料包的報頭裡邊,目標地址寫的是防火牆的公網ip

  防火牆會把這個資料包的報頭改寫一次,將目標地址改寫成web伺服器的內網ip

  然後再把這個資料包傳送到內網的web伺服器

  這樣,資料包就穿透了防火牆,並從公網ip變成了一個對內網地址的訪問了

  即DNAT,基於目標的網路地址轉換

  MASQUERADE,地址偽裝,在iptables中有著和snat相近的效果,但也有一些區別

  但使用snat的時候,出口ip的地址範圍可以是一個,也可以是多個,例如:

  如下命令表示把所有10.8.0.0網段的資料包snat成192.168.5.3的ip然後發出去

  iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j snat --to-source 192.168.5.3

  如下命令表示把所有10.8.0.0網段的資料包snat成192.168.5.3/192.168.5.4/192.168.5.5等幾個ip然後發出去

  iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j snat --to-source 192.168.5.3-192.168.5.5

  這就是snat的使用方法,即可以NAT成一個地址,也可以NAT成多個地址

  但是,對於snat,不管是幾個地址,必須明確的指定要snat的ip

  假如當前系統用的是ADSL動態撥號方式,那麼每次撥號,出口ip192.168.5.3都會改變

  而且改變的幅度很大,不一定是192.168.5.3到192.168.5.5範圍內的地址

  這個時候如果按照現在的方式來配置iptables就會出現問題了

  因為每次撥號後,伺服器地址都會變化,而iptables規則內的ip是不會隨著自動變化的

  每次地址變化後都必須手工修改一次iptables,把規則裡邊的固定ip改成新的ip

  這樣是非常不好用的

  MASQUERADE就是針對這種場景而設計的,他的作用是,從伺服器的網路卡上,自動獲取當前ip地址來做NAT

  比如下邊的命令:

  iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE

  如此配置的話,不用指定snat的目標ip了

  不管現在eth0的出口獲得了怎樣的動態ip,MASQUERADE會自動讀取eth0現在的ip地址然後做snat出去

  這樣就實現了很好的動態snat地址轉換



相關文章