BIG-IPのVirtual ServerのAddress Translation/Port Translationは宛先NAT/NAPTを意味する。私はずっと送信元(クライアント側)のNAT/NAPTのことを意味していると勘違いしており、数時間ハマった。

上記VSのService PortはTCP/443のため、VS配下のPool MemberのService PortがHTTP(TCP/80)の場合はVSの設定でPort Translationが必要になる。具体的にはGUIのVS Advanced画面で以下の「Address Translation」、「Port Translation」の両方にチェックが必要になる。

Port TranslationをOFFにした状態でFirefoxでVSにHTTPSでアクセスすると「エラーコード: PR_CONNECT_RESET_ERROR」が発生する。PR_CONNECT_REST_ERRORとは何ぞや?とググってみても何の手掛かりもない。

困った時はパケットキャプチャしかない。クライアント側でパケットキャプチャしてみるとSSLの4ウェイハンドシェイクが完了した直後にVS⇒クライアントへRST/ACKを返している。これだけでは原因がわからないのでハマる。

BIG-IP側でパケットキャプチャしてみると原因が明確になる。BIG-IPはtcpdumpする際に最下層にF5 Ethernet Trailer Protocolを付与する。F5 Ethernet Trailer Protocolの中身にはVSの動作が記述されている。High Detailsを見ると「Peer remote port: 443」が確認できる。Pool MemberのService PortはTCP/80なのだから通信できるはずがない。

BIG-IPのtcpdumpコマンドは以下の通り。取得後はSCPコマンドでパケキャプ解析用PCに送る。
##### パケットキャプチャコマンド #####
tcpdump -eni <VLAN名>:nnn -s 0 -X -w /var/log/<ファイル名>.pcap
##### 解析用PCにSCP転送 #####
scp /var/log/<ファイル名>.pcap <解析用PCのユーザ名>@<解析用PCのIPアドレス>:/
Address Translationを外すと更に酷いことになる。VSは宛先NATすらせずに、負荷分散対象のサーバとServer Sideコネクションを形成しようとする。これでは通信できるはずがない。

VSの送信元アドレスのポート変換方法
ではVSの送信元アドレスのポート変換はどこで制御しているのか?VSのAdvanced画面で「Source Port」の値をPreserve(デフォルト値)にすると送信元のポート番号が変換される。

Source PortをPreserveにした際のコネクションテーブルは以下の通り。10.0.10.1%10(クライアント)⇒10.0.10.100%10:443のエントリを見てみると送信元のポート番号が51065から42549に変換されていることがわかる。Preserveは保存という意味だが、全く保存されていないのがミソ。

Source Portを変えずにServer Sideコネクションを形成するにはSource Portの値をPreserve Strictに設定すれば良い。10.0.10.1%10(クライアント)⇒10.0.10.100%10:443のエントリについて送信元のポート番号が51131から変わっていないことが確認できる。

以上
コメント