【BIG-IP】iRule を使用して Syslog サーバへログ送信する方法

ネットワーク

作業環境

  • BIG-IP Virtual Edition
    • version 15.x.x

iRule を使用したアクセスログ送信

BIG-IP では、iRule を使用して Syslog サーバへログを送信するよう設定することができます。

ログに含める内容も任意に設定することができるため、以下のような情報をログに含めてアクセスログとして Syslog サーバに送信することが可能です。

  • クライアントIP、サーバ IP、サーバ Port
  • HTTP ヘッダ情報、URI、パス、ステータスコード
  • 時刻
  • 等々

【事前準備】送信先 Syslog サーバの設定

ログ送信先となる Syslog サーバを設定しておきます。

◆Syslog サーバのプールの設定

[Local Traffic > Pools : Pool List] 画面から Create をクリックします。

プール名を入力し、New Members 欄で Syslog サーバの IP アドレスとサービスポート(通常は 514)を入力し Add をクリックします。

リストに Syslog サーバ情報が追加されたことを確認し Finished をクリックします。

◆Log Destinations の設定

[System > Logs > Configuration > Log Destinations] 画面で Create をクリックします。

表示される画面で以下の通り設定し Finished をクリックします。

  • Name:任意の設定識別名
  • Type:Remote High-Speed Log
  • Pool Name:上で作成した Syslog サーバのプールの名前
  • Protocol:ログ送信先 Syslog サーバの仕様に合わせて TCP か UDP

次に、再度 [System > Logs > Configuration > Log Destinations] 画面で Create をクリックします。

表示される画面で以下の通り設定し Finished をクリックします。

  • Name:任意の設定識別名
  • Type:Remote Syslog
  • Forward To:上で作成した Remote High-Speed Log 設定の名前

◆Log Publishers の設定

[System > Logs > Configuration > Log Publishers] 画面で Create をクリックします。

表示される画面で以下の通り設定し Finished をクリックします。

  • Name:任意の設定識別名
  • Destinations:
    • Available リストから上で設定した Remote Syslog 設定の名前をクリックして選択した上で、[<<] をクリックする
    • Selected リストに追加されたことを確認する

以上で Syslog サーバの設定は完了です。

iRule でのログ送信設定

[Local Traffic > iRules > iRule List] 画面で Create をクリックします。

以下画面が表示されるため、この画面でコードを記述していきます。

ログ送信に関する iRule の構文

◆高速ログ通信のバンドルを開く(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> の部分にログとして送信する文字列を指定する

ログ送信するタイミング

iRule は特定のイベントをトリガーとして処理が実行されますが、BIG-IP がサーバからのレスポンスを受け取ったタイミングでログを送信する場合は HTTP_RESPONSE イベントの処理内でログ送信する処理を記述します。通常はこのタイミングでログ送信するのではないかと思います。

ログに含める情報の収集

HTTP_RESPONSE イベント時にログ送信する場合において、HTTP_REQUEST イベント時にのみ取得できる情報をログに含めたい場合があります。

例えば、[HTTP::method] [HTTP::host] [HTTP::uri] などは HTTP_REQUEST イベント時にのみ取得可能です。

この場合は HTTP_REQUEST イベント時の処理内で変数に必要な値を格納しておくことで、HTTP_RESPONSE イベント時の処理内でその変数の値を参照することが可能です。

iRule のバーチャルサーバへの適用

バーチャルサーバ設定編集画面の Resources タブ画面で、iRules 欄の Manage をクリックします。

以下の画面が表示されるため、Available リストから適用したい iRule をクリックして選択した上で [<<] をクリックします。その後 Enabled 欄に iRule が追加されたことを確認し Finished をクリックします。

アクセスログを送信する iRule の例

以下のような構成を想定します。

バーチャルサーバに適用する iRule は以下の通りとします。

when HTTP_REQUEST {
    set reqTime [clock format [clock seconds] -format {%Y/%m/%d %H:%M:%S}]
    set reqSrcip [IP::client_addr]
    set reqDstip [IP::local_addr]
    set reqDstport [TCP::local_port]
    set reqMethod [HTTP::method]
    set reqHost [HTTP::host]
    set reqUri [HTTP::uri]
    set reqVersion [HTTP::version]

    set hslHandle [HSL::open -publisher /Common/Pub_Syslog]
}

when HTTP_RESPONSE {
    set resServerip [IP::server_addr]
    set resServerport [TCP::server_port]
    set resStatus [HTTP::status]
    
    HSL::send $hslHandle "$reqTime $reqSrcip $reqDstip $reqDstport $reqMethod $reqUri $reqVersion $resStatus $reqHost $resServerip $resServerport"
}

クライアントから Web サーバ(バーチャルサーバ)にアクセスしたときに Syslog サーバに送信されるログは以下の通りです。

2021/10/28 14:28:17 192.168.75.1 192.168.75.11 443 GET / 1.1 403 192.168.75.11 192.168.75.134 443

参考資料

iRules Home
HSL::open
HSL::send


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