常用的应用程序规则。

基于条件的 HTTP/HTTPS 重定向

通过应用程序配置文件可指定 HTTP/HTTPS 重定向,无论请求 URL 是什么,始终可重定向流量。您还可以灵活指定在什么条件下可以重定向 HTTP/HTTPS 流量。

move the login URL only to HTTPS. 
acl clear dst_port 80
acl secure dst_port 8080
acl login_page url_beg /login 
acl logout url_beg /logout 
acl uid_given url_reg /login?userid=[^&]+ 
acl cookie_set hdr_sub(cookie) SEEN=1
redirect prefix https://mysite.com set-cookie SEEN=1 if !cookie_set
redirect prefix https://mysite.com if login_page !secure
redirect prefix http://mysite.com drop-query if login_page !uid_given
redirect location http://mysite.com/ if !login_page secure
 redirect location / clear-cookie USERID= if logout

按域名进行路由

可以创建应用程序规则,以便根据域名将请求定向到特定的负载平衡器池。以下规则将发送到 foo.com 的请求定向到 pool_1,将发送到 bar.com 的请求定向到 pool_2。

acl is_foo hdr_dom(host) -i foo
  acl is_bar hdr_dom(host) -i bar
  use_backend pool_1 if is_foo
  use_backend pool_2  if is_bar

Microsoft RDP 负载平衡和保护

在以下示例场景中,负载平衡器将新用户平衡到负载较少的服务器并恢复中断的会话。此场景中的 NSX Edge 内部接口 IP 地址是 10.0.0.18,内部接口 IP 地址是 192.168.1.1,虚拟服务器是 192.168.1.100、192.168.1.101 和 192.168.1.102。

  1. 为 TCP 流量创建包含 MSRDP 持久性的应用程序配置文件。

  2. 创建 TCP 运行状况监控 (tcp_monitor)。

  3. 创建名为 rdp-pool 的池,其中包含成员 192.168.1.100:3389、192.168.1.101:3389 和 192.168.1.102:3389。

  4. 将 tcp_monitor 与 dp-pool 相关联。

  5. 创建以下应用程序规则。

    tcp-request content track-sc1 rdp_cookie(mstshash) table rdp-pool
    tcp-request content track-sc2 src table ipv4_ip_table
     
    #   each single IP can have up to 2 connections on the VDI infrastructure
    tcp-request content reject if { sc2_conn_cur ge 2 }
    
    #   each single IP can try up to 5 connections in a single minute
    tcp-request content reject if { sc2_conn_rate ge 10 }
    
    # Each user is supposed to get a single active connection at a time, block the second one
    tcp-request content reject if { sc1_conn_cur ge 2 }
    
    # if a user tried to get connected at least 10 times over the last minute, 
    # it could be a brute force
    tcp-request content reject if { sc1_conn_rate ge 10 }
    
    
  6. 创建名为 rdp-vs 的虚拟服务器。

  7. 将应用程序配置文件关联到此虚拟服务器,并添加第 4 步中创建的应用程序规则。

在虚拟服务器上新应用的应用程序规则将保护 RDP 服务器。

高级日志记录

默认情况下,NSX 负载平衡器支持基本日志记录。您可以按如下方式创建应用程序规则,以便查看详细的日志记录消息以进行故障排除。

 # log the name of the virtual server
 capture request  header Host len 32

 # log the amount of data uploaded during a POST
 capture request  header Content-Length len 10
# log the beginning of the referrer
capture request  header Referer len 20

# server name (useful for outgoing proxies only)
capture response header Server len 20

# logging the content-length is useful with "option logasap"
capture response header Content-Length len 10

# log the expected cache behaviour on the response
capture response header Cache-Control len 8

# the Via header will report the next proxy's name
 capture response header Via len 20

# log the URL location during a redirection
capture response header Location len 20

将应用程序规则关联到虚拟服务器后,日志将包含如下所示的详细消息。

2013-04-25T09:18:17+00:00 edge-187 loadbalancer[18498]: [org1]: 10.117.7.117 - - [25/Apr/2013:09:18:16 +0000] "GET /favicon.ico HTTP/1.1" 404 1440 "" "" 51656 856 "vip-http-complete" 
"pool-http-complete" "m2" 145 0 1 26 172 --NI 1 1 0 0 0 0 0 "" "" "10.117.35.187" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 
(KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31" "Apache/2.2.15 (Linux" ""

2013-04-25T09:18:17+00:00 edge-187 loadbalancer[18498]: [org1]: 10.117.7.117 - - [25/Apr/2013:09:18:16 +0000] "GET /favicon.ico HTTP/1.1" 404 1440 "" "" 51657 856 "vip-http-complete" 
"pool-http-complete" "m2" 412 0 0 2 414 --NI 0 0 0 0 0 0 0 "" "" "10.117.35.187" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 
(KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31" "Apache/2.2.15 (Linux" ""

要排除 HTTPS 流量故障,可能需要添加更多的规则。大多数的 Web 应用程序使用带位置标头的 301/302 响应以将客户端重定向到页面(大多数情况下是在登录或 POST 调用后),还需要应用程序 cookie。所以应用程序服务器可能无法获取客户端连接信息,从而无法做出正确的响应,这甚至可能会使应用程序停止工作。

要使 Web 应用程序支持 SSL 卸载,请添加以下规则。

# See clearly in the log if the application is setting up response for HTTP or HTTPS
capture response header Location   len 32
capture response header Set-Cookie len 32

# Provide client side connection info to application server over HTTP header
http-request set-header X-Forwarded-Proto https if  { ssl_fc }
http-request set-header X-Forwarded-Proto http  if !{ ssl_fc }

通过 SSL 建立连接后,负载平衡器将插入以下标头。

X-Forwarded-Proto: https

通过 HTTP 建立连接后,负载平衡器将插入以下标头。

X-Forwarded-Proto: http

阻止特定的 URL

您可以阻止在 URL 中包含特定关键字的请求。以下示例规则检查请求是否以 /private 或 /finance 开头,并阻止包含这些内容的请求。

# Check if the request starts with "/private" or "/finance" (case insensitive)
acl block_url_list path_beg -i /private /finance

# If the request is part of the list forbidden urls,reply "Forbidden"(HTTP response code
 403)
block if block_url_list

没有 cookie 时的身份验证 HTTP 重定向

您可以重定向没有 cookie 的客户端请求以进行身份验证。以下示例规则检查 HTTP 请求是否是真实的并在标头中具有 cookie。如果请求没有 cookie,则规则将请求重定向到 / authent.php 以进行身份验证。

acl authent_url url /authent.php
acl cookie_present hdr_sub(cookie) cookie1=
redirect prefix /authent.php if !authent_url !cookie_present

默认页面重定向

您可以将客户端请求 / 重定向到默认页面。以下示例规则检查 HTTP 请求是否为 /,并将请求重定向到默认登录页面。

acl default_url url /
redirect prefix /login.php if default_url

重定向到维护网站

在主池发生故障时,您可以使用维护服务器池并将 URL 重定向到维护网站。

redirect location http://maitenance.xyz.com/maintenance.htm

NT LAN 管理器 (NTLM) 身份验证

在服务器端,NSX 默认在每个请求后关闭 TCP 连接。如果不希望在每个请求后关闭服务器会话,您可以将服务器会话保持活动状态并使用 NTLM 协议保护会话安全。

no option http-server-close

在客户端,NSX 默认在请求之间将 TCP 连接保持建立状态。不过,在使用“X-Forwarded-For”选项时,将在每个请求后关闭会话。以下选项在请求之间将客户端连接保持打开状态,即使配置了 XFF 也是如此。

no option httpclose

替换服务器标头

您可以删除现有的响应服务器标头,并将其替换为另一个服务器。以下示例规则删除服务器标头,并将其替换为可作为 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议、HTTP 缓存和负载平衡器的反向代理服务器的 NGINX Web 服务器。

rspidel Server
rspadd Server:\ nginx

重写重定向

您可以将位置标头从 HTTP 重写为 HTTPS。以下示例规则指定位置标头并将 HTTP 替换为 HTTPS。

rspirep ^Location:\ http://(.*)  Location:\ https://\1

根据主机选择特定的池

您可以将具有特定主机的请求重定向到定义的池。以下示例规则检查特定主机 app1.xyz.com、app2.xyz.com 和 host_any_app3 的请求,并将这些请求分别重定向到定义的池 pool_app1、pool_app2 和 pool_app3。所有其他请求将重定向到虚拟服务器中定义的现有池。

acl host_app1 hdr(Host) -i app1.xyz.com
acl host_app2 hdr(Host) -i app2.xyz.com
acl host_any_app3 hdr_beg(host) -i app3

可以针对每个主机名使用特定的池。

use_backend pool_app1 if host_app1
use_backend pool_app2 if host_app2
use_backend pool_app3 if host_any_app3

根据 URL 选择特定的池

您可以将具有 URL 关键字的请求重定向到特定的池。以下示例规则检查请求是否以 /private 或 /finance 开头,并将这些请求重定向到定义的池 pool_private 或 pool_finance。所有其他请求将重定向到虚拟服务器中定义的现有池。

acl site_private path_beg -i /private
acl site_finance path_beg -i /finance
use_backend pool_private if site_private
use_backend pool_finance if site_finance

在主池发生故障时重定向

如果主池中的服务器发生故障,您可以重定向用户以使用辅助池中的服务器。以下示例规则检查 pool_production 是否发生故障,并将用户转移到 pool_sorry_server。

acl pool_production_down nbsrv(pool_production) eq 0
use_backend pool_sorry_server if pool_production_down

白名单 TCP 连接

您可以阻止客户端 IP 地址访问您的服务器。如果定义的客户端 IP 地址不在白名单中,以下示例规则将阻止这些 IP 地址并重置连接。

acl whitelist src 10.10.10.0 20.20.20.0
tcp-request connection reject if !whitelist

启用 sslv3 和 tlsv1

默认情况下,禁用 sslv3 和 tlsv1 服务监控器扩展。您可以使用以下应用程序规则启用它们。

sslv3 enable
tlsv1 enable

配置客户端会话超时

会话超时是客户端的最大连接闲置时间。在客户端需要确认或发送数据时,将应用闲置超时。在 HTTP 模式下,在第一阶段(客户端发送请求)和响应期间(客户端读取服务器发送的数据),该超时是特别重要的。默认超时值为 5 分钟。

以下示例规则将超时时间设置为 100 秒。

timeout client 100s

时间可以设置为以毫秒、秒、分钟、小时或天为单位的整数。

重定向到 HTTPS 网站

您可以将来自 HTTP 的客户端重定向到 HTTPS 上的相同页面。

# Redirect all HTTP requests to same URI but HTTPS redirect scheme
https if !{ ssl_fc }

其他选项如下:

rspirep ^Location:\ http://(.*) Location:\ https://\1 

重定向非身份验证客户端

如果客户端请求没有 Cookie,则将客户端请求重定向到“/authent.php”。

# Check the HTTP request if request is "/authent.php"
acl authent_url url /authent.php
# Check the cookie "cookie1" is present
acl cookie_present hdr_sub(cookie) cookie1=
# If the request is NOT "/authent.php" and there is no cookie, then redirect to "/authent.php"
redirect prefix /authent.php if !authent_url !cookie_present 

HTTP 响应标头重写

将响应服务器标头“Server”替换为值“nginx”。

# Delete the existing Response Server header "Server"
rspidel Server
# Add the Response Server header "Server" with the value "nginx"
rspadd Server:\ nginx

Sorry Server

如果主池中的服务器全部发生故障,请使用辅助池中的服务器。

# detect if pool "pool_production" is still up
acl pool_production_down nbsrv(pool_production) eq 0
# use pool "pool_sorry_server" if "pool_production" is dead
use_backend pool_sorry_server if pool_production_down
# Option 1: # Redirect everything to maintenance site
redirect location http://maintenance.xyz.com/maintenance.htm
# Option 2: #Use a specific maintenance server pool and rewrite all URLs to maintenance.php
acl match_all always_true
use_backend maint_pool if match_all
reqirep ^GET\(.*)\HTTP/(.*) GET\ /maintenance.php\ HTTP/\2