BIG-IPクックブック http://bigipcookbook.seesaa.net/ F5ネットワークスのBIG-IPについてのいろいろ ja
  • http://bigipcookbook.seesaa.net/article/169018620.html OmniGraffleステンシル Mac用の有名な作図ソフトにOmniGraffleというものがありますが、これで使用できるBIG-IPのステンシルがダウンロードできるようになっています。F5 Networks - BIG-IP - Graffletopiaネットワーク図などをMacで書いている人には役立つと思います。 日記 Takahiro 2010-11-11T10:50:48+09:00 <![CDATA[ Mac用の有名な作図ソフトにOmniGraffleというものがありますが、これで使用できるBIG-IPのステンシルがダウンロードできるようになっています。

    F5 Networks - BIG-IP - Graffletopia


    ネットワーク図などをMacで書いている人には役立つと思います。
    ]]><![CDATA[ ]]>
    http://bigipcookbook.seesaa.net/article/168902059.html 通販でBIG-IP/ARXが買えます DELLのサイトで購入することができます。価格等参考になるのではないでしょうか。こちら 日記 Takahiro 2010-11-10T09:33:33+09:00 <![CDATA[ DELLのサイトで購入することができます。
    価格等参考になるのではないでしょうか。

    こちら ]]><![CDATA[ ]]>
    http://bigipcookbook.seesaa.net/article/161024281.html BIG-IP VEにインターフェースを追加する BIG-IP VEで新しく仮想インターフェースを追加するときの手順(ESXi)。vSphereクライアントから追加このときVMXNET3で追加しなければなりません。BIG-IPを起動し、バイナリの設定ファイルを消し、再起動する[root@cookbook2:Standby] config # rm -rf/var/db/mcpd*[root@cookbook2:Standby] config # reboot 設定 Takahiro 2010-08-30T14:18:18+09:00 <![CDATA[ BIG-IP VEで新しく仮想インターフェースを追加するときの手順(ESXi)。
    1. vSphereクライアントから追加
      このときVMXNET3で追加しなければなりません。
      VEint.jpg

    2. BIG-IPを起動し、バイナリの設定ファイルを消し、再起動する
      [root@cookbook2:Standby] config # rm -rf/var/db/mcpd*
      [root@cookbook2:Standby] config # reboot

    ]]><![CDATA[ ]]>
    http://bigipcookbook.seesaa.net/article/160511378.html トラフィックログを取る 1 Syslogを使ってトラフィックログを取りたいときには2個の方法があります。これらはいずれもiRulesを使用します。Syslogdを使用するこの場合の特徴はローカル(BIG-IPのHDD)に出力できるMGMT I/Fから出せるファシリティが自由に設定できるHSL(High Speed Logging)を使用するこちらの特徴はsyslogdを使用しないのでCPU負荷が低い大量になりがちなトラフィックログを処理するにはHSLにアドバンテージがあるような気がします。iRulesで.. テクニック Takahiro 2010-08-25T09:45:35+09:00 <![CDATA[ Syslogを使ってトラフィックログを取りたいときには2個の方法があります。
    これらはいずれもiRulesを使用します。

    1. Syslogdを使用する

      この場合の特徴は
      • ローカル(BIG-IPのHDD)に出力できる
      • MGMT I/Fから出せる
      • ファシリティが自由に設定できる

    2. HSL(High Speed Logging)を使用する

      こちらの特徴は
      • syslogdを使用しないのでCPU負荷が低い

      大量になりがちなトラフィックログを処理するにはHSLにアドバンテージがあるような気がします。


    iRulesで取得できる要素はなんでもログとして出せますが、例をいくつか挙げてみます。

    例1アドレス変換ログを出力する


    HSLを使用する場合、以下のようなiRuleになります。
    when CLIENT_ACCEPTED {
    set hsl [HSL::open -proto UDP -pool syslog]
    set saddr [IP::remote_addr]
    set sport [TCP::client_port]
    }

    when SERVER_CONNECTED {
    set Bsaddr [IP::local_addr]
    set Bsport [TCP::local_port]
    set serveraddr [IP::remote_addr]
    set currenttime [clock seconds]
    HSL::send $hsl "$currenttime,$saddr,$sport,$Bsaddr,$Bsport,$serveraddr"
    # log local0. "$currenttime,$saddr,$sport,$Bsaddr,$Bsport,$serveraddr"
    }

    これはHSLを使用した場合です。syslogd経由で出したい場合はlog local0.の行のコメントアウトを外し、その上のHSL::sendの行およびHSLハンドラを設定しているHSL::openの行をコメントアウトします。

    HSLで複数のsyslogサーバーに同時にログを出したいとき


    残念ながら現状ではsyslogのpoolに設定できるmemberの数は1個に限られる(複数設定したときはヘルスチェックの結果に関わらず常に一つが使われる)ため、可用性を上げたいときは工夫が必要になります。
  • 複数のサーバーに同時に出力する

    この場合syslogサーバー用のpoolともう一個用意し、iRuleの中で複数のハンドラの設定と送信のコマンドを発行すれば良いです。
    .....
    set hsl [HSL::open -proto UDP -pool syslog]
    set hsl2 [HSL::open -proto UDP -pool syslog2]
    .....
    HSL::send $hsl "$currenttime,$saddr,$sport,$Bsaddr,$Bsport,$serveraddr"
    HSL::send $hsl2 "$currenttime,$saddr,$sport,$Bsaddr,$Bsport,$serveraddr"
    .....


  • ヘルスチェックの結果がfailになった時点で出力先を切り替える

    このときはiRuleでアクティブなメンバーを見てpoolを切り替えます。
    when CLIENT_ACCEPTED {
    if { [active_members syslog] > 0 } {
    set hsl [HSL::open -proto UDP -pool syslog]
    } elseif { [active_members syslog2] > 0 } {
    set hsl [HSL::open -proto UDP -pool syslog2]
    }
    .....

    Poolのステータスを見て切り替えているため、実際にsyslogサーバーがログメッセージの受信不可状態に陥ってからヘルスチェックがダウンを検知するまでにタイムラグがあり、その間のログは消失するので注意が必要です。

    ]]><![CDATA[ ]]>
  • http://bigipcookbook.seesaa.net/article/160334983.html 負荷生成ソフトを使ってみる ネットワーク機器などの性能を検証するものとして、IXIA IXLoadやSpirent Web AvalancheなどのアプライアンスモノやLoadRunnerなどの商用ソフトがありますが、個人ではとても手が出ません。さらにDUT(Device Under Test)となる機器/ソフトも高性能化が著しくローエンドの負荷生成アプライアンスではもはや最大性能が確認できません。とはいえ最大性能でなくても良いから負荷を計測したいという場合にはフリーソフトがいくつかあります。今使ってい.. Linux Takahiro 2010-08-23T16:19:07+09:00 <![CDATA[ ネットワーク機器などの性能を検証するものとして、IXIA IXLoadやSpirent Web AvalancheなどのアプライアンスモノやLoadRunnerなどの商用ソフトがありますが、個人ではとても手が出ません。さらにDUT(Device Under Test)となる機器/ソフトも高性能化が著しくローエンドの負荷生成アプライアンスではもはや最大性能が確認できません。とはいえ最大性能でなくても良いから負荷を計測したいという場合にはフリーソフトがいくつかあります。

    今使っているのはcurl-loaderというソフトで、Webアプリケーションが単純なものであればだいたい問題無い感じです。

    Ubuntu 10.04 LTSに入れましたが、いくつかパッケージをインストールしただけであっさりコンパイルが成功し、問題無く使えています。ただし"-t"オプションでマルチコアに対応させようとするとSegmentation Faultするため今後要調査です。 ]]><![CDATA[ ]]>
    http://bigipcookbook.seesaa.net/article/159832793.html HAペアの設定が同期されているかどうかを知りたい LTMでHAペアを構成し、どちらかのユニットに設定(IPアドレスなどそのデバイス固有の設定を除く)を行った際にはconfig-syncなどの方法で設定を同期しておく必要がありますが、現在設定が同期されているかどうかを確認する方法があります。GUIでの設定はSystem ›› High Availability : ConfigSyncのDetect ConfigSync Statusをチェックするだけです。コマンドラインからの設定とその同期root@cookbook2(A.. テクニック Takahiro 2010-08-18T16:21:56+09:00 <![CDATA[ LTMでHAペアを構成し、どちらかのユニットに設定(IPアドレスなどそのデバイス固有の設定を除く)を行った際にはconfig-syncなどの方法で設定を同期しておく必要がありますが、現在設定が同期されているかどうかを確認する方法があります。

    GUIでの設定はSystem ›› High Availability : ConfigSyncのDetect ConfigSync Statusをチェックするだけです。

    コマンドラインからの設定とその同期
    root@cookbook2(Active)(tmos)# modify sys config-sync auto-detect enabled
    root@cookbook2(Active)(tmos)# list sys config-sync auto-detect enabled
    sys config-sync {
    auto-detect enabled
    }
    root@cookbook2(Active)(tmos)# run sys config-sync
    Checking configuration on local system and peer system...
    Peer's IP address: 10.10.40.252
    Synchronizing Master Keys...
    Saving active configuration...
    Configsync Mode: Push
    Transferring UCS to peer...
    Installing UCS on peer...
    Obtaining results of remote configuration installation...
    Saving active configuration...
    Current configuration backed up to /var/local/ucs/cs_backup.ucs.
    Product : BIG-IP
    Version : 10.2.0
    Hostname: UCS : cookbook2.example.com
    System: cookbook.example.com
    Installing --shared-- configuration on host cookbook.example.com
    Installing configuration...
    Post-processing...
    Reading configuration from /config/low_profile_base.conf.
    Reading configuration from /defaults/config_base.conf.
    Reading configuration from /config/bigip_sys.conf.
    Reading configuration from /config/bigip_base.conf.
    Reading configuration from /usr/share/monitors/base_monitors.conf.
    Reading configuration from /config/profile_base.conf.
    Reading configuration from /config/daemon.conf.
    Reading configuration from /config/bigip.conf.
    Reading configuration from /config/bigip_local.conf.
    Loading the configuration ...


    見え方
    1. 設定が同期されていないとき
      root@cookbook2(Active)(tmos)# sh sys config-sync
      CONFIG SYNC STATUS --
      Status 2 - Peer config modified, recommend configsync from peer
      Last change (Self) 2010-08-18 16:09:27
      Last change (Peer) 2010-08-18 16:10:48
      Last Configsync 2010-08-18 16:10:03

      GUIではこのように見えます。
      syncrecommended.jpg

    2. 設定が同期されているとき
      root@cookbook2(Active)(tmos)# sh sys config-sync
      CONFIG SYNC STATUS --
      Status 0 - Synchronized
      Last change (Self) 2010-08-18 16:09:27
      Last change (Peer) 2010-08-18 16:17:04
      Last Configsync 2010-08-18 16:17:04

      GUIではこのように見えます。
      synced.jpg

    Javascriptで勝手に画面を更新してくれる分GUIの方がわかりやすいですね。

    ConfigSyncで同期される内容などの情報はこちら。
    AskF5 | Solution: SOL7024 - Overview of the configsync process

    ]]><![CDATA[ ]]>
    http://bigipcookbook.seesaa.net/article/159764320.html Ubuntuのバージョンを確認する 検証環境のクライアント/サーバーでUbuntu Linuxを愛用しています。ルーター、管理サーバー、Webサーバー、クライアント等の用途で10VM程度が動作していますが、特にバージョン管理もしていないのでバラバラのバージョンが動作しています。Ubuntu自体のバージョン情報はunameでは出てこないのでどのように調べたものかと思っていたらかなり前に賢者が確認方法をシェアしてくれていました。ubuntuのバージョンを確認する方法 - 気負わない日記 Linux Takahiro 2010-08-17T22:33:57+09:00 <![CDATA[ 検証環境のクライアント/サーバーでUbuntu Linuxを愛用しています。
    ルーター、管理サーバー、Webサーバー、クライアント等の用途で10VM程度が動作していますが、特にバージョン管理もしていないのでバラバラのバージョンが動作しています。

    Ubuntu自体のバージョン情報はunameでは出てこないのでどのように調べたものかと思っていたらかなり前に賢者が確認方法をシェアしてくれていました。

    ubuntuのバージョンを確認する方法 - 気負わない日記
    ]]><![CDATA[ ]]>
    http://bigipcookbook.seesaa.net/article/159763454.html 明日から本気を出す   日記 Takahiro 2010-08-17T22:23:55+09:00 <![CDATA[   ]]><![CDATA[ ]]> http://bigipcookbook.seesaa.net/article/154706353.html Sorryサーバーの役割を持たせたい Webサービスなどでは、振分先のサーバーが全滅した際にSorryサーバーに振分けたりリダイレクトしたりしますが、Sorryサーバー用のコンテンツをBIG-IPで返すことによってSorryサーバーが不要になります。Data Group(Class)というものをiRuleから参照するような方式にし、コンテンツに変更があった場合にもコードそのものを変更しなくてもすむようにします。(コンテンツの数が変わったときにはコードの変更が必要です)ルールrule sry2 { when H.. テクニック Takahiro 2010-06-28T09:56:02+09:00 <![CDATA[ Webサービスなどでは、振分先のサーバーが全滅した際にSorryサーバーに振分けたりリダイレクトしたりしますが、Sorryサーバー用のコンテンツをBIG-IPで返すことによってSorryサーバーが不要になります。

    Data Group(Class)というものをiRuleから参照するような方式にし、コンテンツに変更があった場合にもコードそのものを変更しなくてもすむようにします。(コンテンツの数が変わったときにはコードの変更が必要です)

    ルール
    rule sry2 {
    when HTTP_REQUEST {
    set uri [HTTP::uri]
    if { [ active_members httppool ] < 1 }{
    switch -- $uri {
    "/logo.png" {
    HTTP::respond 200 content [b64decode [class element -value 1 maint_index_html]] "Content-Type" "image/png"
    }
    default {
    HTTP::respond 200 content [class element -value 0 maint_index_html] "Content-Type" "text/html"
    }
    }
    return
    }
    }


    設定
    class maint_index_html {
    type string
    filename "/config/srycontent"
    mode read
    separator ":="
    }


    ルールから参照するファイル
    [root@bigip1:Active] config # cat srycontent

    "/maint.html" := "<html><head><title>Maintenance page</title></head><body><p><h2>&#12383;&#12384;&#12356;&#12414;&#12469;&#12540;&#12499;&#12473;&#20572;&#27490;&#20013;&#12391;&#12377;</h2><img src=/logo.png></body></html>",


    "/logo.png" := "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",


    コンテンツに関する注意事項


    BIG-IPの設定ファイルで取り扱える文字形式がASCIIのテキストのみであるため、コンテンツをBIG-IPに設定するときには3点の注意事項があります。
    1. 日本語は文字参照形式に変換する必要があります
    2. バイナリはbase64でエンコードし、コードの中でデコードする必要があります
    3. 各オブジェクトのサイズは64kBが上限です(ファイルサイズの上限ではないことに注意)


    処理性能が心配


    iRulesを使用したときのCPU負荷に関してはこちらに計算方法と計算用のExcelシートへのリンクがあります。凝ったコンテンツなどを使用していて処理負荷が心配な場合、以下のような方法もあります。

    VIP targeting VIP


    Virtual Server(VS)から別のVSにトラフィックを投げることが可能です。これを使用して以下のようなフローを組み立てます。

    |client| ---> |VS1| ----> |VS2|

    VS1では振分先PoolのUp/Down判別およびコンテンツのキャッシュを行い、VS2ではSorryコンテンツの返答を行います。具体的には以下のような構成になります。

    設定
    root@bigip1(Active)(tmos)# list ltm virtual httpVS
    ltm virtual httpVS {
    destination x.x.x.x:http
    ip-protocol tcp
    mask 255.255.255.255
    pool httppool
    profiles {
    http-caching { }
    tcp { }
    }
    rules {
    sry3
    }
    snat automap
    }
    root@bigip1(Active)(tmos)# list ltm virtual SRY-VS
    ltm virtual SRY-VS {
    destination 9.9.9.9:http
    ip-protocol tcp
    mask 255.255.255.255
    profiles {
    http { }
    tcp { }
    }
    rules {
    sry4
    }
    }
    root@jpn223(Active)(tmos)# list ltm rule sry3
    ltm rule sry3 {
    when HTTP_REQUEST {
    if { [ active_members httppool ] < 1 }{
    CACHE::enable
    virtual SRY-VS
    } else {
    CACHE::disable
    }
    }
    }
    root@bigip1(Active)(tmos)# list ltm rule sry4
    ltm rule sry4 {
    when HTTP_REQUEST {
    set uri [HTTP::uri]
    switch -- $uri {
    "/logo.png" {
    HTTP::respond 200 content [b64decode [class element -value 1 maint_index_html]] "Content-Type" "image/png"
    }
    default {
    HTTP::respond 200 content [class element -value 0 maint_index_html] "Content-Type" "text/html"
    }
    }
    return
    }
    }


    Sorryサーバーではなく、Pool Memberに振り分けられたトラフィックに対してもキャッシュしたい場合はsry3のCACHE::disable/CACHE::enableコマンドを外しても問題ありません。

    派生形


    VIP targeting VIPを使用すると上記の例でのVSがL4のVSであってもSorryコンテンツの返答が可能になります。たとえばこんな具合に。
    ltm rule sry3 {
    when CLIENT_ACCEPTED {
    if { [ active_members httppool ] < 1 }{
    virtual SRY-VS
    }
    }
    }
    ]]><![CDATA[ ]]>
    http://bigipcookbook.seesaa.net/article/150721212.html サーバー側のネットワークに変更を加えずIPv6のトラフィックを受け付けたい -2/2- 前回はBIG-IP自信と周辺のデバイスがIPv6で通信できるように設定をしましたが、今回はBIG-IPで管理されるトラフィックに関する設定を行います。ここでは単にVS(Virtual Server)を設定するだけなので難しい話ではありません。現状の設定の確認現在はVSやPoolの設定は以下のようになっています。root@cookbook(Active)(tmos)# list ltm virtualltm virtual HTTP-VS-IPv4 { destinati.. 設定 Takahiro 2010-05-22T22:50:58+09:00 <![CDATA[ 前回はBIG-IP自信と周辺のデバイスがIPv6で通信できるように設定をしましたが、今回はBIG-IPで管理されるトラフィックに関する設定を行います。ここでは単にVS(Virtual Server)を設定するだけなので難しい話ではありません。

    現状の設定の確認


    現在はVSやPoolの設定は以下のようになっています。
    root@cookbook(Active)(tmos)# list ltm virtual
    ltm virtual HTTP-VS-IPv4 {
    destination 10.10.88.21:http
    ip-protocol tcp
    mask 255.255.255.255
    pool http-pool1
    profiles {
    http { }
    tcp { }
    }
    }
    root@cookbook(Active)(tmos)# list ltm pool http-pool1
    ltm pool http-pool1 {
    members {
    10.10.40.40:http {
    session monitor-enabled
    }
    10.10.40.41:http {
    session monitor-enabled
    }
    }
    monitor gateway_icmp
    }

    Poolを共有したいので、このhttp-pool1を新しく作るVSに関連づけることにします。

    設定


    しつこいですが、1個VSを作成するだけなのでコマンド一個で済んでしまいます。
    root@cookbook2(Active)(tmos)# create ltm virtual HTTP-VS-IPv6 { destination fd00:10:10:88::21.http ip-protocol tcp mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff pool http-pool1 profiles add { http { } tcp { } } }

    確認しましょう
    root@cookbook(Active)(tmos)# list ltm virtual
    ltm virtual HTTP-VS-IPv4 {
    destination 10.10.88.21:http
    ip-protocol tcp
    mask 255.255.255.255
    pool http-pool1
    profiles {
    http { }
    tcp { }
    }
    }
    ltm virtual HTTP-VS-IPv6 {
    destination fd00:10:10:88::21.http
    ip-protocol tcp
    pool http-pool1
    profiles {
    http { }
    tcp { }
    }
    }


    疎通確認


    前回はWindowsのクライアントを使用しましたが、スクリーンショットを取るのが面倒なので今回はLinuxのクライアントを用意しました。このクライアントから疎通確認を行います。
    $ curl -g http://[fd00:10:10:88::21]/env.php



    Destination IP Address:Port -> 10.10.40.41:80
    Source IP Address:Port -> 10.10.40.254:56801
    X-Forwarded-For ->


    Source IP Addressの10.10.40.254はBIG-IP自身のinternal VLANに設定されているfloating addressです。VSにはSNATの設定が行われていませんが、v6/v4の変換をVSで行う場合でSNATが明示的に設定されていない場合は自動的にSNAT Automapが設定されているのと同じ動きをします。

    トラフィックが少ない場合はこれでいいのですが、一個のIPアドレスで使用可能なポート番号には限りがあるため同時接続数が多い場合には複数のSNATアドレスを用意する必要があります。また、クライアントのソースIPアドレスをサーバーで知りたいケースもあると思うのでこれにも対処します。

    SNAT Poolの利用


    v6に限らない話ですが、BIG-IPでSNATをするときには前述の通りポート番号の枯渇に注意する必要があります。Automapでは単一IPアドレスを使用するので、SNAT Poolを使用して複数のアドレスを使用可能にします。今回はinternal VLANのセグメントのIPアドレス3個をSNAT用にします。
    root@cookbook(Active)(tmos)# create ltm snatpool internalSNATPool members add { 10.10.40.201 10.10.40.202 10.10.40.203 }

    これを作成したVSに関連付けます。
    root@cookbook(Active)(tmos)# modify ltm virtual HTTP-VS-IPv6 snatpool internalSNATPool


    X-Forwarded-Forヘッダの利用


    BIG-IPでトラフィックを処理するときに、以前のSSLのときと同様にヘッダを挿入します。今回はX-Forwarded-Forヘッダを使用します。このヘッダの挿入はHTTP Profileで定義可能なので、新しくHTTP Profileを作成してこれをVSに関連付けます。
    root@cookbook(Active)(tmos)# create ltm profile http http1 insert-xforwarded-for enabled 
    root@cookbook(Active)(tmos)# modify ltm virtual HTTP-VS-IPv6 profiles replace-all-with { http1 { } }
    root@cookbook(Active)(tmos)# list ltm virtual HTTP-VS-IPv6 ltm virtual HTTP-VS-IPv6 {
    destination fd00:10:10:88::21.http
    ip-protocol tcp
    pool http-pool1
    profiles {
    http1 { }
    tcp { }
    }
    snatpool internalSNATPool
    }


    疎通確認


    $ curl -g http://[fd00:10:10:88::21]/env.php



    Destination IP Address:Port -> 10.10.40.41:80
    Source IP Address:Port -> 10.10.40.201:46568
    X-Forwarded-For -> fd00:10:20::20
    ]]><![CDATA[ ]]>
    http://bigipcookbook.seesaa.net/article/150678812.html サーバー側のネットワークに変更を加えずIPv6のトラフィックを受け付けたい -1/2- IPv4で運用しているシステムをIPv6でも使いたい場合、BIG-IPおよびその上位のルーター等にIPv6の設定を追加するとサーバー側に変更を加えずIPv6のリクエストを受けて処理をさせることができます。現状の構成たとえば以下のような構成になっているものとします。ちなみにですが、この環境はBIG-IPも含め全部同一の物理サーバーで動作しています。BIG-IPは最近ダウンロードが可能になったVEを使用しています。IPv6を入れた構成簡単にするためルーターとクライアントはDual.. 設定 Takahiro 2010-05-22T12:26:25+09:00 <![CDATA[ IPv4で運用しているシステムをIPv6でも使いたい場合、BIG-IPおよびその上位のルーター等にIPv6の設定を追加するとサーバー側に変更を加えずIPv6のリクエストを受けて処理をさせることができます。

    現状の構成


    たとえば以下のような構成になっているものとします。
    v4only.png
    ちなみにですが、この環境はBIG-IPも含め全部同一の物理サーバーで動作しています。BIG-IPは最近ダウンロードが可能になったVEを使用しています。

    IPv6を入れた構成


    v4v6.png
    簡単にするためルーターとクライアントはDual Stackにしています。当然BIG-IPもDual Stackです。

    手順


    同一ルーターを使用するため、L1L2の設定や構成は何一つ変わらず、L3の設定をしていって最後にVS(Virtual Server)の設定をすれば完了します。

    1. ルーターとクライアントの設定確認
      • クライアントの設定
        クライアントのWindows7では以下のようにアドレスを設定しました。デフォルトゲートウェイはルーターのリンクローカルアドレスにしています。
        windowsIF.jpg
      • ルーターの設定
        LInuxで構成しているルーターは以下のような設定になっています

        $ ip ad show  dev eth3
        5: eth3: mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:96:70:d7 brd ff:ff:ff:ff:ff:ff
        inet 10.20.0.254/24 brd 10.20.0.255 scope global eth3
        inet6 fd00:10:20::254/64 scope global
        valid_lft forever preferred_lft forever
        inet6 fe80::20c:29ff:fe96:70d7/64 scope link
        valid_lft forever preferred_lft forever
        $ ip ad show dev eth7
        9: eth7: mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:96:70:ff brd ff:ff:ff:ff:ff:ff
        inet 10.10.88.250/24 brd 10.10.88.255 scope global eth7
        inet6 fd00:10:10:88::250/64 scope global
        valid_lft forever preferred_lft forever
        inet6 fe80::20c:29ff:fe96:70ff/64 scope link
        valid_lft forever preferred_lft forever

    2. 疎通確認
      クライアントからルーターまでの疎通確認をします。
      WindowsからルーターまでのPING.jpg
    3. BIG-IPの設定(Self)
      BIG-IPの設定は、周辺の装置との疎通という意味ではSelfIPを設定するだけなので、以下の通り設定します。
      • 各装置のSelf IPの設定
        1号機
        root@cookbook(Standby)(tmos)# create net self fd00:10:10:88::252/64 vlan external 
        root@cookbook(Standby)(tmos)# create net self fd00:10:10:88::254/64 vlan external floating enabled unit 1
        2号機
        root@cookbook2(Active)(tmos)# create net self fd00:10:10:88::253/64 vlan external
        root@cookbook2(Active)(tmos)# create net self fd00:10:10:88::254/64 vlan external floating enabled unit 2

      • default gatewayの設定とその設定の同期
        root@cookbook2(Active)(tmos)# create net route default-inet6 gw fe80::20c:29ff:fe96:70ff interface external
        root@cookbook2(Active)(tmos)# run sys config-sync


    4. クライアントからの疎通確認
      以下のようにうまくいきました。
      ping2self.jpg

    Self IPとGatewayを設定するだけでIPv6の設定が完了しました。
    実際のトラフィックを受け付けるにはVSの設定が必要ですが、それについては次回書きます。 ]]><![CDATA[ ]]>
    http://bigipcookbook.seesaa.net/article/149434046.html クライアントがHTTPSでアクセスしているかどうかをサーバで知りたい HTTPSのサービスにおいてBIG-IPでSSLを終端しているときは、BIG-IPとサーバーの間の通信はHTTPで行われるので、サーバーやサーバーアプリケーションではクライアントがSSLを使用してアクセスしてきているかどうかがわからないためにアプリ開発をする人がこれを嫌うこともありますが、SSL終端を行うことによっていくつかのメリットもあります。証明書/鍵管理の集中化サーバーでSSL処理を行わせると、証明書更新のときにサーバーの台数分証明書交換のオペレーションが発生しますL7.. テクニック Takahiro 2010-05-10T13:14:27+09:00 <![CDATA[ HTTPSのサービスにおいてBIG-IPでSSLを終端しているときは、BIG-IPとサーバーの間の通信はHTTPで行われるので、サーバーやサーバーアプリケーションではクライアントがSSLを使用してアクセスしてきているかどうかがわからないためにアプリ開発をする人がこれを嫌うこともありますが、SSL終端を行うことによっていくつかのメリットもあります。

    • 証明書/鍵管理の集中化
      サーバーでSSL処理を行わせると、証明書更新のときにサーバーの台数分証明書交換のオペレーションが発生します
    • L7トラフィック管理
      クライアント/サーバー間が暗号化されてしまうと中間に入るデバイスはL7の情報を見てトラフィック管理をできなくなります)
    • TPSあたりのコスト
      厳密に計算したことはありませんが、SSLの1トランザクションあたりの処理コストはBIG-IPで終端した方が有利なことが多いようです

    システム全体で見たときにどちらが楽かは諸説ありますが、BIG-IPで終端する場合はHTTPSのVirtualServerで受けたトラフィックをサーバーに転送する際にHTTPヘッダーにそれとわかる内容を入れておけば良いでしょう。X-Forwarded-Forのような取り決められたヘッダー名は無いようなので、適当に決めてサーバー/アプリを作る人に教えてあげます。今回は"X-SSL: 1"というヘッダーを入れておきます。

    これを行うにはHTTP Profileを使用します。
    以下、設定です。
    root@cookbook(Active)(tmos)# list ltm profile http http1
    ltm profile http http1 {
    defaults-from http
    header-insert "X-SSL: 1"
    }

    このProfileをVSに設定します。
    ltm virtual httpsVS {
    destination 10.10.88.21:https
    ip-protocol tcp
    mask 255.255.255.255
    pool httppool
    profiles {
    clientssl {
    context clientside
    }
    http1 { }
    tcp { }
    }
    snat automap
    }

    ちなみに比較用に設定したHTTPのVSもほぼ同じ設定です。
    root@cookbook(Active)(tmos)# list ltm virtual httpVS
    ltm virtual httpVS {
    destination 10.10.88.21:http
    ip-protocol tcp
    mask 255.255.255.255
    pool httppool
    profiles {
    http { }
    tcp { }
    }
    snat automap
    }

    snat automapはこの検証環境で必要なだけで、必須ではありません。
    また、サーバー側では確認用に環境変数を出力する以下のようなプログラムを用意しています。
    # cat env_al.php
    <?php
    foreach ($_SERVER as $key => $val)
    {
    print "\n";
    print "$key -> ";
    print "$val";
    }
    print "\n\n\n";

    ?>

    それでは確認しましょう。最初はHTTPのVSにアクセスしてみます。
    $ curl http://10.10.88.21/env_al.php

    HTTP_USER_AGENT -> curl/7.18.2 (x86_64-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.10
    HTTP_HOST -> 10.10.88.21
    HTTP_ACCEPT -> */*
    PATH -> /usr/local/bin:/usr/bin:/bin
    SERVER_SIGNATURE ->
    Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.5 with Suhosin-Patch Server at 10.10.88.21 Port 80


    SERVER_SOFTWARE -> Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.5 with Suhosin-Patch
    SERVER_NAME -> 10.10.88.21
    SERVER_ADDR -> 10.10.40.40
    SERVER_PORT -> 80
    REMOTE_ADDR -> 10.10.40.252
    DOCUMENT_ROOT -> /var/www
    SERVER_ADMIN -> webmaster@localhost
    SCRIPT_FILENAME -> /var/www/env_al.php
    REMOTE_PORT -> 57457
    GATEWAY_INTERFACE -> CGI/1.1
    SERVER_PROTOCOL -> HTTP/1.1
    REQUEST_METHOD -> GET
    QUERY_STRING ->
    REQUEST_URI -> /env_al.php
    SCRIPT_NAME -> /env_al.php
    PHP_SELF -> /env_al.php
    REQUEST_TIME -> 1273465320
    argv -> Array
    argc -> 0
    次にHTTPSのVSにアクセスしてみます。


    $ curl -k https://10.10.88.21/env_al.php

    HTTP_USER_AGENT -> curl/7.18.2 (x86_64-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.10
    HTTP_HOST -> 10.10.88.21
    HTTP_ACCEPT -> */*
    HTTP_X_SSL -> 1
    PATH -> /usr/local/bin:/usr/bin:/bin
    SERVER_SIGNATURE ->
    Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.5 with Suhosin-Patch Server at 10.10.88.21 Port 80


    SERVER_SOFTWARE -> Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.5 with Suhosin-Patch
    SERVER_NAME -> 10.10.88.21
    SERVER_ADDR -> 10.10.40.40
    SERVER_PORT -> 80
    REMOTE_ADDR -> 10.10.40.252
    DOCUMENT_ROOT -> /var/www
    SERVER_ADMIN -> webmaster@localhost
    SCRIPT_FILENAME -> /var/www/env_al.php
    REMOTE_PORT -> 45476
    GATEWAY_INTERFACE -> CGI/1.1
    SERVER_PROTOCOL -> HTTP/1.1
    REQUEST_METHOD -> GET
    QUERY_STRING ->
    REQUEST_URI -> /env_al.php
    SCRIPT_NAME -> /env_al.php
    PHP_SELF -> /env_al.php
    REQUEST_TIME -> 1273465344
    argv -> Array
    argc -> 0

    正しく設定したヘッダーがサーバーに届けられてることがわかりました。アプリケーションではこれを使用して場合分けした処理をすることができます。

    余談ですが、今回からは先日ダウンロード可能になったTMOS 10.2を使用しています。細かい部分は変わりませんがお使いのバージョンと動作やオペレーションが異なることがありますのでご注意ください。 ]]><![CDATA[ ]]>
    http://bigipcookbook.seesaa.net/article/145314207.html 管理しているコネクションの情報を見たい BIG-IPが取り扱っているコネクションの情報を見るTipsです。1. 統計情報の確認統計情報は使用しているオブジェクトごと、またはシステム全体での情報を見ることができます。たとえば以下のような設定がある場合、root@bigiplab(Active)(tmos)# list ltm virtualltm virtual http-vs1 { connection-limit 1 destination 10.10.30.9:http ip-protocol.. テクニック Takahiro 2010-04-01T12:11:07+09:00 <![CDATA[ BIG-IPが取り扱っているコネクションの情報を見るTipsです。

    1. 統計情報の確認

    統計情報は使用しているオブジェクトごと、またはシステム全体での情報を見ることができます。たとえば以下のような設定がある場合、
    root@bigiplab(Active)(tmos)# list ltm virtual
    ltm virtual http-vs1 {
    connection-limit 1
    destination 10.10.30.9:http
    ip-protocol tcp
    mask 255.255.255.255
    pool http-pool
    profiles {
    http { }
    tcp { }
    }
    }

    1. Virtual Address
    2. Virtual Server
    3. Pool
    4. Pool Member
    5. Node
    6. http Profile
    7. tcp Profile

    についての情報を見ることができます。それぞれ以下のような感じで出てきます。
    Virtual Addressの統計
    root@bigiplab(Active)(tmos)# sh ltm virtual-address 10.10.30.9

    Ltm::Virtual Address: 10.10.30.9
    -------------------------------------------------
    Status
    Availability : available
    State : enabled
    Reason : The virtual address is available

    Traffic ClientSide
    Bits In 79.6K
    Bits Out 79.6K
    Packets In 137
    Packets Out 107
    Current Connections 0
    Maximum Connections 3
    Total Connections 29


    Virtual Serverの統計

    root@bigiplab(Active)(tmos)# sh ltm virtual http-vs1

    Ltm::Virtual Server: http-vs1
    ---------------------------------------------------------
    Status
    Availability : available
    State : enabled
    Reason : The virtual server is available
    CMP : enabled
    CMP Mode : all-cpus

    Traffic ClientSide Ephemeral General
    Bits In 58.9K 0 -
    Bits Out 63.2K 0 -
    Packets In 102 0 -
    Packets Out 80 0 -
    Current Connections 0 0 -
    Maximum Connections 2 0 -
    Total Connections 21 0 -
    Min Conn Duration/msec - - 6
    Max Conn Duration/msec - - 303.2K
    Mean Conn Duration/msec - - 24.1K
    Total Requests - - 14


    Poolの統計
    root@bigiplab(Active)(tmos)# sh ltm pool http-pool

    Ltm::Pool: http-pool
    --------------------------------------
    Status
    Availability : available
    State : enabled
    Reason : The pool is available

    Traffic ServerSide
    Bits In 37.3K
    Bits Out 52.0K
    Packets In 64
    Packets Out 43
    Current Connections 0
    Maximum Connections 2
    Total Connections 15


    Pool Memberの統計
    root@bigiplab(Active)(tmos)# sh ltm pool http-pool members

    Ltm::Pool: http-pool
    --------------------------------------
    Status
    Availability : available
    State : enabled
    Reason : The pool is available

    Traffic ServerSide
    Bits In 37.3K
    Bits Out 52.0K
    Packets In 64
    Packets Out 43
    Current Connections 0
    Maximum Connections 2
    Total Connections 15

    Ltm::Pool Member: http-pool 10.10.40.40:80
    -------------------------------------------
    Status
    Availability : available
    State : enabled
    Reason : Pool member is available

    Traffic ServerSide General
    Bits In 37.3K -
    Bits Out 52.0K -
    Packets In 64 -
    Packets Out 43 -
    Current Connections 0 -
    Maximum Connections 2 -
    Total Connections 15 -
    Total Requests - 10


    Nodeの統計
    root@bigiplab(Active)(tmos)# sh ltm node 10.10.40.40

    Ltm::Node: 10.10.40.40
    --------------------------------------------------------------------
    Status
    Availability : unknown
    State : enabled
    Reason : Node address does not have service checking enabled

    Traffic ServerSide General
    Bits In 37.3K -
    Bits Out 52.0K -
    Packets In 64 -
    Packets Out 43 -
    Current Connections 0 -
    Maximum Connections 2 -
    Total Connections 15 -
    Total Requests - 10


    HTTP Profileの統計
    root@bigiplab(Active)(tmos)# sh ltm profile http http

    Ltm::HTTP Profile: http
    -------------------------------------------------------------
    Requests
    GET 15
    POST 0
    Version 0.9 0
    Version 1.0 0
    Version 1.1 15
    Maximum Per Connection 1
    Total 15

    Responses
    Successful 7
    Redirection 0
    Client-Errors 3
    Server-Errors 0
    Version 0.9 0
    Version 1.0 0
    Version 1.1 10

    Response Size
    Under 1K 10
    Under 4K 0
    Under 16K 0
    Under 32K 0
    Under 64K 0
    Under 128K 0
    Under 512K 0
    Under 2M 0
    Over 2M 0

    Miscellaneous
    Set-Cookie Insertions 0

    Content Type Compression (bytes) Pre-Compress Post-Compress
    HTML 0 0
    CSS 0 0
    JavaScript 0 0
    XML 0 0
    SGML 0 0
    Plain 0 0
    Octet Stream 0 0
    Images 0 0
    Video Files 0 0
    Audio Files 0 0
    Other 0 0
    Total 0 0
    NULL-Compress 0 0

    RAM Cache
    Cache Size (in Bytes) 0
    Total Cached Items 0
    Total Evicted Items 0
    Inter-Stripe Size (in Bytes) 0
    Inter-Stripe Cached Items 0
    Inter-Stripe Evicted Items 0

    RAM Cache Hits/Misses Count Bytes
    Hits 0 0
    Misses (Cacheable) 0 0
    Misses (Total) 0 0
    Inter-Stripe Hits 0 0
    Inter-Stripe Misses 0 -
    Remote Hits 0 0
    Remote Misses 0 -


    TCP Profileの統計
    root@bigiplab(Active)(tmos)# sh ltm profile tcp tcp

    Ltm::TCP Profile: tcp
    ------------------------------------
    Connections
    Open 0
    Current in CLOSE-WAIT/LAST-ACK 0
    Current in FIN-WAIT/CLOSING 0
    Current in TIME-WAIT 0
    Accepted 29
    Not Accepted 0
    Established 10
    Failed 0
    Expired 1
    Abandoned 5

    Miscellaneous
    Received Reset 0
    Bad Checksum Datagrams 0
    Malformed Segments 0
    Out-of-Order Segments 0
    Received SYN-Cookies 0
    Received Bad SYN-Cookies 0
    SYN-Cache Overflow 0
    Retransmitted Segments 0


    Profileを複数のサービス(VS)で共有していると、統計情報はミックスの値になるため、用途によってはサービスごとにProfileを作成した方が良いでしょう。


    2. コネクション状況の確認

    BIG-IPでtmmが取り扱うコネクションは全てコネクションテーブルに載り、これを見ることができます。

    例A Standard VSで振分先がまだ決定していない状態
    root@bigiplab(Active)(tmos)# sh sys connection
    Sys::Connections
    10.10.88.1:49127 10.10.30.9:80 ::.0 tcp 0
    Total records returned: 1


    詳細情報の表示
    root@bigiplab(Active)(tmos)# sh sys connection all-properties
    Sys::Connections
    10.10.88.1:49127 - 10.10.30.9:80 - ::.0
    -------------------------------------------
    TMM 0
    Type any
    Protocol tcp
    Idle Time 11
    Idle Timeout 300
    Unit ID 1
    Lasthop external 00:0c:29:96:70:cd
    Virtual Path 10.10.30.9:80

    ClientSide ServerSide
    Client Addr 10.10.88.1:49127 ::.0
    Server Addr 10.10.30.9:80 ::.0
    Bits In 896 0
    Bits Out 480 0
    Packets In 2 0
    Packets Out 1 0

    Total records returned: 1


    例B 振分先が決まった後
    root@bigiplab(Active)(tmos)# sh sys connection all-properties
    Sys::Connections
    10.10.88.1:49127 - 10.10.30.9:80 - 10.10.40.40:80
    -------------------------------------------------
    TMM 0
    Type any
    Protocol tcp
    Idle Time 8
    Idle Timeout 300
    Unit ID 1
    Lasthop external 00:0c:29:96:70:cd
    Virtual Path 10.10.30.9:80

    ClientSide ServerSide
    Client Addr 10.10.88.1:49127 10.10.88.1:49127
    Server Addr 10.10.30.9:80 10.10.40.40:80
    Bits In 2.8K 4.0K
    Bits Out 4.4K 1.9K
    Packets In 6 3
    Packets Out 4 4

    Total records returned: 1


    今は一個しかテーブルエントリーが無いのでこの出力のみですが、以下のような条件で検索できます。
    • age : idle時間(100を指定すればidle 100秒以下のコネクションが表示されます)
    • cs-client-port : クライアント側通信のクライアントポート番号またはサービス名
    • cs-server-port : クライアント側通信のBIG-IPのポート番号
    • ss-server-addr : サーバ側通信のサーバのIPアドレス
    • type : selfIPへの通信か、ミラー用通信かの指定
    • cs-client-addr : クライアント側通信のクライアントのIPアドレス
    • cs-server-addr : クライアント側通信のBIG-IPのIPアドレス
    • protocol : プロトコルの指定
    • ss-server-port : サーバ側通信のサーバポート番号


    クライアント側とは先にパケットを送ってきた方(TCPで言えばSYNを送ってきた方)を指します。

    |Client|(cs-client)----(cs-server)|BIG-IP|---(ss-server)|Server|

    ちなみにconnection tableはmodifyコマンドでidle timeoutの値を変更できます。 ]]><![CDATA[ ]]>
    http://bigipcookbook.seesaa.net/article/142186811.html Self IPと異なるサブネットでの通信2(Outbound) 前回と同じ構成で、今度はServerから開始されるClientへの通信を扱ってみましょう。まだBIG-IPにはルーティングは設定されていませんが、Routerには100.100.100.100宛のルーティングが設定されています。また、確認用にClientにもWeb Serverがインストールされています。最初にBIG-IPのデフォルトゲートウェイを設定します。root@bigiplab(Active)(tmos)# create net route default gw 10.. テクニック Takahiro 2010-02-26T10:46:20+09:00 <![CDATA[ 前回と同じ構成で、今度はServerから開始されるClientへの通信を扱ってみましょう。
    まだBIG-IPにはルーティングは設定されていませんが、Routerには100.100.100.100宛のルーティングが設定されています。また、確認用にClientにもWeb Serverがインストールされています。

    最初にBIG-IPのデフォルトゲートウェイを設定します。
    root@bigiplab(Active)(tmos)# create net route default gw 10.10.30.250

    次にSNATの設定をしましょう。
    root@bigiplab(Active)(tmos)# create ltm snat outbound1 origins add { 10.10.40.0/24 } translation 100.100.100.100


    これで通信が可能になります。
    Server# curl http://10.10.88.1/env.php

    Destination IP Address:Port -> 10.10.88.1:80
    Source IP Address -> 100.100.100.100:44139
    X-Forwarded-For ->


    この例のように、前回設定したVirtual Addressと同じアドレスをSNATアドレスに設定しても差し支えありません。通信が差し支えないのはもちろんのこと、統計情報も個別に取得されます。つまり、Outboundの通信はVirtual Addressの統計情報に含まれません。

    結果的には、正しく通信できるか否かは上下のサーバーを含む通信機器次第ということになります。SNATとVSの関係については今度詳しく書きます。

    ]]><![CDATA[ ]]>
    http://bigipcookbook.seesaa.net/article/142183382.html Self IPと異なるサブネットでの通信1(Incomingとその戻り) Self IPとVSやSNATで使用するサブネットの関係外部からのリクエストの受け口や、内部から外側へのゲートウェイとしてBIG-IPを使用する場合、グローバルアドレスを設定したいこともあると思います。このときにはわざわざSelf-IPもグローバルにする必要は無く、Virtual AddressやSNATの設定だけをグローバルアドレスにすれば通信ができるようになります。もちろんサーバーやルーターのルーティング設定が正しいという前提です。この構成で、ClientからBIG-IP.. テクニック Takahiro 2010-02-26T09:56:45+09:00 <![CDATA[ Self IPとVSやSNATで使用するサブネットの関係

    外部からのリクエストの受け口や、内部から外側へのゲートウェイとしてBIG-IPを使用する場合、グローバルアドレスを設定したいこともあると思います。このときにはわざわざSelf-IPもグローバルにする必要は無く、Virtual AddressやSNATの設定だけをグローバルアドレスにすれば通信ができるようになります。もちろんサーバーやルーターのルーティング設定が正しいという前提です。

    この構成で、ClientからBIG-IPを通じてServerに行くフローで試してみましょう。
    basic diagram.png

    既にL2L3の設定は入っています。
    root@bigiplab(Active)(tmos)# list net vlan
    net vlan external {
    interfaces {
    1.1 { }
    }
    tag 4094
    }
    net vlan internal {
    interfaces {
    1.2 { }
    }
    tag 4093
    }
    root@bigiplab(Active)(tmos)# list net self
    net self 10.10.30.254/24 {
    allow-service default
    vlan external
    }
    net self 10.10.40.254/24 {
    allow-service default
    vlan internal
    }


    Poolの設定とVSの設定を入れていきます。
    まずはPoolから。
    root@bigiplab(Active)(tmos)# create ltm pool http-pool monitor http members add { 10.10.40.40:80 }
    root@bigiplab(Active)(tmos)# sh ltm pool http-pool members

    Ltm::Pool: http-pool
    ---------------------------------
    Status
    Availability : available
    State : enabled
    Reason :

    Traffic ServerSide
    Bits In 0
    Bits Out 0
    Packets In 0
    Packets Out 0
    Current Connections 0
    Maximum Connections 0
    Total Connections 0

    Ltm::Pool Member: http-pool 10.10.40.40:80
    -------------------------------------------
    Status
    Availability : available
    State : enabled
    Reason : Pool member is available

    Traffic ServerSide General
    Bits In 0 -
    Bits Out 0 -
    Packets In 0 -
    Packets Out 0 -
    Current Connections 0 -
    Maximum Connections 0 -
    Total Connections 0 -
    Total Requests - 0

    次にVSの設定を入れます。
    VSのIPアドレスは100.100.100.100にしました。
    root@bigiplab(Active)(tmos)# create ltm virtual http-vs2 destination 100.100.100.100:80 profiles add { tcp http } pool http-pool
    root@bigiplab(Active)(tmos)# sh ltm virtual http-vs2

    Ltm::Virtual Server: http-vs2
    ---------------------------------------------------------
    Status
    Availability : available
    State : enabled
    Reason : The virtual server is available
    CMP : enabled
    CMP Mode : all-cpus

    Traffic ClientSide Ephemeral General
    Bits In 3.8K 0 -
    Bits Out 4.6K 0 -
    Packets In 6 0 -
    Packets Out 4 0 -
    Current Connections 0 0 -
    Maximum Connections 1 0 -
    Total Connections 1 0 -
    Min Conn Duration/msec - - 25
    Max Conn Duration/msec - - 25
    Mean Conn Duration/msec - - 25
    Total Requests - - 1

    GUIと同じですが、VSを作成するとそれに関連するVirtual Addressも自動的に作られます。
    ちなみに、図のRouterにはルーティングテーブルを追加しています。そして言うまでもありませんがServerのデフォルトゲートウェイはBIG-IPのSelf IPです。
    $ sudo ip route add default via 100.100.100.100 via 10.10.30.254 dev eth2


    ではクライアントから通信してみましょう。
    $ curl http://100.100.100.100/env.php

    Destination IP Address:Port -> 10.10.40.40:80
    Source IP Address -> 10.10.88.1
    X-Forwarded-For ->


    問題なく通信できました。

    サーバーでは以下のようなスクリプトを使用しています。
    ";
    print $_SERVER['SERVER_ADDR'].":";
    print $_SERVER['SERVER_PORT'];
    print "\n";
    print "Source IP Address -> ";
    print $_SERVER['REMOTE_ADDR'];
    print "\n";
    print "X-Forwarded-For -> ";
    print $_SERVER['HTTP_X_FORWARDED_FOR'];
    print $_SERVER['HTTPS'];
    print "\n\n\n";

    ?>


    現在BIG-IPにはデフォルトゲートウェイは設定されていませんが、Auto Lasthopという機能が有効になっているのでクライアントからのトラフィックに対しての戻りはトラフィックが入ってきた元のVLANに送出します。このため来たトラフィックの戻りをもとのところに返すという用途のみの場合BIG-IPにはルーティングの設定は不要です。

    ]]><![CDATA[ ]]>