A10はBIG-IPと同じくパーシステンスクッキーに振り分け先のIPアドレスとポート番号を格納します。
BIG-IPとはエンコード方法が異なるためBIG-IPと同様の方法ではデコードできません。
そこで、A10で行われているエンコードとデコードの方法を解説しようと思います。
タップできる目次
A10のクッキーエンコード方法
例としてIPアドレスを192.168.0.123、ポート番号を443とします。
IPアドレスのエンコード方法
手順1 アドレスを逆順に並べる
IPアドレスを4つのオクテットに分けます。
192 168 0 123
上記の値の順序を逆にします。
結果は「123 0 168 192」です。
手順2 div16とmod16を計算する
各値に対してdiv16とmod16を計算します。
123 | div(123,16)=7 | mod(123,16)=11 |
0 | div(0,16)=0 | mod(0,16)=0 |
168 | div(168,16)=10 | mod(168,16)=8 |
192 | div(192,16)=12 | mod(192,16)=0 |
上記の結果を順番に並べます。
結果は「7 11 0 0 10 8 12 0」です。
手順3 各値に65を加算する
手順2で出した各値に65を加算します。
結果は「72 76 65 65 75 73 77 65」です。
手順4 文字に変換する
手順3で出した各値を文字に変換します。
結果は「H L A A K I M A」
192.168.0.123をエンコードすると「HLAAKIMA」となります。
ポート番号のエンコード方法
手順1 ポート番号のdiv4096を計算する
div(443,4096)=0
結果は「0」です。
手順2 手順1の結果に4096を乗算してポート番号から減算する
443-(0*4096)=443
結果は「443」です。
手順3 手順2の結果のdiv256を計算する
div(443,256)=1
結果は「1」です。
手順4 手順3の結果に256を乗算して手順2の結果から減算する
443-(1*256)=187
結果は「187」です。
手順5 手順4の結果のdiv16を計算する
div(187,16)=11
結果は「11」です。
手順6 手順4の結果のmod16を計算する
mod(187,16)=11
結果は「11」です。
手順7 これまでの計算結果を並べる
ここまで計算した結果を「手順5→手順6→手順1→手順3」の順番に並べます。
結果は「11 11 0 1」です。
手順8 各値に65を加算する
手順7で出した各値に65を加算します。
結果は「76 76 65 66」です。
手順9 文字に変換する
手順8で出した各値を文字に変換します。
結果は「L L A B」
443をエンコードすると「LLAB」となります。
エンコードの結果
これでIPアドレスとポート番号をエンコードできました。
IPアドレスが「HLAAKIMA」、ポート番号が「LLAB」ですのでクッキーの値は以下のようになります。
HLAAKIMALLAB
A10のクッキーデコード方法
例としてさきほどエンコードした「HLAAKIMALLAB」をデコードします。
IPアドレスのデコード方法
手順1 文字列を数値変換する
IPアドレスの部分は「HLAAKIMA」です。これを数値に変換すると以下の通りになります。
結果は「72 76 65 65 75 73 77 65」です。
手順2 各値から65を減算する
結果は「7 11 0 0 10 8 12 0」です。
手順3 各値から逆算する
先頭から数値をふたつずつ選択して「7 11」「0 0」「10 8」「12 0」の組み合わせを作ります。
上記の組み合わせ数値を使って元の数値に戻します。左側の値に16を乗算して右側の値を加算することによって元の数値を得られます。
- 7*16+11=123
- 0*16+0=0
- 10*16+8=168
- 12*16+0=192
結果は「123 0 168 192」です。
手順4 手順3の結果を逆に並べ替える
192 168 0 123となります。
この結果からIPアドレスが「192.168.0.123」とデコードできます。
ポート番号のデコード方法
手順1 文字列を数値変換する
ポート番号の部分は「LLAB」です。これを数値に変換すると以下の通りになります。
結果は「76 76 65 66」です。
手順2 各値から65を減算する
結果は「11 11 0 1」です。
手順3 エンコード手順4の値を逆算する
手順2の結果の先頭ふたつの値を取り出します。
「11 11」
上記の値の左の値に16を乗算して右の値を加算します。
11*16+11=187
結果は「187」です。
手順4 エンコード手順2の値を逆算する
手順2の結果の最後の値に256を乗算して手順3の結果を加算します。
1*256+187=443
結果は「443」です。
手順5 エンコード手順1の値を逆算する
手順2の結果の3番目の値に4096を乗算します。
0*4096=0
結果は「0」です。
手順6 手順4と手順5の結果を加算する
444+0=443
この結果からポート番号は「443」とデコードできます。
まとめ
A10のクッキーエンコードはBIG-IPと比べると若干複雑なのですが、今回解説したように順を追っていけばエンコードもデコードも簡単に計算できます。
ただ、自分で計算するのは面倒なので自動的に計算するWEBアプリを作成して公開しようと思います。