2013年6月25日

[IIS]用ARR將http://www.domain.com/sub1的要求轉給另一個IIS Server來處理

遇到一個需求,客戶希望自己架一個multi-tenant的環境,把不同sub domain的http request交給不同的server負責。例如,假設客戶瀏覽http://www.mydomain.com/michisvr1,則把request轉給內網的另一台sub1-server處理。

當然我們可以自己寫程式來處理這樣的需求,不過,也可以透過ARR來協助處理。

假設我有三台Server,一台做Front-End(Server-Front),另兩台分別是michisvr1與michisvr2,各負責sub domain 1 (michisvr1)與sub domain 2(michisvr2)的需求。

那麼我們會需要再Server-Front上安裝ARR,並且設定兩個server farm分別對應到sub domain 1與sub domain 2的需求。將兩台Server分別加入各自的server farm後,透過設定routing rule來將request route到不同的server farm來處理。

首先下載透過Web Platform Installer下載並安裝Application Request Routing。

image

我的方式是,為每一個sub domain建立一個Server Farm,然後透過判斷Request URL,如果是www.mydomain.com/michisvr1,就把需求轉給負責處理michisvr1這個sub domain的server farm。

當然一定還有其他的做法,這個方法只是為了驗證可行的一個簡單的PoC。

安裝完成後打開IIS Manager,建立Server Farm,給予一個簡單的名稱,由於我想利用naming conversion的方式來做routing,因此這裡的名稱要設定為michisvr1以配合我的sub domain名稱。

image

然後將負責sub domain的server加入server farm,如果有很多台server就一直加下去。

image

重複這個步驟,直到所有的Server Farm建立完成。

image

接著要來設定Routing Rule;所謂的routing rule,也就是當HTTP request符合某個規則時,針對這個request做一些動作,可能是redirect到其他server或是把request丟給server farm等等。

點選IIS manager上的本機Server,然後double click “URL Rewrite”

image

新增一個空白的規則。

image

在URL的地方指定Requested URL要”Matches the pattern”,然後指定要使用Regular Expression或擇其他的方式;在Pattern的地方輸入”.*”表示任何URL。

image

接著輸入Conditions,因為我想要的方式是,如果客戶要求http://www.mydomain.com/michisvr1,就把需求轉給michisvr1這個server farm處理;亦即,我是看”michisvr1”這個字串來決定我要把request轉給哪個server farm的;因此在這邊,我要指定,當{PATH_INFO}符合^/michisvr1/(.*)?這樣的規則時,就把request轉給michisvr1處理。

^/michisvr1/(.*)?是一組Regular Expression,詳細的說明網路上都可以查到,這裡就不多做說明了。

image

最後,當以上條件符合時,設定Action為把需求route到Server Farm。其中Path的部分設定為{C:0}。如果客戶要求的URL是http://www.mydomain.com/michisvr1/test.htm,{C:0}就是michisvr1/test.htm;套用到以下的設定,會把需求轉給http://[michisvr1這個Server Farm裡的任一台Server]/michisvr1/test.htm。

image

設定完成後按下右上角的Apply完成設定。

重複以上步驟設定完michisvr2的規則。

image

ARR的設定到此就完成了,接著我們要設定michisvr1與michisvr2這兩台IIS Server。

由於需求會被轉到各伺服器的[WWWROOT]/michisvr1或是[WWWROOT]/michisvr2,因此要在個別的IIS上將相對應的Virtual Directory或Application設定好。

image

設定完成後就可以了。

2013年6月24日

[Azure]Azure Site-to-Site VPN - 2

上次建立完Site-to-Site VPN後,心裡總覺得這也太複雜了點,應該有比較簡單的方式才對…

果然,上一次我所建立的方式,是把RRAS Server當成VPN Server來用,由Windows Azure Virtual Network Gateway與RRAS建立VPN Tunnel後,on-prem的Client端透過VPN先連到RRAS,再透過VPN Tunnel連到Windows Azure VNet。

比較簡單的方式,是把RRAS當成Router來用。

首先到Windows Azure Portal上建立Local Network與Virtual Network,並設定Site-to-Site VPN。

image

image

建立Dynamic Route Gateway

image

建立完成後,下載VPN Device Script

image

修改Script內的變數為實際資料後,到RRAS Server上執行這個powershell;接著一樣要記得開啟防火牆,允許IKE v2所需要的Port跟Protocol。

image

然後回到Windows Azure Portal,按下連線。

image

立刻就成功地建立Tunnel了…那我之前搞那麼久到底是為什麼啊你說說看!?

image

回到on-prem的機器上,記住,在Windows Azure Local Network中,我所設定的Local Network的Address space是10.10.11.X,因此我在本地的VM也必須在這個網段

修改網路設定,把default gateway指定到10.10.11.1,也就是RRAS Server的Local IP Address,

特別注意Subnet mask也要符合Windows Azure Local Network上的設定。

image

然後測試一下,可以從Azure裡的VM Ping到On-Prem的機器;

image

在on-prem也ping得到Azure裡的VM了!

image

2013年6月19日

[Azure]設定Site to Site VPN

Windows Azure Virtual Network支援Windows Server 2012 RRAS作為on-prem VPN Server,這讓沒有錢買VPN設備的我們提供了一個非常方便的開發或測試的環境。

要設定Windows Azure Site-to-Site VPN,首先我們需要兩台local的機器,其中一台要作為RRAS Server,這台機器必須不在NAT,並且必須要有public IP。另外一台機器作為虛擬的內網機器,只需要有可以跟RRAS Server連線的內網網路連線就可以了。

機器 IP位址
RRAS 10.10.10.1/124.124.X.X (public ip)
Client 10.10.10.2

首先我們要先在RRAS Server上安裝RRAS服務,打開Server Manager,新增角色

image

這裡基本上就一直下一步就可以了

image

安裝完成後,其實還需要做一些設定,不過我在實作時因為想說Windows Azure Portal上可以下載設定檔的template,裡面應該有設定的Script,於是安裝完後就放著。(事實證明並不是這樣,也因為這樣繞了許多路)

接著,我們需要設定防火牆。Windows Azure VPN走的是IKE v2,因此需要開啟幾個port的Inbound rule,詳細的port在這裡,這邊就不截圖了,比較要注意的是其中一個規則是protocol 50。

IP Protocol Type=UDP, UDP Port Number=500
IP Protocol Type=UDP, UDP Port Number=4500
IP Protocol Type=ESP (value 50)

設定完防火牆,接著回到Windows Azure管理網站的Virtual Network,開始建立Virtual Network。

image

首先設定我的Local Network,

指定VPN Device的IP位址,也就我們RRAS Server的Public IP。

image

我希望我的本地網路的網段是10.10.11.X

image

按下確定完成建置,接著開始建立Virtual Network。

image

設定名稱、資料中心等

image

如果要指定DNS可以在這裡指定,另外本地網路需要設定為剛剛建置完成的Local Network。

image

設定Windows Azure上的機器的Subnet以及Gateway Subnet間。Gateway Subnet是另外加的,記得一定要點那個Add Gateway subnet的按鈕就可以了。Gateway Subnet至少需要三個位址,所以一定要預留。

image

這樣我們就設定完成了,接下來要建立Gateway,這個過程會需要一段時間,所以我們可以先把VPN Script下載下來研究一下。

image

選擇Server 2012 RRAS

image

接著就可以建立Gateway了,因為是使用RRAS,一定要選Dynamic Route;根據MSDN,只要情況允許,建議都是用Dynamic Routing。

image

建立完成後,就可以開始來修改VPN Script了,打開剛剛下載的VPNDeviceScript.cfg,會發現其實他是一個Powershell指定檔。裡面會看到類似<SP_AzureNetworkCIDR>這樣的變數,我們要做的,就是用真的資料來取代這些變數。

  • 將<SP_AzureGatewayIpAddress>取代為Gateway IP Address

image

  • 將<SP_AzureNetworkCIDR>取代為Windows Azure VNet的Address space。

image

  • 將<SP_AzureNetworkMetric>取代為Metric,例如1。
  • 將<SP_PresharedKey>取代為Shared Key

image

接著把這個檔案rename成.ps1,copy到RRAS Server上,開啟powershell並執行他。

由於Script中會去安裝Remote Access的腳色,但是因為我一開始就安裝過了,所以這裡會報錯誤,可以忽略他。

image

如此一來就大功告成了嗎?…當然不是…

到目前為止,我們主要都是在設定Windows Azure與RRAS的連線而已;我們指定了Windows Azure VNet與Local Network、設定Azure要透過哪個VPN Device根本地網路連線,並且也安裝RRAS。

接下來我們來要設定RRAS,讓使用者可以透過他跟Azure上的機器透過VPN溝通,

回到RRAS Server上,建立一個使用者testremot,並且允許Dial-In

image

同時為了避免不必要的困擾,修改一下密碼永不過期與無須變更。

image

接著,打開Routing and Remote Access。點選Server Name、右鍵、Property。

image

確定IP v4 Remote server有打勾

image

切到IP v4頁簽,設定要指派給Local Network中的機器的DHCP位址範圍,這個位址必須與Azure上設定的Local Network位址一致,以我的例子來說,是10.10.11.0~10.10.11.255

image

點選Ports、右鍵、Property

image

點選相對應的Port,然後按Configure;由於Windows Azure走IKE v2,這邊理論上應該只需要設定IKE V2的Port,不過我是都設定了。

image

確定Remote access connections(Inbound only)有打勾

image

全部都設定完成後,回到Azure Portal上啟用本地網路連線;

image

過一會我們應該會看到連線成功。

image

在RRAS上,Interface也已經連線了。

image

到了這裡,大功已經快要告成了!!

回到10.10.10.2這台機器上,現在我們要設定連線了。

打開網路共享中心,新增一個連線。

image

連線到Work place

image

image

不需要設定Internet Connection

image

這邊要輸入RRAS的Local IP Address,以我的例子來說,10.10.10.1

image

輸入完後按下Create,

然後回到網路與共享中心,Change Adapter Settings

image

點選剛剛建立完成的連線,Property

image

修改安全性設定

image

接著就可以連線了。

image

到這裡已經大功告成了,接下來當然是要測試一下。

回到Windows Azure Portal,建立一台Virtual Machine作為Web Server並加入剛剛建立的Virtual Network。

image

image

安裝Web Server,回到10.10.10.2的本地客戶端電腦。打開瀏覽器瀏覽看看。

image

Blog Archive

About Me