【BIG-IP LTM】セッションパーシステンスの設定と動作確認 Version: 16.1.2

音声で聞く

読む前にこの記事のポイントを音声で確認できます。この音声は本記事をもとにAIツール(NotebookLM)で自動生成したもので、発音や言い回しが不自然な箇所や、内容の誤りが含まれる可能性があります。理解の補助としてご利用ください。

ロードバランシング方式(ラウンドロビンや比率など)は、クライアントからの初回アクセスをどのサーバに送るかを決めるものです。2回目以降も同じサーバに送り続けたいときに使うのが、パーシステンス(セッション維持)です。この記事では、よく使われる送信元 IP アドレスと Cookie(HTTP Cookie Insert)のパーシステンスを設定し、動作を確かめます。

この記事でわかること
  1. 送信元 IP アドレスパーシステンスのプロファイルを作る(Timeout を 300 秒に)
  2. プロファイルを Virtual Server に適用する
  3. パーシステンスのレコードと Timeout の動きを確かめる
  4. Cookie パーシステンス(HTTP Cookie Insert)のプロファイルを作る
  5. Virtual Server に適用し、挿入された Cookie を確かめる
前提の記事

この記事は、次の記事で作った Web-VS(Virtual Server)と Web-Pool(Web-01:80、Web-02:80)の構成を使います。

BIG-IP 16.1.2 で検証しています。16.1 系はすでに F5 のサポート期間が終わっているので、これから構築する場合はサポート中のバージョンを選んでください。

パーシステンスとは

ラウンドロビンだけで振り分けると、同じクライアントからのアクセスでも、来るたびに別のサーバに送られることがあります。パーシステンスを使うと、初回アクセスで決まったサーバに、同じクライアントからの2回目以降のアクセスも送り続けます。

① 初回アクセス② 2回目以降クライアントBIG-IP LTMWeb-01Web-02① 初回:ロードバランシング方式で Web-01 に決定② 2回目以降:パーシステンスで同じ Web-01 へ同じクライアントは同じサーバへ
図1 初回はロードバランシング方式、2回目以降はパーシステンスで振り分け先が決まる

処理の負荷を分けるだけで、どのサーバが応答しても困らないアプリケーションなら、パーシステンスはいりません。一方、EC サイトのカートのように、ログイン状態や入力途中のデータをサーバ側で持っているアプリケーションでは、一連の処理を同じサーバで受ける必要があるので、パーシステンスを使います。

「同じクライアント」をどう見分けるかで、パーシステンスの種類が分かれます。

種類同じクライアントの見分け方記録する場所使える通信
送信元 IP アドレス
(Source Address Affinity)
送信元 IP アドレスが同じBIG-IP のパーシステンステーブルTCP/UDP の通信全般
Cookie
(HTTP Cookie Insert)
BIG-IP が応答に入れた Cookie の値クライアントのブラウザ(Cookie)HTTP(HTTPS は BIG-IP で復号する場合)

送信元 IP アドレスパーシステンス

送信元 IP アドレスが同じなら同じクライアントと見なし、振り分け先のサーバを固定します。設定は、Persistence のプロファイルを作り、Virtual Server に適用する流れです。

プロファイルを作る

Local Traffic ›› Profiles ›› Persistence を開くと、プロファイルの一覧が表示されます。最初から用意されているプロファイルのうち、Type が Source Address Affinity の source_addr が送信元 IP アドレスパーシステンスです。

画面イメージについて

この記事の画面は、実際の画面ではなく、検証時の画面から設定する項目(見るポイント)を抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。

BIG-IP 設定画面(Configuration Utility)画面イメージ
Local Traffic ›› Profiles : Persistence
NameTypeParent ProfilePartition / Path
cookieCookie(none)Common
dest_addrDestination Address Affinity(none)Common
hashHash(none)Common
hostHost(none)Common
msrdpMicrosoft® Remote Desktop(none)Common
sip_infoSIP(none)Common
1source_addrSource Address Affinity(none)Common
sslSSL(none)Common
universalUniversal(none)Common
Delete…2Create…
図2 Persistence プロファイルの一覧(実際の画面ではなく、表示のポイントを示したイメージです)
No.項目内容
1source_addr最初から用意されている送信元 IP アドレスパーシステンスのプロファイル。そのまま使っても動作します
2Create…新しいプロファイルを作ります(実際の画面では一覧の右上にあります)

ここでは、Timeout を変えたプロファイルを新しく作ります。Create をクリックし、Name に custom-src-persist、Persistence Type に Source Address Affinity を選ぶと、親プロファイル(Parent Profile)が source_addr の設定画面に切り替わります。この時点の値は source_addr と同じです。値を変えたい項目は、右端の Custom にチェックを入れると編集できるようになります。

よく変えるのは Timeout です。初期値は 180 秒で、その間に同じクライアントからの通信がないと、パーシステンスの記録が消えます。EC サイトなどで、利用者が180秒以上操作しないと別のサーバに振り分けられてしまうので、必要に応じて長くします。ここでは 300 秒(5分)にして、Finished をクリックします。

BIG-IP 設定画面(Configuration Utility)画面イメージ
Local Traffic ›› Profiles : Persistence ›› New Persistence Profile…
General Properties
1Namecustom-src-persist
Persistence TypeSource Address Affinity
Parent Profilesource_addr
Configuration Custom ☑
Match Across Services☐
Match Across Virtual Servers☐
Match Across Pools☐
Hash AlgorithmDefault
2TimeoutSpecify… 300 seconds
Prefix LengthNone
Map Proxies☑ Enabled
Override Connection Limit☐
CancelRepeat3Finished
図3 送信元 IP アドレスパーシステンスのプロファイル作成(実際の画面ではなく、設定項目のポイントを示したイメージです)
No.項目設定内容
1Name/Persistence Typecustom-src-persist/Source Address Affinity
2Timeout300 秒(初期値 180 秒)。Custom にチェックを入れてから変更します
3Finishedクリックしてプロファイルを作ります。一覧に custom-src-persist(Parent Profile が source_addr)が追加されます

Virtual Server に適用する

Local Traffic ›› Virtual Servers ›› Virtual Server List で Web-VS をクリックし、Properties タブから Resources タブに切り替えます。Default Persistence Profile で custom-src-persist を選び、Update をクリックします。

BIG-IP 設定画面(Configuration Utility)画面イメージ
Local Traffic ›› Virtual Servers : Virtual Server List ›› Web-VS
Properties | Resources | Security
Load Balancing
Default PoolWeb-Pool
1Default Persistence Profilecustom-src-persist
Fallback Persistence ProfileNone
2Update
図4 Web-VS の Resources タブで Persistence プロファイルを選ぶ(実際の画面ではなく、設定項目のポイントを示したイメージです)
No.項目設定内容
1Default Persistence Profilecustom-src-persist を選びます
2Updateクリックして反映します

動作を確かめる

クライアントのブラウザで Virtual Server(http://www.hirotanoblog.work)を開くと、Web-01 のページが表示されます。何回再読み込みしても Web-01 のままです。

クライアントのブラウザ画面イメージ
http://www.hirotanoblog.work/
Web-01再読み込みしても Web-01 のまま
図5 送信元 IP アドレスパーシステンスを適用した後の表示(実際の画面ではなく、表示結果のイメージです)

クライアントから curl で10回続けてページのタイトルを取ると、10回とも Web-01 でした。同じ送信元アドレスからのアクセスが、すべて Web-01 に送られています。

クライアント

$ for ((i=0; i<10; i++)); do curl -s www.hirotanoblog.work | grep -o '<title>.*</title>'
 | sed 's#<title>\(.*\)</title>#\1#'; done
Web-01 – Web-01
Web-01 – Web-01
Web-01 – Web-01
Web-01 – Web-01
Web-01 – Web-01
Web-01 – Web-01
Web-01 – Web-01
Web-01 – Web-01
Web-01 – Web-01
Web-01 – Web-01

パーシステンスのレコード(show ltm persistence persist-records)

BIG-IP では、show ltm persistence persist-records all-properties でパーシステンスの記録(レコード)を確認できます。クライアントのアドレスは伏せています。

BIG-IP(tmsh)

(tmos)# show ltm persistence persist-records all-properties
Sys::Persistent Connections
source-address - 10.0.1.100:80 - 10.0.2.24:80
---------------------------------------------
  TMM           0                            
  Mode          source-address               
  Value         126.xxx.xxx.xxx                
  Age (sec.)    1                            
  Virtual Name  /Common/Web-VS               
  Virtual Addr  10.0.1.100:80                
  Node Addr     10.0.2.24:80                 
  Pool Name     /Common/Web-Pool             
  Client Addr   126.xxx.xxx.xxx                
  Owner entry   not mirrored
表示意味
Modeパーシステンスの種類。source-address は送信元 IP アドレスパーシステンス
Value同じクライアントを見分けるキー。ここではクライアントの送信元 IP アドレス
Age (sec.)このレコードが最後に使われてからの経過秒数。Timeout(300 秒)に達するとレコードが消えます
Virtual Addrクライアントが接続した Virtual Server のアドレスとポート
Node Addr固定した振り分け先(Web-01 の 10.0.2.24:80)
Pool Name振り分け先の Pool
Client Addr接続しているクライアントのアドレス

Timeout でレコードが消える

Age は、同じクライアントから通信があるたびに 0 に戻ります。通信がない間は1秒ずつ増え、Timeout に設定した 300 秒に達するとレコードが消えます。次の出力では、Age が 298、299 と増えたあと、レコードが 0 件になっています。レコードが消えた後のアクセスは、ロードバランシング方式で改めて振り分け先が決まります。

(tmos)# show ltm persistence persist-records all-properties
Sys::Persistent Connections
source-address - 10.0.1.100:80 - 10.0.2.24:80
---------------------------------------------
  TMM           0                            
  Mode          source-address               
  Value         126.xxx.xxx.xxx               
  Age (sec.)    298                          
  Virtual Name  /Common/Web-VS               
  Virtual Addr  10.0.1.100:80                
  Node Addr     10.0.2.24:80                 
  Pool Name     /Common/Web-Pool             
  Client Addr   126.xxx.xxx.xxx                
  Owner entry   not mirrored                 

Total records returned: 1
(tmos)# show ltm persistence persist-records all-properties
Sys::Persistent Connections
source-address - 10.0.1.100:80 - 10.0.2.24:80
---------------------------------------------
  TMM           0                            
  Mode          source-address               
  Value         126.xxx.xxx.xxx               
  Age (sec.)    299                          
  Virtual Name  /Common/Web-VS               
  Virtual Addr  10.0.1.100:80                
  Node Addr     10.0.2.24:80                 
  Pool Name     /Common/Web-Pool             
  Client Addr   126.xxx.xxx.xxx               
  Owner entry   not mirrored                 

Total records returned: 1
(tmos)# show ltm persistence persist-records all-properties
Sys::Persistent Connections
Total records returned: 0
(tmos)# show ltm persistence persist-records all-properties
Sys::Persistent Connections
Total records returned: 0

Cookie パーシステンス

Cookie を使って同じクライアントを見分けます。初回アクセスのとき、BIG-IP がサーバからの HTTP レスポンスに Cookie を挿入し、クライアントは2回目以降のリクエストでその Cookie を送ります。BIG-IP は Cookie の値から、初回と同じサーバに転送します。

クライアントBIG-IP LTMWeb-02① GET(Cookie なし)方式で Web-02 を選ぶ応答② 応答に Set-Cookie を挿入BIGipServerWeb-Pool=…③ GET(Cookie 付き)Cookie の値から Web-02 へ
図6 HTTP Cookie Insert の流れ

BIG-IP が HTTP の中身を読み書きするので、使えるのは HTTP の通信だけです。Virtual Server には HTTP プロファイルを適用しておく必要があります。HTTPS の場合は、BIG-IP で SSL を復号する(Client SSL プロファイルを適用する)構成のときに使えます。

プロファイルを作る

送信元 IP アドレスと同じく、Local Traffic ›› Profiles ›› Persistence で Create をクリックします。最初から用意されている cookie(Type が Cookie)をそのまま使っても動作しますが、ここでは Name を custom-cookie、Persistence Type を Cookie にして新しく作ります。

Cookie Method の初期値 HTTP Cookie Insert が、いちばんよく使われる方式です。サーバが Cookie を使っているかどうかに関係なく、BIG-IP が独自の Cookie を HTTP レスポンスに挿入します。今回は値を変えずに Finished をクリックします。

BIG-IP 設定画面(Configuration Utility)画面イメージ
Local Traffic ›› Profiles : Persistence ›› New Persistence Profile…
General Properties
1Namecustom-cookie
Persistence TypeCookie
Parent Profilecookie
Configuration Custom ☐
2Cookie MethodHTTP Cookie Insert
Cookie Name 
HTTPOnly AttributeEnabled
Secure AttributeEnabled
Always Send Cookie☐
Default Cookie Encrypt Pool-Name☐
Expiration☑ Session Cookie
3Cookie Encryption Use Policydisabled
Encryption Passphrase 
Override Connection Limit☐
CancelRepeat4Finished
図7 Cookie パーシステンスのプロファイル作成(実際の画面ではなく、設定項目のポイントを示したイメージです)
No.項目設定内容
1Name/Persistence Typecustom-cookie/Cookie
2Cookie MethodHTTP Cookie Insert(初期値のまま)
3Cookie Encryption Use Policyこの画面では disabled。Cookie の値を暗号化するかどうかの設定です(後述)
4Finishedクリックしてプロファイルを作ります

Virtual Server に適用して確かめる

STEP 2 と同じく Web-VS の Resources タブを開き、Default Persistence Profile で custom-cookie を選んで Update をクリックします。

BIG-IP 設定画面(Configuration Utility)画面イメージ
Local Traffic ›› Virtual Servers : Virtual Server List ›› Web-VS
Load Balancing
Default PoolWeb-Pool
1Default Persistence Profilecustom-cookie
Fallback Persistence ProfileNone
2Update
図8 Default Persistence Profile を custom-cookie にする(実際の画面ではなく、設定項目のポイントを示したイメージです)

ブラウザ(Chrome)で Virtual Server を開くと、今度は Web-02 のページが表示されました。何回再読み込みしても Web-02 のままです。

クライアントのブラウザ画面イメージ
http://www.hirotanoblog.work/
Web-02再読み込みしても Web-02 のまま
図9 Cookie パーシステンスを適用した後の表示(実際の画面ではなく、表示結果のイメージです)

ブラウザに保存された Cookie

Chrome の 設定 ›› セキュリティとプライバシー ›› Cookie と他のサイトデータ ›› すべての Cookie とサイトデータを表示 で www.hirotanoblog.work の Cookie を見ると、BIG-IP が挿入した Cookie が保存されています。

Chrome の Cookie の詳細画面イメージ
1名前BIGipServerWeb-Pool
2コンテンツ1191313418.20480.0000
ドメインwww.hirotanoblog.work
パス/
送信先同一サイトの接続のみ
スクリプトにアクセス可能いいえ(HTTP のみ)
作成日2022年3月27日日曜日 18:47:38
3有効期限ブラウザ セッションの終了時
図10 BIG-IP が挿入した Cookie(実際の画面ではなく、表示のポイントを示したイメージです)
No.表示意味
1名前BIGipServer のあとに Pool 名(Web-Pool)が続く名前。Cookie Name を空欄にしたときの名前です
2コンテンツ振り分け先のサーバを表す値(読み方は下で説明します)
3有効期限Expiration が Session Cookie なので、ブラウザを閉じると消えます

curl で Set-Cookie を確かめる

curl -I でレスポンスヘッダを見ると、Set-Cookie で Cookie が挿入されていることがわかります。

クライアント

$ curl -I www.hirotanoblog.work
HTTP/1.1 200 OK
Date: Sun, 27 Mar 2022 11:00:19 GMT
Server: Apache
Link: ; rel="https://api.w.org/"
Content-Type: text/html; charset=UTF-8
Set-Cookie: BIGipServerWeb-Pool=1191313418.20480.0000; path=/; Httponly

暗号化していない Cookie の値は、振り分け先の IP アドレスとポートを数値にしたものです。次のように読み解くと、Web-02(10.0.2.71:80)を指していることがわかります。

値読み方結果
119131341816進数にすると 0x4702000A。下位のバイトから順に 0A・00・02・47 と読み、10進数に直す10.0.2.71
2048016進数にすると 0x5000。上下のバイトを入れ替えると 0x005080
注意

暗号化していない Cookie からは、サーバの内部の IP アドレスとポートが読み取れます。外部に公開するサービスでは、Cookie Encryption Use Policy で Cookie の暗号化を検討してください。

補足

STEP 3 のように curl を続けて実行しても、curl は受け取った Cookie を次のリクエストで送らないので、Cookie パーシステンスは効きません(毎回ロードバランシング方式で振り分けられます)。Cookie パーシステンスはブラウザで確かめるか、curl の Cookie を保存・送信するオプションを使って確かめます。

うまくいかないとき

状態よくある原因確認すること
送信元 IP で特定のサーバに偏るNAT やプロキシの後ろにいる多くのクライアントが、同じ送信元アドレスで来ているshow ltm persistence persist-records の Value。偏りが問題なら Cookie パーシステンスを検討する
しばらくすると別のサーバに変わるTimeout を過ぎてレコードが消えたプロファイルの Timeout。アプリケーションのセッションの長さに合わせる
Cookie のプロファイルを適用できないVirtual Server に HTTP プロファイルがないVirtual Server の HTTP Profile の設定
Cookie が挿入されないHTTPS を BIG-IP で復号していない、またはテスト方法が Cookie を送っていないClient SSL プロファイルの有無、curl -I の Set-Cookie

まとめ

項目送信元 IP アドレスCookie(HTTP Cookie Insert)
Persistence TypeSource Address AffinityCookie
既定のプロファイルsource_addrcookie
この記事のプロファイルcustom-src-persist(Timeout 300 秒)custom-cookie(初期値のまま)
見分け方送信元 IP アドレスBIGipServer<Pool 名> の Cookie
確認方法show ltm persistence persist-recordsブラウザの Cookie、curl -I の Set-Cookie
注意点NAT 配下のクライアントは同じサーバに集まるHTTP プロファイルが必要。値の暗号化を検討

どちらも Persistence プロファイルを作り、Virtual Server の Resources タブにある Default Persistence Profile に指定するだけで動きます。

コメント