一个url访问控制的iRules

需求:有一台服务器需要在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如下:
rule rd2url_iRule {
when HTTP_REQUEST {
use snatpool snat_pool1
HTTP::redirect http://11.1.1.1/web/test.ko
}
}
如此进行测试依然不能进行访问。而后得出结论:LTM在进行http的跳转如果不调用pool的话是不会进行snat动作的。

分析二:
于是换一个思路进行分析:
要让该VIP调用pool,从而执行snat动作。而只允许访问某一个url页面,那irule写成这样即可了:
rule rd2url_iRule {
when HTTP_REQUEST {
  if { not ( [HTTP::uri] equals "/web/test.ko" ) } {
reject
}
}
}
并且在virtual上添加相应的pool。
测试二:
然后进行测试,发现访问是正常了,其他需求的都能满足了,但是其中的图片却显示不出来,全是x。这点需要咨询厂商。

分析三:
在irule中很少使用not的,所以我再换一个irule试试:
rule rd2url_iRule {
when HTTP_REQUEST {
if { [HTTP::uri] equals "/" } {
reject
}
elseif { [HTTP::uri] starts_with "/test.php" } {
reject
}
}
}
virtual的配置不变。

测试三:
这下完全正常了,访问控制的需求也满足了,图片也能正常显示。但是完全是根据该url不是test.php打头来编制的,也就是说有其他的基于test.php的url需要放通别人访问的话就又要添加reject的rule了。

总结:
1,LTM在进行http的跳转如果不调用pool的话是不会进行snat动作的;
2,在irule中使用not进行判断时,图片显示不出来;这点需要咨询技术达人;
3,在明确需求后,分析问题应该多元化,不能拘泥于一种思路。


你可能感兴趣的:(休闲,SNAT,iRule,http跳转,HTTP::uri)