IPアドレスチェックとURLチェックの両方を必要とする仮想ホスト用のカスタムフィルターを設定する必要があります。そのようです:
_if_ _(_ http-request matches url _and_ ip is from certain Host/net range _)_
_or_ ip is from a certain VIP range _then_ let the request through
IPチェックをパケットフィルターに移動してから、IPチェックを2回実行する必要がありますか(VIP範囲のURLチェックをバイパスするため))、それともiruleのパフォーマンスの範囲内に置いても大丈夫ですか?
これはiRuleで行う非常に一般的なことであり、BIG-IPが大量にロードされていない限り、問題は発生しません。
懸念がある場合は、iRuleのタイミングをオンにして、ルールで使用されているCPUサイクル数を確認できます。 DevCentralには古いが良い これを行う方法に関する記事 があります。唯一の古い部分はv11で、bigpipeの代わりにtmshが必要になります(例:「show/ltmrule」)。
本当にiRulesを避けたい場合は、代替方法はHTTPクラス(ローカルトラフィック>プロファイル>プロトコル> HTTPクラス)ですが、これはソースIPではなくURIで分類されます。一致するURIを別のプールに送信したり、リダイレクトを返したりすることができます。これをv11.3の仮想サーバーの新しいソース属性と組み合わせて、それぞれが特定のネットワークからのトラフィックのみを処理する複数の仮想サーバーを作成できます。
ただし、カバーするソース範囲が多数ある場合は、iRuleとアドレスタイプのデータグループを使用します(「matchclass ..equals」コマンドを使用してデータグループ内のクライアントIPを検索します。ルーティングテーブル)。
パケットフィルターは残酷であり、クライアントにタイムアウトを引き起こしますが、HTTPクラスまたはiRuleオプションを使用すると、要求をドロップするか、別のプールを選択するか、リダイレクトを返すか、エラーページを返すかを選択できます。
私はそれをすべて1つのiRuleで行います。
仮想サーバーごとにレイヤー4ACLを実行する例を次に示します。
https://devcentral.f5.com/wiki/iRules.AccessControlBasedOnNetworkOrHost.ashx
CLIENT_ACCEPTEDのデータグループに対してクライアントIPを確認してから、[HTTP :: uri]を使用してHTTP_REQUESTのURIを確認できます。
Classコマンドを使用した例を次に示します。
https://devcentral.f5.com/wiki/iRules.class.ashx
when CLIENT_ACCEPTED {
# Check if the client IP is in the allowed_hosts_dg data group
if {[class match [IP::client_addr] equals allowed_hosts_dg]}{
set allowed_ip 1
} else {
set allowed_ip 0
}
}
when HTTP_REQUEST {
# If the client is a legal source IP check if the HTTP path is in the allowed_paths_dg data group
if {$allowed_ip == 1 && [class search allowed_paths_dg contain [string tolower [HTTP::path]]]}{
# allow the request
} else {
# Send a 403 blocking response
HTTP::respond 403 content {Illegal request!}
}
}
アーロン