【BIG-IP】iRules を解読・作成するための基礎的情報まとめ

ネットワーク

言語について

  • Tcl 言語をベースにしている
  • コメントアウト記号は #

iRule イベント

処理のトリガとなるイベント。when XXX {} の XXX の部分に記述される。

  • HTTP_REQUEST
    • システムが完全なクライアント HTTP リクエストヘッダ(つまり、メソッド、URI、バージョン、および HTTP リクエスト本文を除くすべてのヘッダ)を完全に解析したときにトリガされる iRule イベント
  • HTTP_RESPONSE
    • システムがサーバ応答からのすべての応答ステータスとヘッダー行を解析するときにトリガされる iRule イベント

[HTTP_●●●●] のイベントを含む iRule をバーチャルサーバに適用する条件として、対象バーチャルサーバに HTTP Profile (Client) が設定されている必要があります。

Priority

  • iRule イベントに関連付けられる優先度
  • iRules がバーチャルサーバの内部 iRules エンジンにロードされると、イベント名と優先度の組み合わせでテーブルに保存される
  • Priority が小さいイベントのコードブロックから順に評価・実行される
  • Priority のデフォルトは 500、値範囲は 0〜1000
  • Priority が同じ場合は、テーブルに挿入された順序で実行される
  • Priority の指定方法は以下の 2 パターンがある

#パターン1
priority nnn
when <event_name> {
...
}

#パターン2
when <event_name> priority nnn {
...
}

参考資料:https://clouddocs.f5.com/api/irules/priority.html

変数

  • 事前の変数宣言は必要ない
  • 変数への値の代入
    • set <変数名> <値>
  • 変数値の参照
    • $<変数名>

ローカル変数とグローバル変数

  • ローカル変数
    • 同一セッション内でのみ値が保持される変数
    • 使用方法は上記の通り
  • グローバル変数
    • すべてのセッションで共通して使用可能な変数
    • 使用方法は変数名指定の箇所で static::<変数名> と記述する
    • 基本的には使わない方が良さそう

区切り文字の意味

  • 半角スペース
    • コマンド、名前、引数、オプションなどの区切り
  • 大括弧 [ ]
    • ネストされたコマンドは大括弧で区切られる
    • 大括弧で囲まれたものはすべてコマンドとして評価される
  • 中括弧 { }
    • 1 つ以上の要素のスペース区切りリスト
    • または 1 つ以上のコマンドの改行区切りリスト
  • 小括弧 ( )
    • 式の優先順位を明示的に指定したいときに使用
    • 配列要素参照時に使用
    • 正規表現で使用
    • など

算術演算

算術演算(加減乗除など)をするためには、expr コマンドを使用する必要がある。

  • 加算:expr { A + B }
  • 減算:expr { A - B }
  • 乗算:expr { A * B }
  • 除算:expr { A / B }

比較演算子

  • 等しい:A == B
  • 等しくない:A != B
  • 含む:A contains B
  • で始まる:A starts_with B
  • で終わる:A ends_with B

その他一般的な演算子も使用可能。

比較用コマンド

  • string equal [-nocase] <string1> <string2>
    • string1 と string2 が等しい場合は 1、そうでない場合は 0 を返す
    • -nocase オプションを付けると大文字と小文字を区別しない

定数値の取得

  • クライアントの IP アドレス
    • IP::client_addr
  • BIG-IP の IP アドレス
    • IP::local_addr
  • BIG-IP のポート
    • TCP::local_port
  • サーバの IP アドレス(BIG-IP での振り分け先)
    • IP::server_addr
  • サーバ側の TCP ポート番号
    • TCP::server_port または TCP::remote_port

  • HTTP リクエストの内容
    • HTTP::host
    • HTTP::path
    • HTTP::query
    • HTTP::uri
    • HTTP::cookie <オプション>
    • HTTP::header <オプション>
      • HTTP::header value <ヘッダ名>:指定したヘッダの値を取得
    • HTTP::method:GET/POST/PUT/DELETE 等
    • HTTP::request
    • HTTP::version
  • HTTP ステータスコード
    • HTTP::status

HTTP 操作

HTTP ヘッダ操作

  • HTTP::header remove <ヘッダ名>
    • 指定したヘッダの削除
  • HTTP::header insert <ヘッダ名> <値>
    • 指定したヘッダの挿入

参考資料:https://clouddocs.f5.com/api/irules/HTTP__header.html

HTTP パスの書き換え

  • HTTP::path <パス>

参考資料:https://clouddocs.f5.com/api/irules/HTTP__path.html

HTTP レスポンスの生成

以下コマンドでクライアントへの HTTP レスポンスを生成可能。

  • HTTP::respond <ステータスコード> [<オプション>]

ステータスコード 403 として接続を閉じる場合は以下のように記述。

HTTP::respond 403 noserver Connection "close"

参考資料:https://clouddocs.f5.com/api/irules/HTTP__respond.html

サーバプールの設定

  • pool <プール名>

参考資料:https://clouddocs.f5.com/api/irules/pool.html

Syslog 操作

◆高速ログ通信のバンドルを開く(Syslog サーバ指定)

  • HSL::open -publisher <publisher>
    • System > Logs > Configuration > Log Publishers で設定されたログパブリッシャーの高速ログ通信のハンドルを開いて返す
    • <publisher> の部分は「/Common/<Log Publisher 設定名>」の形で記述する
    • set <変数> HSL::open ... の形で記述し、戻り値であるハンドルを変数に格納して使用する

◆ 指定データを高速ログで送信(ログ送信)

  • HSL::send <handle> <data>
    • <handle> には HSL::open の戻り値を格納した変数を指定
    • <data> の部分にログとして送信する文字列を指定する

文字列置換

regsub

正規表現によるパターンマッチにより文字列を置換。

  • regsub [-nocase|-all] <string1> <string2> <string3> <変数>
    • string1:置換対象の正規表現パターン
    • string2:置換操作を行う対象文字列
    • string3:string1 にマッチした部分をこの文字列に置き換える
    • 変数:置換した結果の文字列が格納される変数
    • 戻り値は置換した文字列の数
    • -nocase オプションを付けると大文字と小文字を区別しない
    • -all オプションを付けると正規表現に一致した箇所すべてを置換。指定しない場合、最初の一箇所のみ置換
set url http://nwengblog.com/piyo/index.html
regsub -all {http://|/index.html} $url {} result
→ 2
set result
→ nwengblog.com/piyo

その他

  • 現在時刻の取得
    • clock clicks:CPU のクロックティック単位のカウント値
    • clock clicks -milliseconds:ミリ秒単位のカウント値
  • 文字列の小文字を大文字に変換
    • string toupper <string>
  • URL エンコード(パーセントエンコーディング)する
    • URI::decode <uri>

参考資料

iRules Home
Tag: "series-irules-getting-started" - DevCentral
Weareanonlinecommunityoftechnicalpeersdedicatedtolearning,exchangingideas,andsolvingproblems-together.
もっとTcl/Tk


タイトルとURLをコピーしました