일반적으로 사용되는 애플리케이션 규칙입니다.
조건 기반 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 로드 밸런싱 및 보호
- MSRDP 지속성을 사용하여 TCP 트래픽에 대한 애플리케이션 프로파일을 생성합니다.
- TCP 상태 모니터(tcp_monitor)를 생성합니다.
- 192.168.1.100:3389, 192.168.1.101:3389 및 192.168.1.102:3389가 멤버로 속한 풀(이름은 rdp-pool)을 생성합니다.
- tcp_monitor를 rdp-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 }
- 가상 서버(named 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 트래픽 문제를 해결하려면 규칙을 더 추가해야 할 수도 있습니다. 대부분의 웹 애플리케이션은 클라이언트를 페이지로 향하게 하는 위치 헤더와 함께 301/302 응답을 사용하며(대부분의 경우 로그인 또는 POST 호출 후) 애플리케이션 쿠키를 요구합니다. 따라서 애플리케이션 서버가 클라이언트 연결 정보를 파악하는 데 어려움이 있을 수 있으며 올바른 응답을 제공하지 못할 수도 있습니다. 애플리케이션의 작동이 중지될 수도 있습니다.
# 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
쿠키가 없는 경우 인증 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 location /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