A10 Thunder(vThunder、ACOS 5.2.0)で、L7(HTTP)の負荷分散を設定し、動作を確認します。L7 の負荷分散では、クライアントからの TCP セッションを Thunder でいったん終端し、HTTP の中身を見たうえでサーバへ振り分けます。
この記事では、L4 の負荷分散の設定をもとに、L7 に変えるところだけを説明します。後半では、L7 で HTTP ヘッダを扱える例として、X-Forwarded-For ヘッダを挿入します。
- L4 と L7 の負荷分散の違い
- HTTP の仮想ポートで L7 の負荷分散を設定する方法(GUI/CLI)
- セッション情報で L7 の動作を確かめる方法
- HTTP テンプレートで X-Forwarded-For を挿入する方法
L4 と L7 の負荷分散の違い
L4 の負荷分散では、Thunder はクライアントの TCP セッションをそのままサーバへ転送します。L7 の負荷分散では、クライアントとの TCP セッション(①)を Thunder が終端し、サーバとは別の TCP セッション(②)を張ります。そのため、Thunder は HTTP のリクエストを読んで、ヘッダを書き換えたり、内容に応じて振り分けたりできます。
次の記事の設定をもとにしています。先に読んでおくと、この記事の設定がわかりやすくなります。
L7 の負荷分散を設定する
この記事の画面は、実際の画面ではなく、検証時の画面から設定する項目(見るポイント)を抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。
HTTP の仮想ポートを作る
L7 の負荷分散は、仮想ポートのプロトコルを http にすることで動きます。ADC ›› SLB ›› Virtual Servers で vip-web を開き、Virtual Port を次のとおり作成します。
| Name | |
| 1Protocol | http |
| Port or Port Range | 80 |
| Connection Limit | 64000000 |
| Action | Enable |
| Support HTTP2 | ☐ |
| Source NAT Pool | |
| 2Source NAT Auto | ☑ |
| ⋮ (Precedence、IP-RR などは空欄) | |
| 3Service Group | sg-web |
| No. | 項目 | 設定内容 |
|---|---|---|
| 1 | Protocol/Port or Port Range | http を選び、ポート番号に 80 を入れます。tcp ではなく http にすることで、L7 の処理になります。 |
| 2 | Source NAT Auto | チェックを入れると、サーバへ送る通信の送信元アドレスを Thunder 側のアドレスに変換します。今回の構成では 10.0.200.149 に変換されます。 |
| 3 | Service Group | 振り分け先の sg-web を選びます。 |
| 4 | Update | 設定を保存します。 |
保存したら、ADC ›› SLB ›› Virtual Servers で、vip-web と http の仮想ポートの Status が緑になっていることを確かめます。
| Status | Name | IP Address |
|---|---|---|
| 1 | vip-web | 10.0.10.200 |
| http | 80 |
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Status(緑) | 緑: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 を有効にすると、サーバから見た送信元は Thunder のアドレスになります。サーバの応答は必ず Thunder に返ってくるので、サーバのデフォルトゲートウェイを Thunder に向けなくても通信が成り立ちます。その代わり、サーバからはクライアントの IP アドレスが見えなくなります。これを補うのが、後半で設定する X-Forwarded-For です。
動作を確認する
クライアントから 10.0.10.200 に HTTP でアクセスすると、Web サーバの画面が表示されます。
セッション情報:Type が SLB-L7
ADC ›› SLB ›› Session でセッションを見ると、Type が SLB-L7 のセッションが2つできています。
| Forward Source | Forward Dest | Reverse Source | Reverse Dest | Type |
|---|---|---|---|---|
| (伏せています):50834 | 10.0.10.200:80 | 10.0.0.0 | 0.0.0.0 | SLB-L7 |
| (伏せています):50833 | 10.0.10.200:80 | 210.0.200.173:80 | 310.0.200.149:24129 | 4SLB-L7 |
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Reverse が 0.0.0.0 | クライアントとの TCP は張られているものの、サーバ側の接続がまだない行です。ブラウザは複数の TCP 接続を開くことがあり、L7 では HTTP のリクエストを受けてからサーバを選ぶため、リクエストを受けていない接続はこのように表示されると考えられます。 |
| 2 | Reverse Source 10.0.200.173:80 | このセッションは Web-02 の 80 番に転送されています。 |
| 3 | Reverse Dest 10.0.200.149:24129 | サーバ側の宛先がクライアントではなく 10.0.200.149 になっています。送信元 NAT で、サーバへの通信の送信元が Thunder のアドレスに変わっているためです。 |
| 4 | Type SLB-L7 | L7 の負荷分散として処理しています(L4 の記事では SLB-L4 でした)。 |
HTTP ヘッダを挿入する(X-Forwarded-For)
L7 で HTTP の中身を扱えることを確かめるため、X-Forwarded-For ヘッダを挿入します。X-Forwarded-For は、プロキシやロードバランサを経由したときに、元のクライアントの IP アドレスをサーバへ伝えるための HTTP ヘッダです。広く使われている事実上の標準で、標準化された同じ用途のヘッダとして Forwarded(RFC 7239)もあります。
今回の構成では送信元 NAT で IP の送信元が Thunder(10.0.200.149)になるため、Web サーバはこのヘッダでクライアントを特定できます。設定は、HTTP テンプレートで X-Forwarded-For を挿入するようにし、それを仮想ポートに適用します。
HTTP テンプレートを作る
ADC ›› Templates ›› L7 Protocols を開き、HTTP のテンプレートを Create します。
| 1Name | XFF |
| Default Charset | UTF-8 |
| Failover URL | |
| Host Switching/URL Switching | ◉ Host Switching○ URL Switching |
| 2Client IP Header Insert | ☑ |
| Header Name | X-Forwarded-For |
| 3Replace Existing header | ☐ |
| Client Port Header Insert | ☐ |
| No. | 項目 | 設定内容 |
|---|---|---|
| 1 | Name | テンプレートの名前。XFF とします。 |
| 2 | Client IP Header Insert/Header Name | チェックを入れると、クライアントの IP アドレスを HTTP ヘッダに入れます。ヘッダの名前に X-Forwarded-For を入力します。 |
| 3 | Replace Existing header | 同じ名前のヘッダがすでにある場合に置き換えるかどうか。今回はチェックしません。 |
| 4 | OK | テンプレートを作ります。 |
仮想ポートに適用する
vip-web の仮想ポート 80(http)を開き、Template HTTP で XFF を選んで Update をクリックします。
| Protocol | http |
| Port or Port Range | 80 |
| ⋮ (中略) | |
| Source NAT Auto | ☑ |
| ⋮ (中略) | |
| Service Group | sg-web |
| Template Cache | |
| 1Template HTTP | XFF |
| Persist Type | ○ Destination IP○ Source IP○ Cookie |
| No. | 項目 | 設定内容 |
|---|---|---|
| 1 | Template HTTP | STEP 2 で作った XFF を選びます。 |
| 2 | Update | 仮想ポートの設定を保存します。 |
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 ヘッダが入っています。
| No. | Source | Destination | Protocol | Info |
|---|---|---|---|---|
| 1522 | 110.0.200.149 | 10.0.200.173 | HTTP | GET / HTTP/1.1 |
| 1534 | 10.0.200.173 | 10.0.200.149 | HTTP | HTTP/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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Source 10.0.200.149 | IP ヘッダの送信元は、送信元 NAT で Thunder のアドレスになっています。 |
| 2 | X-Forwarded-For | Thunder が挿入したヘッダです。値はクライアントの IP アドレス(ブラウザでアクセスした端末のアドレス)で、Web サーバはこの値でアクセス元を特定できます。 |
Web サーバのアクセスログには、通常は IP ヘッダの送信元(今回は 10.0.200.149)が記録されます。クライアントの IP アドレスをログに残したい場合は、Web サーバ側で X-Forwarded-For の値を記録するように設定します。
まとめ
| やりたいこと | GUI の設定 | CLI |
|---|---|---|
| L7(HTTP)の負荷分散 | Virtual Port の Protocol を http | port 80 http |
| 送信元 NAT | Source NAT Auto にチェック | source-nat auto |
| X-Forwarded-For の挿入 | HTTP テンプレートの Client IP Header Insert、Header Name | slb template http XFFinsert-client-ip X-Forwarded-For |
| テンプレートの適用 | Virtual Port の Template HTTP | template http XFF |
L7 の負荷分散では、Thunder がクライアントとの TCP を終端して HTTP を読むので、ヘッダの挿入や、Host・URL による振り分け、Cookie を使ったパーシステンスといった HTTP を使う機能が使えるようになります。
コメント