はじめに:
今月のiRuleではBIG-IPでproxy.pacファイルを配布する方法を紹介します。一般的な企業LANではプロキシサーバが利用されているケースが多いと思いますが、
サーバによってはプロキシサーバを介さずにアクセスする必要があるなど、ブラウザのプロキシサーバ設定は複雑になりがちです。

そういった場合、proxy.pac(プロキシサーバの自動構成スクリプト)ファイルを利用していることが多いと思います。しかし、そのためだけにWEBサーバを用意するのもなかなか大変なのが事実です。 proxy.pacファイルが配布できなければ、クライアントのWEBアクセスは止まってしまいますから、このサーバの重要性は侮れません。でも配布するコンテンツはproxy.pacだけ・・・・それならBIG-IPにさせてみたらどうでしょうか。以下でも詳細をご確認いただけます。

http://devcentral.f5.com/wiki/default.aspx/iRules/Proxy_Pacfile_Hosting_without_need_for_Web_servers.html

タイトル:
BIG-IPでproxy.pacファイルを配布するiRule

メリット:proxy.pacファイル配布用のWEBサーバが必要なくなる

機能解説:
BIG-IPがHTTPリクエストに対して直接レスポンスを返し、クライアントにproxy.pacファイルを配布

設定概要:
proxy.pacファイルの内容をまるごと変数にセットし、リクエストURIが /proxy.pac であればステータスコード200とともに変数にセットしたproxy.pacファイルの内容で応答します。

【iRule定義】 

when RULE_INIT {
        set pacfile {
        function FindProxyForURL(url, host) {
               
                if (isPlainHostName(host))
                return "DIRECT";
         
                if (shExpMatch(url, "http://10.*")||
                shExpMatch(url, "https://10.*")||
                shExpMatch(url, "ftp://10.*")||
                shExpMatch(url, "http://localhost*")||
                shExpMatch(url, "https://localhost*")||
                shExpMatch(url, "http://127.0.0.1*")||
                shExpMatch(url, "https://127.0.0.1*")||
                shExpMatch(url, "http://172.*")||
                shExpMatch(url, "https://172.*")||
                shExpMatch(url, "ftp://172.*"))
                return "DIRECT";
       
        if (dnsDomainIs(host, ".extranet.com")||
                dnsDomainIs(host, ".extranet2.com"))
                return "Proxy yourproxy.domain.com:8080";
               
                if (dnsDomainIs(host, ".intrant.com")||
                dnsDomainIs(host, ".intranet2.com"))
                return "DIRECT";
               
        return "PROXY yourproxy.domain.com:8080";
        }
        }
}

when HTTP_REQUEST {
         # Don't allow data to be chunked
        if {[HTTP::version] eq "1.1" } {
                if {[HTTP::header is_keepalive] } {
                        HTTP::header replace "Connection" "Keep-Alive"
                }
                HTTP::version "1.0"
        }
        log local0. "HTTP_REQUEST"
        switch -glob [HTTP::uri] {
                "/proxy.pac" {
                        HTTP::respond 200 content $::pacfile "Content-Type" "application/x-ns-proxy-autoconfig" "pragma" "no-cache"
                        return
                }
        }
}

 

※F5ネットワークスジャパンでは、サンプルコードについて検証を実施していますが、お客様の使用環境における動作を保証するものではありません。実際の使用にあたっては、必ず事前にテストを実施することを推奨します。