常用的应用程序规则。
基于条件的 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
按域名进行路由
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 负载平衡和保护
- 为 TCP 流量创建包含 MSRDP 持久性的应用程序配置文件。
- 创建 TCP 运行状况监控 (tcp_monitor)。
- 创建名为 rdp-pool 的池,其中包含成员 192.168.1.100:3389、192.168.1.101:3389 和 192.168.1.102:3389。
- 将 tcp_monitor 与 dp-pool 相关联。
- 创建以下应用程序规则。
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 }
- 创建名为 rdp-vs 的虚拟服务器。
- 将应用程序配置文件关联到此虚拟服务器,并添加第 4 步中创建的应用程序规则。
在虚拟服务器上新应用的应用程序规则将保护 RDP 服务器。
高级日志记录
# 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。所以应用程序服务器可能无法获取客户端连接信息,从而无法做出正确的响应,这甚至可能会使应用程序停止工作。
# 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 }
X-Forwarded-Proto: https
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) http-request deny 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 location /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