MENU

BIG-IPについて その2

BIG-IPについて その2です。

 

 

SSLについて

プラットフォームによってSSLアクセラレータの実装数や最大TPSが違う。

 

 

SSLTerminationとClientSSL

termination訳:終端・終わり
暗号化・復号化をBIG-IPが行うこと。
クライアント⇔サーバーのSSL通信を
クライアント⇔BIG-IPのSSL通信へ変更する。
ClientSSLProfileを使用してSSLセッションをBIG-IPによって終了させる。
=BIG-IPをClientSSLのEndPointとする。
ClientSSLの場合は「クライアント⇔BIG-IP」はSSL、「BIG-IP⇔サーバー」はSSLでは無い。
利点は以下。

・各サーバー(PoolMember)で証明書を用意する必要が無い。

 

・サーバーがSSL暗号化/復号化に関するCPU処理をしなくて良い。

 

・ClientTrafficがSSLであってもCookiepersistenceが使用可能。

 

・ClientTrafficがSSLであってもiRuleが使用可能。

 

・SSLアクセラレータで処理可能。ハードウェアでのSSL鍵交換、バルク暗号化。

 

 

ClientSSLProfileの有効化手順

・SSLCertificateと鍵をインポートするか生成する。
※SSL証明書構成時の決まり文句、「インターネットで使用するなら
外部機関の信頼された証明書で、内部で使用するだけなら自己署名証明書で良い。」
※証明書の格納先は/config/ssl/ssl.crt、鍵の格納先は/config/ssl/ssl.keyです。
BIG-IPを冗長構成している場合は片方で同期すれば良い。

 

左ウィンドウの「LocalTraffic」-「SSLCertificates」をクリックします。
「Import」か「Create」ボタンをクリックします。
今回は「Create」ボタンをクリックします。
「Name」欄に任意の名前を入れる。
「Issuer」欄は「Self」を選択する。
後は任意の値を決定し入れる。
「Finished」をクリックします。

 

・ClientSSLprofileを設定する。
左ウィンドウの「LocalTraffic」-「profiles」-「SSL」-「client」をクリックします。
「Create」ボタンをクリックします。
「Name」欄に任意の名前を入れる。
「ParentProfile」欄は「clientssl」のまま。
「Certificate」と「Key」項目に先程の名前のものを入れる。
※両項目は、最初グレーアウトしているが、Customチェックボックスにチェック
を入れる(=親の影響を受けなくする)とドロップダウンリストから選択可能になる。
「Finished」をクリックします。

 

・VirtualServerに関連付ける。
左ウィンドウの「LocalTraffic」-「VirtualServers」をクリックします。
「Create」ボタンをクリックします。
「Name」欄に任意の名前を入れる。
「Destination」欄にAdressを入れる。
「ServicePort」欄にポート番号を入れる。通常は443ですね。
「SSLprofile(Client)」欄に先程の名前のものを入れる。
=SSLTerminationを設定した、と言うことです。
別途「SSLprofile(Client)」欄も設定した場合は、SSLIntiationを設定した、
と言えます。

 

・・・「ProtocolProfile(Client)」は「TCP」が自動選択される。

 

 

後の項目は適切に選択します。
※「DefaultPool」欄でデフォルトのPoolを選択、や
「SNATPool」欄に「AutoMap」を選択するなど。

 

「Finished」をクリックします。
クライアントのwebブラウザからVirtualServerへhttpsアクセスし動作を確認します。

 

 

SSLIntiationとServerSSL

もし「クライアント⇔BIG-IP」と「BIG-IP⇔サーバー」のどちらも
SSLで暗号化したい場合はBIG-IPのサーバー側のSSLIntiationを使用する。

 

SeverSSLの場合は「クライアント⇔BIG-IP」はSSL、「BIG-IP⇔サーバー」
もSSL。BIG-IPの動作としては、クライアントからのSSLトラフィックを
復号化。別のSSL証明書と鍵で再度暗号化してからサーバーへ送信。
サーバーからのトラフィックを復号化し、再暗号化してクライアントに送信。

 

ネットワーク全体のトラフィックは暗号化されなければならない、という
要件が有って、尚且つHTTPのデータをBIG-IPが見る必要が有る時
(CookiepersistenceやiRuleを使用している時)。
HTTPのデータをBIG-IPが見る必要が無いのならば、クライアント⇔サーバー
で通常のSSL通信を構成すれば良い。

 

 

ServerSSLProfileの作成手順

左ウィンドウの「LocalTraffic」-「profiles」-「SSL」-「Server」をクリックします。
「Create」ボタンをクリックします。
「Name」欄に任意の名前を入れる。
「ParentProfile」欄は「serverssl」のまま。後は特には何もせずに「Finished」をクリックします。
後は1つ上の「ClientSSLProfileの有効化手順」を参照して下さい。

 

 

リモートログインを使用する

BIG-IPへリモートからログインする場合、HTTPSかSSHでログインします。

 

・HTTPSの場合はwebブラウザを使用してログインします。

 

・SSHの場合
左ウィンドウの「Network」-「SelfIPs」をクリックします。
external側(環境に依ります)のSelfIPsをクリックします。
自環境では10.0.0.1です。
「PortLockdown」欄が「AllowCustom」であることを確認し
「CustomList」でTCP22番ポートを追加し「Update」をクリックします。

 

今回はSSHクライアントはSSHをサポートしているTeraTermを使用します。
BIG-IPのIPアドレスと22番ポートを指定して接続します。

 

ユーザー名はデフォルトなら、「root」と入力して
「チャレンジレスポンス認証を使う」にチェックを入れて「OK」ボタンをクリックします。
パスワードを入力すると、接続できます。

 

・SFTPの場合
ファイルをダウンロードする際に使用します。
今回はfilezillaと言うSFTP/FTPクライアントを使用しました。

 

直感的に操作できると思われるので手順は記載しなくても良いですね?
IPアドレス、ユーザー名、パスワード、ポート「22」を入力して「クイック接続」ボタンを
クリックして接続です。
qkviewで取得したtgzやキャプチャしたファイルをローカルPCに
ダウンロードする際等に使用します。
また、SCPでダウンロードすることも可能です。
SFTPとSCPの違いは以下が詳しいです。
http://www.atmarkit.co.jp/fnetwork/rensai/tcp28/02.html

 

 

qkview

各種情報を取得できます。
他処理を圧迫しないためにniceコマンドと併用してqkviewと入力します。
nice-20qkview

 

併せて以下のファイルも取得しておくのが望ましい。
/config/bigip.conf
/config/bigip_base.conf
/config/BigDB.dat

 

 

BIG-IPを通るトラフィックをパケットキャプチャする

tcpdumpコマンドを使用します。詳細なコマンド解説は以下。
http://itpro.nikkeibp.co.jp/article/COLUMN/20070403/267311/

 

DevCentralにサンプルを記載してる人がいましたのでそのまま引用します。
http://devcentral.f5.com/Forums/tabid/1082223/asg/50/showtab/groupforums/aff/5/aft/11976/afv/topic/Default.aspx

 

tcpdump-ni1.1tcpport80-w/var/tmp/http.cap&

 

tcpdump-nipublic_vlantcpport21-w/var/tmp/ftp.cap

 

tcpdump-ni0.0udp1645-w/var/tmp/all_interfaces_radius.cap

 

&,fg,jobsを使用してinternalとexternalのトラフィックを
同時にキャプチャする場合が多いです。

 

その後、SFTPでローカルPCにダウンロードし、Wiresharkで閲覧します。

 

 

NAT

1対1のマッピング。
双方向のトラフィック。
専用のIPアドレス。
ポートは設定不可。
設定方法は、
左ウィンドウの「LocalTraffic」-「SNATs」-「NATs」をクリックします。
「NATAddress」にNATAddressを(クライアントのIPアドレス等)
「OriginAddress」はそのアドレスがマップする送信元のアドレス

 

 

SNAT

SecureNATの略。ややこしいけど、で、SourceNATを実行する。
多対1。

 

送信元アドレスがSNATアドレスに変換される。
送信元ポートも変わる。
サーバーからクライアントに返される時も、
正しく元のクライアントのIPアドレスとポートに戻す。

 

通常はVirtualServerが宛先アドレスを変更する。
(VirtualServerのアドレスから負荷分散先サーバーのアドレスへ)
でSNATが送信元のアドレスを変更する。
(クライアントのアドレスからSNATアドレスへ)

 

SNATが設定されていない場合を考える。
もしサーバー内設定でデフォルトゲートウェイをBIG-IPのアドレスでは
無い機器のアドレスに設定し、尚且つ「クライアントのアドレスからの
通信はBIG-IPへ返す」、とのルーティング設定もされてない場合は
クライアントからサーバーへ到着した通信の帰りはサーバーから
デフォルトゲートウェイへ配送される。

 

SNATが設定されていれば、送信元はクライアントのアドレスでは無く
BIG-IPのSelfIPなので、それの応答をサーバーが返す時、
ローカルネットワークIPアドレスなので、デフォルトゲートウェイの
お世話にはならず、BIG-IPへ返す。

 

SNATを、普通にSNATオブジェクトとして設定すると、全てのトラフィックに
影響を与える可能性が有る。
普通にSNATオブジェクトとして設定方法は、
左ウィンドウの「LocalTraffic」-「SNATs」-「Create」から設定します。

 

SNATを、VirtualServer内で設定すると、そのVirtualServerを使用する
トラフィックのみ影響を受ける。
設定方法は、左ウィンドウの「LocalTraffic」-「VirtualServers」をクリックします。
VirtualServerList内の設定したいVirtualServerをクリックし、
「Coinfiguration」ドロップダウンリストから「Advanced」を選択します。
「SNATPool」欄で設定できるのは「AutoMap」か、作成したSNATPool。
「AutoMap」を選ぶと、自動的に出力/出口側VLANのSelfIP
(冗長構成ならfloatingSelfIP)が選択される。
クライアントからサーバーへの通信の場合は出力/出口側VLANのSelfIP
はinternalVLAN側のSelfIPで、
サーバーからクライアントへの通信の場合は出力/出口側VLANのSelfIP
はexternalVLAN側のSelfIPということです。
(冗長構成ならfloatingSelfIP)が選択される。

 

 

SelfIP

internalVLAN及びexternalVLANのIPアドレス。
「PortLockdown」欄で「AllowCustom」を選択すると
許可するポートなどを設定できる。
BIG-IPへSSH接続を行ないたいならばTCP/22を開ける、設定など。

 

VirtualServerの「SNATPool」で「AutoMap」を選択すると、
自動的に出力/出口側VLANのSelfIP(冗長構成ならfloatingSelfIP)が使用される。

 

 

floatingSelfIP

冗長構成時におけるinternalVLAN及びexternalVLANのIPアドレス。
普通に設定していった場合、
冗長構成のペア1組に対してinternalVLANのfloatingSelfIPは1つ、
冗長構成のペア1組に対してexternalVLANのfloatingSelfIPは1つ。

 

 

iRules

iRuleを設定する場合は、BIG-IPが適切にイベントを
読めるように、関連するProfileの設定を行っておくこと。

 

BIG-IPに入っているプログラミング言語、スクリプト。
Tclプログラミング言語を基にしている。
特定のPool、PoolMembersにトラフィックを送信可能。
L7パケットのどんな情報にも対応できる。
振り分けるルールを書く。
ネットワークパケットを処理して送信する。
ClientTrafficがSSLで有る場合にiRules処理を行うには
SSLTerminationを使用する。

 

設定するには
iRuleEditorを使用する。
この場合、iRuleを保存するにはiRuleEditorがオンラインのBIG-IPに接続されて
いなければならない。

 

それか、BIG-IPで左ウィンドウの「LocalTraffic」-「iRule」を選択後「Create」ボタンを
クリックし直接記述する。

 

 

iRuleの書き方サンプルは以下。
http://devcentral.f5.com/Community/Japan/iRuleSamples/tabid/120/Default.aspx

 

iRuleの解説は以下。最も分かりやすい資料のうちの1つだと思います。PDFです。
http://www.f5networks.co.jp/shared/pdf/irule_atoz.pdf

 

 

iRuleの書き方

ruleルール名{
whenイベント{
if{条件}{
アクション
}
}
}

 

※コード行の最後に空白を入れないこと。
※ブランク行も使わないこと。
※ルール名の各語の先頭は大文字である必要がある。IP_Addressなど。
※複数のイベントを指定可能。HTTP_REQUEST、CLIENT_ACCEPTEDなど。
TCPの3ウェイハンドシェイク完了時にCLIENT_ACCEPTEDが発生する。
クライアントデータが受信されるとCLIENT_DATAが発生する。
通信時、振り分け先のPoolMemberを決定した場合にSERVER_SELECTEDが発生する、等々。

 

 

イベントの例

・CLIENT_ACCEPTED
クライアントPCとBIG-IPの3ウェイハンドシェイク時

 

 

・CLIENT_DATA
・HTTP_REQUEST
クライアントデータ送信時

 

 

・SERVER_CONNECTED
BIG-IPとサーバーとの3ウェイハンドシェイク時

 

 

・SERVER_DATA
・HTTP_RESPONSE
サーバー応答時

 

 

・SERVER_SELECTED

 

 

・AUTH_RESULT
認証操作完了時

 

 

・DNS_REQUEST
DNS要求受信時

 

 

・DNS_RESPONSE
DNS要求への応答時

 

 

・CLIENTSSL_CLIENTCERT
SSLクライアント証明書の追加時

 

 

・CLIENTSSL_DATA
収集状態時、クライアントから
新しいSSLデータを受け取る度に

 

 

・CLIENTSSL_HANDSHAKE
クライアント側のSSLハンドシェイク完了時

 

 

・LB_SELECTED
poolmemberの選択時

 

 

・LB_FAILED
pool及びpoolmemberの選択不可/到達不可時

 

 

・NAME_RESOLVED
NAME::lookupコマンドが発行され、応答が
受信された後。

 

 

・PERSIST_DOWN
パーシステンスによって
DOWN状態のpool、poolmember、nodeに
送信されるように示された時

 

 

・RULE_INIT
iRuleが追加/変更された時

 

 

イベントのカテゴリの例

・認証イベント
PoolMemberとの接続確立前のクライアント認証に関連。

 

・DNSイベント
DNSに関するもの。

 

・SSLイベント
初期SSLハンドシェイク中のクライアント認証に関連。

 

・グローバルイベント
PoolMemberとの接続確立に関連。

 

※アクションの例「IP::remote_addr」・・・コネクションのリモートIPアドレスを
検索して、返す。
※Poolへの振り分け処理を記載しているiRuleで、アクションでifにもelseifにも
当てはまらず、且つelseが記述されてない場合、そのトラフィックは
defaultPoolへ送られる。defaultPoolが無い場合は廃棄される。
基本的にはそうならないように必要なロジックを全てiRule内に記述すること。

 

 

使用可能な演算子

論理演算子
orandnot

 

関係演算子
starts_with
ある文字列が特定の文字列で始まるか

 

ends_with
特定の文字列で終了するか

 

equals
特定の文字列が等しいか

 

contains
特定の文字列が含まれているか

 

matches_regex
ある文字列が正規表現と一致するか

 

matches_glob
比較内でglobスタイルの照合を行う

 

switch
値に応じてスクリプトのうちの1個を評価する。

 

 

例1
リクエストURIの最後がhtmならPool名「htm_pool」へ、
uriの最後がhtmlならPool名「html_pool」へ振り分ける。

ruleHtm_Html{
whenHTTP_REQUEST{
if{[HTTP::uri]ends_with"htm"}{
poolhtm_pool
}
elseif{[HTTP::uri]ends_with"html"}{
poolhtml_pool
}
}

 

 

例2
接続しに来たクライアントのIPアドレスが172.で始まる場合は
「pool_a」へ、それ以外は「pool_b」へ振り分ける。

 

ruleIP_Address{
whenCLIENT_ACCEPTED{
if{[[IP::remote_addr]starts_with"172."]}{
poolpool_a
}
else{
poolpool_b
}
}
}

 

 

RedundantPair

Active-StandbyにおいてStanby機で想定される役割は
アップグレードや障害時のバックアップ。
RedundantPairはActive-Standbyで構成することを推奨しているとのこと。
ホスト名、UnitID、SelfIPなどはお互い違う値にする。
peerはお互いのIPを入れ合う。

 

それぞれにUnitID1、UnitID2を割り当てる。UnitIDは識別番号で、
1がactive、2がStandbyを表しているという訳では無い。

 

VLAN作成時にfail-overpeerのIPアドレスを設定する。
すると、fail-overVLANが作成される。
コンフィグファイルを同期したり状態情報をミラーリング、
フェールオーバーステータスを検出する際に使用される。

 

クライアントからのトラフィックはBIG-IPの外部(external)のfloatingIP、
内部(internal)のfloatingIPを通ってサーバーへ到着する。

 

フェールオーバーが起こるとStandby機がActive機になり、尚且つ
GratuitousARP(重複IPアドレス検出やARPキャッシュエントリ更新の為に
使われるパケット)を送信し、floatingIPのMACアドレスが変更されたことを
(多分)ブロードキャストして他の機器へ伝達する。

 

 

Failoverマネージャ

・Watchdog
ハードウェアのヘルスチェックを実行

 

・Overdog
ハードウェア障害を解決するためのソフトウェア

 

・SOD
ソフトウェアをモニタリング

 

 

HighAvailabilityテーブル

Failoverマネージャにより更新、
モニタリングされる。
bhatableshow
で状態確認が可能。

 

 

FailoverTriggers

・プロセス(デーモン)
重要なデーモンが停止した際の実行アクションを変更するのは推奨されない。
「SystemServices」の一覧と実行するアクションを変更するには以下。
左ウィンドウの「System」-「HighAvailability」-「Fail-safe」-「System」をクリック。

 

・スイッチボード

 

・VLANFailsafe
ネットワークトラフィックを検出できない場合トラフィックの生成を試みる。
どのVLANへも設定可能。
デフォルトのタイムアウトは90秒。

 

ネットワークトラフィックをモニタリングする。
タイムアウト値の半分の時間が経過してもトラフィックが検出されない場合、
既知の機器へpingを送出する。応答等が無くタイムアウト時間に達した際は
アクションが実行される。

 

・GatewayFailsafe

 

 

HardwareFailover

・常に有効。

 

・FrontPanelFailoverPortとDB9Failoverケーブルを使用。

 

・最大距離は15.24m

 

・ActiveSystemが電圧を供給。

 

・ActiveSystemによってFrontPanelFailoverPortに電圧がかかっている
場合、PeerSystemはStandbyModeのまま待機する。

 

・データは一切配送しない。

 

・StandbySystemは電圧の遮断を検出するとActiveになる。
そしてFrontPanelFailoverPortに電圧を供給してActiveSystemである
ことを示します。

 

・電圧が途切れている場合はどちらもActiveのままになりGratuitousARPを送信する。

 

・NetworkFailoverと組み合わせて使用可能。
その場合は両方失敗しない限りStandbyからActiveになることは無い。

 

 

NetworkFailover

・ハートビートが送信される。

 

・Active機はkeep-aliveを送信する。

 

・UDP/1026を使用する。

 

・HardwareFailoverの制限15.24m以上でも良い。

 

・HardwareFailoverより低速。

 

・HardwareFailoverと組み合わせて使用可能。
その場合は両方失敗しない限りStandbyからActiveになることは無い。
設定はPeer間で同期されない。

 

・HardwareFailoverより低速。

 

・設定は左ウィンドウの「System」-「HighAvailability」の
「NetworkFailover」タブ。
「Enabled」にチェック。
「PeerManagementAddress」相手の管理IPアドレス
「ConfigurationIdentifier」は、名前
「LocalAddress」は、SelfIPアドレス
「RemoteAddress」は、peerIPアドレス
portは指定しない場合デフォルトの1026が使用される。

 

・送出間隔は約1/10秒。疎通不可状態が続けば
送出されなくなり、再度ペアを認識した際には送出し始める。

 

 

StatefulFailover

・デフォルトのFailoverでは現在の接続とパーシステンスが失われるが、
StatefulFailoverでは現在の接続とパーシステンスが維持される。

 

・データをStandbyにミラーリングすることで実現される。

 

 

データのミラーリング

・TCP/1028

 

・有効な場合は接続及びパーシステンステーブルがミラーリングされる。

 

・NATは1対1なのでNAT接続の状態はミラーリングする必要は無い。

 

・SNATは複数のクライアントが同時に使用するため、必要。
接続テーブルで管理している。それをミラーリングする。
設定は「SNATs」から。
「StatefulFailoverMirror」チェックボックスにチェックを入れる。
Peerにも設定しておく。

 

 

ConnectionMirroring

・TCP/1028

 

・Telnet、FTP、SSH等、長時間維持される接続に適用できる。

 

・接続は失われない。

 

・負荷がかかる。

 

・デフォルトは無効。

 

・設定はVirtualServerのAdvancedから。

 

・設定はPeerと常に同期しておくこと。

 

 

PersistenceMirroring

・TCP/1028

 

・Failover時に後続のクライアント接続を
適切に振り分けられるようにする。

 

・Failover時にパーシステンスウィンドウタイマーがスタートする。

 

・デフォルトは無効。

 

・有効にしておくことを推奨しているとのこと。

 

・CookiePersistenceはクライアントでの保存なので今回は関係ない。

 

・設定は「Profiles」の「Persistence」タブから。

 

・設定はPeerと常に同期しておくこと。

 

 

MACMasquerading

・VLANのフローティングMACアドレス。
フローティングIPアドレスを維持する仕組みと殆ど同じ。
Failover時にActive機が仮想MACアドレスに関連付ける。
スイッチのCAMテーブル(MACアドレステーブル)が変更されるのみで、
ルータのARPテーブルは変更する必要がない。

 

・ARPキャッシュの更新は不要。

 

・ARPキャッシュの更新に懸念が有る場合に有効。

 

・両システムで同じMACアドレスを設定する必要がある。

 

・MACMasqueradingはシステムごとに設定する必要がある。

 

・各VLANは固有のハードウェアMACアドレスで起動する。
で、MACMasqueradingを使用するにはMACアドレスを作成する。
フローティングIPアドレスを作成したのと少し似てると思う。
通常は先頭のオクテットbitを変更し、残りはハードウェア
MACアドレスの1つをコピーして作成する。

 

・設定はVLANのAdvancedから。考えたMACMasqueradeの値を入れる。

 

 

その他、実際の設定はこちらのページを参照下さい。