일반적으로 사용되는 애플리케이션 규칙입니다.

조건 기반 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. MSRDP 지속성을 사용하여 TCP 트래픽에 대한 애플리케이션 프로파일을 생성합니다.

  2. TCP 상태 모니터(tcp_monitor)를 생성합니다.

  3. 192.168.1.100:3389, 192.168.1.101:3389 및 192.168.1.102:3389가 멤버로 속한 풀(이름은 rdp-pool)을 생성합니다.

  4. tcp_monitor를 rdp-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. 가상 서버(named 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 트래픽 문제를 해결하려면 규칙을 더 추가해야 할 수도 있습니다. 대부분의 웹 애플리케이션은 클라이언트를 페이지로 향하게 하는 위치 헤더와 함께 301/302 응답을 사용하며(대부분의 경우 로그인 또는 POST 호출 후) 애플리케이션 쿠키를 요구합니다. 따라서 애플리케이션 서버가 클라이언트 연결 정보를 파악하는 데 어려움이 있을 수 있으며 올바른 응답을 제공하지 못할 수도 있습니다. 애플리케이션의 작동이 중지될 수도 있습니다.

웹 애플리케이션이 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

쿠키가 없는 경우 인증 HTTP 리디렉션

쿠키가 없는 클라이언트 요청을 리디렉션하여 인증을 받을 수 있습니다. 다음 샘플 규칙은 HTTP 요청이 진짜인지와 헤더에 쿠키가 있는지 확인합니다. 요청에 쿠키가 없으면 규칙은 인증을 위해 요청을 / 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

NTLM(NT LAN Manager) 인증

기본적으로 서버 측 NSX는 각 요청 후에 TCP 연결을 닫습니다. 각 요청 후에 서버 세션을 닫지 않으려면 서버 세션을 활성 상태로 두고 NTLM 프로토콜로 보호할 수 있습니다.

no option http-server-close

기본적으로 클라이언트 측 NSX는 요청 간에 TCP 연결이 설정된 상태를 유지합니다. 그렇지만 "X-Forwarded-For" 옵션을 사용하면 각 요청 후에 세션이 닫힙니다. 다음 옵션은 XFF가 구성된 경우에도 요청 간에 클라이언트 연결을 열린 상태로 유지합니다.

no option httpclose

서버 헤더 교체

기본 응답 서버 헤더를 삭제하고 다른 서버로 교체할 수 있습니다. 다음 샘플 규칙은 서버 헤더를 삭제하고 HTTP, HTTPS, SMTP, POP3 및 IMAP 프로토콜, HTTP 캐시 및 로드 밸런서에 대한 역방향 프록시 서버 역할을 할 수 있는 NGINX 웹 서버로 바꿉니다.

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 

비인증 클라이언트 리디렉션

쿠키가 없는 경우 클라이언트 요청을 "/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

장애 대비 서버

기본 풀의 서버가 모두 비활성 상태이면 보조 풀의 서버를 사용합니다.

# 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