【A10 Thunder】サーバ負荷分散(L7:HTTP )の基本設定と動作確認 5.2.0

A10 Thunder(vThunder、ACOS 5.2.0)で、L7(HTTP)の負荷分散を設定し、動作を確認します。L7 の負荷分散では、クライアントからの TCP セッションを Thunder でいったん終端し、HTTP の中身を見たうえでサーバへ振り分けます。

この記事では、L4 の負荷分散の設定をもとに、L7 に変えるところだけを説明します。後半では、L7 で HTTP ヘッダを扱える例として、X-Forwarded-For ヘッダを挿入します。

この記事でわかること
  1. L4 と L7 の負荷分散の違い
  2. HTTP の仮想ポートで L7 の負荷分散を設定する方法(GUI/CLI)
  3. セッション情報で L7 の動作を確かめる方法
  4. HTTP テンプレートで X-Forwarded-For を挿入する方法

L4 と L7 の負荷分散の違い

L4 の負荷分散では、Thunder はクライアントの TCP セッションをそのままサーバへ転送します。L7 の負荷分散では、クライアントとの TCP セッション(①)を Thunder が終端し、サーバとは別の TCP セッション(②)を張ります。そのため、Thunder は HTTP のリクエストを読んで、ヘッダを書き換えたり、内容に応じて振り分けたりできます。

L4 の負荷分散 TCP をそのまま転送する TCP セッション(1本)L7 の負荷分散(HTTP) TCP を vThunder で終端し、HTTP の中身を見て転送する TCP セッション ②TCP セッション ①HTTP を検査サーバvThunderクライアント
図1 L4 と L7 の負荷分散の違い
前提の構成

次の記事の設定をもとにしています。先に読んでおくと、この記事の設定がわかりやすくなります。

sg-web Web-01 10.0.200.100(TCP 80) Web-02 10.0.200.173(TCP 80) vThunder VIP 10.0.10.200 HTTP 80 送信元 NAT 10.0.200.149 Internet Client HTTP(TCP 80)
図2 検証構成(VIP 10.0.10.200 の HTTP 80、送信元 NAT は 10.0.200.149)

L7 の負荷分散を設定する

画面イメージについて

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

HTTP の仮想ポートを作る

L7 の負荷分散は、仮想ポートのプロトコルを http にすることで動きます。ADC ›› SLB ›› Virtual Servers で vip-web を開き、Virtual Port を次のとおり作成します。

vThunder 設定画面(GUI)画面イメージ
ADC ›› SLB ›› Virtual Servers ›› vip-web ›› Virtual Port
Name 
1Protocolhttp
Port or Port Range80
Connection Limit64000000
ActionEnable
Support HTTP2☐
Source NAT Pool 
2Source NAT Auto☑
⋮ (Precedence、IP-RR などは空欄)
3Service Groupsg-web
Cancel4Update
図3 HTTP の仮想ポートの設定(実際の画面ではなく、設定項目のポイントを示したイメージです)
No.項目設定内容
1Protocol/Port or Port Rangehttp を選び、ポート番号に 80 を入れます。tcp ではなく http にすることで、L7 の処理になります。
2Source NAT Autoチェックを入れると、サーバへ送る通信の送信元アドレスを Thunder 側のアドレスに変換します。今回の構成では 10.0.200.149 に変換されます。
3Service Group振り分け先の sg-web を選びます。
4Update設定を保存します。

保存したら、ADC ›› SLB ›› Virtual Servers で、vip-web と http の仮想ポートの Status が緑になっていることを確かめます。

vThunder 設定画面(GUI)画面イメージ
ADC ›› SLB ›› Virtual Servers
StatusNameIP Address
1vip-web10.0.10.200
http80
図4 HTTP の仮想ポートが Up している(実際の画面ではなく、表示のポイントを示したイメージです)
No.表示意味
1Status(緑)緑:vip-web と http(80)の仮想ポートが Up しています。

CLI で設定する場合

仮想ポートを port 80 http で作り、source-nat auto と service-group を設定します。

vThunder

vThunder(config)#slb virtual-server vip-web 10.0.10.200
vThunder(config-slb vserver)#port 80 http
vThunder(config-slb vserver-vport)#source-nat auto
vThunder(config-slb vserver-vport)#service-group sg-web
送信元 NAT を使う理由

送信元 NAT を有効にすると、サーバから見た送信元は Thunder のアドレスになります。サーバの応答は必ず Thunder に返ってくるので、サーバのデフォルトゲートウェイを Thunder に向けなくても通信が成り立ちます。その代わり、サーバからはクライアントの IP アドレスが見えなくなります。これを補うのが、後半で設定する X-Forwarded-For です。

動作を確認する

クライアントから 10.0.10.200 に HTTP でアクセスすると、Web サーバの画面が表示されます。

クライアントのブラウザ画面イメージ
http://10.0.10.200/
Web-01VIP にアクセスした結果
図5 VIP へのアクセス結果(実際の画面ではなく、表示結果のイメージです)

セッション情報:Type が SLB-L7

ADC ›› SLB ›› Session でセッションを見ると、Type が SLB-L7 のセッションが2つできています。

vThunder 設定画面(GUI)画面イメージ
ADC ›› SLB ›› Session
Forward SourceForward DestReverse SourceReverse DestType
(伏せています):5083410.0.10.200:8010.0.0.00.0.0.0SLB-L7
(伏せています):5083310.0.10.200:80210.0.200.173:80310.0.200.149:241294SLB-L7
図6 L7 の負荷分散のセッション(実際の画面ではなく、表示のポイントを示したイメージです)
No.表示意味
1Reverse が 0.0.0.0クライアントとの TCP は張られているものの、サーバ側の接続がまだない行です。ブラウザは複数の TCP 接続を開くことがあり、L7 では HTTP のリクエストを受けてからサーバを選ぶため、リクエストを受けていない接続はこのように表示されると考えられます。
2Reverse Source 10.0.200.173:80このセッションは Web-02 の 80 番に転送されています。
3Reverse Dest 10.0.200.149:24129サーバ側の宛先がクライアントではなく 10.0.200.149 になっています。送信元 NAT で、サーバへの通信の送信元が Thunder のアドレスに変わっているためです。
4Type SLB-L7L7 の負荷分散として処理しています(L4 の記事では SLB-L4 でした)。

HTTP ヘッダを挿入する(X-Forwarded-For)

L7 で HTTP の中身を扱えることを確かめるため、X-Forwarded-For ヘッダを挿入します。X-Forwarded-For は、プロキシやロードバランサを経由したときに、元のクライアントの IP アドレスをサーバへ伝えるための HTTP ヘッダです。広く使われている事実上の標準で、標準化された同じ用途のヘッダとして Forwarded(RFC 7239)もあります。

Web サーバvThunderクライアントクライアント → vThunderIP 送信元:クライアントの IPHTTP ヘッダ:(X-Forwarded-For なし)vThunder → Web サーバIP 送信元:10.0.200.149(送信元 NAT)X-Forwarded-For:クライアントの IPX-Forwarded-For:クライアントの IPvThunder が HTTP ヘッダを書き足してからサーバへ送る
図7 送信元 NAT と X-Forwarded-For(IP の送信元は Thunder、ヘッダにクライアントの IP)

今回の構成では送信元 NAT で IP の送信元が Thunder(10.0.200.149)になるため、Web サーバはこのヘッダでクライアントを特定できます。設定は、HTTP テンプレートで X-Forwarded-For を挿入するようにし、それを仮想ポートに適用します。

HTTP テンプレートを作る

ADC ›› Templates ›› L7 Protocols を開き、HTTP のテンプレートを Create します。

vThunder 設定画面(GUI)画面イメージ
ADC ›› Templates ›› L7 Protocols ›› Create HTTP
1NameXFF
Default CharsetUTF-8
Failover URL 
Host Switching/URL Switching◉ Host Switching○ URL Switching
2Client IP Header Insert☑
Header NameX-Forwarded-For
3Replace Existing header☐
Client Port Header Insert☐
Cancel4OK
図8 HTTP テンプレートの作成画面(実際の画面ではなく、設定項目のポイントを示したイメージです)
No.項目設定内容
1Nameテンプレートの名前。XFF とします。
2Client IP Header Insert/Header Nameチェックを入れると、クライアントの IP アドレスを HTTP ヘッダに入れます。ヘッダの名前に X-Forwarded-For を入力します。
3Replace Existing header同じ名前のヘッダがすでにある場合に置き換えるかどうか。今回はチェックしません。
4OKテンプレートを作ります。

仮想ポートに適用する

vip-web の仮想ポート 80(http)を開き、Template HTTP で XFF を選んで Update をクリックします。

vThunder 設定画面(GUI)画面イメージ
ADC ›› SLB ›› Virtual Servers ›› vip-web ›› Virtual Port(80 http)
Protocolhttp
Port or Port Range80
⋮ (中略)
Source NAT Auto☑
⋮ (中略)
Service Groupsg-web
Template Cache 
1Template HTTPXFF
Persist Type○ Destination IP○ Source IP○ Cookie
Cancel2Update
図9 仮想ポートへの HTTP テンプレートの適用(実際の画面ではなく、設定項目のポイントを示したイメージです)
No.項目設定内容
1Template HTTPSTEP 2 で作った XFF を選びます。
2Update仮想ポートの設定を保存します。

CLI で設定する場合

slb template http で HTTP テンプレートを作って insert-client-ip でヘッダ名を指定し、仮想ポートで template http を適用します。

vThunder

vThunder(config)#slb template http XFF 
vThunder(config-http)#insert-client-ip X-Forwarded-For   
vThunder(config-http)#exit
vThunder(config)#slb virtual-server vip-web 10.0.10.200 
vThunder(config-slb vserver)#port 80 http 
vThunder(config-slb vserver-vport)#template http XFF 
vThunder(config-slb vserver-vport)#

動作を確認する

クライアントからアクセスしたあと、Web サーバ(Web-02)でパケットをキャプチャすると、Thunder から届いた HTTP リクエストに X-Forwarded-For ヘッダが入っています。

パケットキャプチャ(Web-02 で取得)画面イメージ
No.SourceDestinationProtocolInfo
1522110.0.200.14910.0.200.173HTTPGET / HTTP/1.1
153410.0.200.17310.0.200.149HTTPHTTP/1.1 200 OK (text/html)
    Connection: keep-alive\r\n    Upgrade-Insecure-Requests: 1\r\n    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) …    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=…    Accept-Encoding: gzip, deflate\r\n    Accept-Language: ja,en-US;q=0.9,en;q=0.8,zh-TW;q=0.7,zh;q=0.6,sv;q=0.5,ar;q=0.4\r\n2    X-Forwarded-For: (伏せています)\r\n
図10 Web サーバで見た HTTP リクエスト(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Source 10.0.200.149IP ヘッダの送信元は、送信元 NAT で Thunder のアドレスになっています。
2X-Forwarded-ForThunder が挿入したヘッダです。値はクライアントの IP アドレス(ブラウザでアクセスした端末のアドレス)で、Web サーバはこの値でアクセス元を特定できます。
サーバ側での使い方

Web サーバのアクセスログには、通常は IP ヘッダの送信元(今回は 10.0.200.149)が記録されます。クライアントの IP アドレスをログに残したい場合は、Web サーバ側で X-Forwarded-For の値を記録するように設定します。

まとめ

やりたいことGUI の設定CLI
L7(HTTP)の負荷分散Virtual Port の Protocol を httpport 80 http
送信元 NATSource NAT Auto にチェックsource-nat auto
X-Forwarded-For の挿入HTTP テンプレートの Client IP Header Insert、Header Nameslb template http XFF
insert-client-ip X-Forwarded-For
テンプレートの適用Virtual Port の Template HTTPtemplate http XFF

L7 の負荷分散では、Thunder がクライアントとの TCP を終端して HTTP を読むので、ヘッダの挿入や、Host・URL による振り分け、Cookie を使ったパーシステンスといった HTTP を使う機能が使えるようになります。

コメント