一般的なアプリケーション ルールは次のとおりです。
条件に基づく 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 }
- (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 アプリケーションでは、(通常、ログインまたは POST 呼び出しの後に)クライアントをページにリダイレクトするロケーション ヘッダの付いた 301/302 応答を使用します。また、アプリケーションの 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 をメンテナンス Web サイトにリダイレクトできます。
redirect location http://maitenance.xyz.com/maintenance.htm
NT LAN Manager (NTLM) 認証
デフォルトでは、NSX は各要求の後に TCP 接続をサーバ側で終了します。各要求の後にサーバ セッションを終了しないようにする場合、NTLM プロトコルを使用することで、サーバ セッションを保持および保護できます。
no option http-server-close
デフォルトでは、NSX は各要求の間に確立された TCP 接続を、クライアント側で維持します。ただし「X-Forwarded-For」オプションが設定されている場合は、セッションは各要求の後に終了します。次のオプションでは、XFF が設定されている場合でも、各要求間でクライアント接続が開かれた状態が維持されます。
no option httpclose
サーバ ヘッダーの置き換え
既存の応答サーバ ヘッダーを削除して、別のサーバに置き換えることができます。次のサンプル ルールは、サーバ ヘッダーを削除して NGINX Web サーバに置き換えます。NGINX Web サーバは、HTTP、HTTPS、SMTP、POP3 および IMAP プロトコルのリバース プロキシ サーバ、HTTP キャッシュ、およびロード バランサとして機能することが可能です。
rspidel Server rspadd Server:\ nginx
リダイレクトの書き換え
ロケーション ヘッダーを HTTP から HTTPS に書き換えることができます。次のサンプル ルールは、ロケーション ヘッダーを特定して、HTTP を HTTP に置き換えます。
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 サーバ
プライマリ プール内のサーバがすべて停止している場合は、セカンダリ プール内のサーバを使用します。
# 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