需求:有一台伺服器需要在LTM上面映射一個位址,并且控制僅通路其某一個目錄,不能通路其他目錄。
環境:
LTM以旁路方式部署,配置vip時必須使用snat。
分析一:
由于隻有一台伺服器,是以簡單分析就是針對該VIP的通路直接跳轉到該伺服器的這個頁面url,并且可以不用調用pool。
是以配置如下:
virtual url_80_vs {
destination 1.1.1.1:http
snatpool snat_pool1
ip protocol tcp
profile http tcp
rule rd2url_iRule
}
rule rd2url_iRule {
when HTTP_REQUEST {
HTTP::redirect http://11.1.1.1/web/test.ko
測試一:
配置完成後在外網本機(12.1.1.1)進行測試,發現始終通路不到該url。從ie上看出已經進行了跳轉,但是在伺服器上tcpdump發現竟然是源位址竟然是12.1.1.1,而不是LTM的SNAT後的位址。也就是說LTM根本就沒有執行SNAT動作,而是直接進行跳轉。如此分析後,修改了一下irule如下:
when HTTP_REQUEST {
use snatpool snat_pool1
如此進行測試依然不能進行通路。而後得出結論:LTM在進行http的跳轉如果不調用pool的話是不會進行snat動作的。
分析二:
于是換一個思路進行分析:
要讓該VIP調用pool,進而執行snat動作。而隻允許通路某一個url頁面,那irule寫成這樣即可了:
if { not ( [HTTP::uri] equals "/web/test.ko" ) } {
reject
并且在virtual上添加相應的pool。
測試二:
然後進行測試,發現通路是正常了,其他需求的都能滿足了,但是其中的圖檔卻顯示不出來,全是x。這點需要咨詢廠商。
分析三:
在irule中很少使用not的,是以我再換一個irule試試:
if { [HTTP::uri] equals "/" } {
elseif { [HTTP::uri] starts_with "/test.php" } {
virtual的配置不變。
測試三:
這下完全正常了,通路控制的需求也滿足了,圖檔也能正常顯示。但是完全是根據該url不是test.php打頭來編制的,也就是說有其他的基于test.php的url需要放通别人通路的話就又要添加reject的rule了。
總結:
1,LTM在進行http的跳轉如果不調用pool的話是不會進行snat動作的;
2,在irule中使用not進行判斷時,圖檔顯示不出來;這點需要咨詢技術達人;
3,在明确需求後,分析問題應該多元化,不能拘泥于一種思路。
本文轉自 chris_lee 51CTO部落格,原文連結:http://blog.51cto.com/ipneter/283361,如需轉載請自行聯系原作者