IP トンネリングを経由したバーチャルサーバー

このページはバーチャルサーバーの拡張性を増大した IP トンネリングについて紹介します。

IP トンネリング

IP トンネリング(IP カプセル化)は IP データグラムの中に IP データグラムをカプセル化する技術です。それはもうひとつのIP アドレスに包まれていたり、リダイレクトされたIPアドレスに向かったデータグラムを許可します。 IP のカプセル化は現在 Extranet でよく使われています。例えば、モバイルIP、IPマルチキャスト、トンネルしたホスト、ネットワークなどなど。詳細は NET-3-HOWTO のドキュメントを見てください。

バーチャルサーバーでIP トンネリングの使い方

最初に IPトンネリングを経由したバーチャルサーバーの図を見てください。IP トンネリングを経由したバーチャルサーバーと NAT を経由したバーチャルサーバーの最も異なるところは、前者ではロードバランサーがIP トンネルを使ってリアルサーバーに接続要求を出していたが、後者ではネットワークアドレスを変換してリアルサーバーに接続要求を出している。

クラスタリングしているバーチャルサービスにユーザーがアクセスすると、バーチャルIP アドレスに向かったパケット(バーチャルサーバーのIPアドレス)が到着する。 ロードバランサーはパケットの送り先アドレスとポート番号を調べる。それがバーチャルサービスのものと一致したら、接続のスケジューリングアルゴリズムによりクラスターサービスからリアルサーバーが選ばれる。そしてハッシュテーブルにコネクションが記録される。それからロードバランサーはIP データグラムにパケットをカプセル化して選ばれたリアルサーバーに転送される。このコネクションに属するパケット、または、ハッシュテーブルに見つかった選ばれたリアルサーバーのパケットがきたら、パケットはまたカプセル化され他のサーバーに転送される。カプセル化されたパケットを受け取ったら、パケットをカプセルから戻し、接続要求を処理し最後にルーティングテーブルに従って、ユーザーにダイレクトに結果を返す。コネクションが止まったり、タイムアウトしたらコネクションレコードがハッシュテーブルから削除される。仕事の流れは次の図で説明する。

ネットワーク上でリアルサーバーはいくつかのIPアドレスを持つことができ、そのIPは地理的に分散していても良いが、IPカプセル化プロトコルをサポートしていなければならない。受け取ったカプセル化されているパケットをカプセルから適切にシステムが戻せるように、トンネルデバイスは全て設定されていなくてはならない。また、 はARPできないようなデバイスで設定されていて、また ARP できないようなデバイスのエイリアスであり、またシステムは のパケットをローカルのソケットにリダイレクトできるよう設定しておかなければならない。もっと知りたかったら ARP の問題 を見てください。

最後に、カプセル化したパケットが着いたら、リアルサーバーはそれをカプセルから戻し、 に向いているパケットかどうか調べる。もしそうだったら、接続要求を処理し、ユーザーに直接結果を返す。

kernel の構築方法

1. kernel 2.0.36 の VS パッチ

最初に正規のバージョンの Linux kernel のソースをとってきてください。2番目に、kernel にバーチャルサーバーのパッチを当ててください。3番目に、次のカーネルオプションは絶対に必要なので必ず選んでコンパイルしてください。

Kernel のコンパイルオプション

Code maturity level options --->
    [*] Prompt for development and/or incomplete code/drivers

Networking options --->
    [*] Network firewalls
    ...
    [*] IP: forwarding/gatewaying
    ...
    [*] IP: firewalling
    ...
    [*] IP: masquerading
    ...
    [*] IP: ippfvs(LinuxDirector) masquerading (EXPERIMENTAL)
    Virtual server request dispatching technique---
    ( ) VS-NAT
    (X) VS-Tunneling
    ( ) VS-DRouting

スケジューリングアルゴリズムを選ばなければならない

    Virtual server scheduling algorithm
    (X) WeightedRoundRobin
    ( ) LeastConnection
    ( ) WeightedLeastConnection
    [ ] IP: enabling ippfvs with the local node feature

4番目にカーネルを再コンパイルする。適切にコンパイルしたらカーネルをアップデートして(LILO)リブートしてください。最後に ippfvsadm.c から ippfvsadm をコンパイルします。

2. kernel 2.2.14 のための VS パッチ

Kernel のコンパイルオプション

Code maturity level options --->
    [*] Prompt for development and/or incomplete code/drivers

Networking options --->
    [*] Network firewalls
    ...
    [*] IP: forwarding/gatewaying
    ...
    [*] IP: firewalling
    ...
    [*] IP: masquerading
    ...
    [*] IP: masquerading virtual server support (EXPERIMENTAL)
    (12) IP masquerading table size (the Nth power of 2)
    <M> IPVS: round-robin scheduling(NEW)
    <M> IPVS: weighted round-robin scheduling(NEW)
    <M> IPVS: weighted least-connection scheduling(NEW)
    <M> IPVS: persistent client connection scheduling(NEW)

適切にコンパイルしたらカーネルをアップデートして(LILO)リブートしてください。最後に ippfvsadm.c から ippfvsadm をコンパイルします。

どうやって使うんですか?

どうやって使うかの例を示しましょう。次のテーブルは IP トンネリングを経由したバーチャルサーバーの構成を説明しています。リアルサーバーで動作しているサービスはバーチャルサービスと同じポート番号で動作していなければならず、リアルサーバーでポート番号を指定する必要はない。

Protocol Virtual IP Address Port Real IP Address Weight
TCP 202.103.106.5 80 202.103.107.2 1
202.103.106.3 2

IP アドレス 202.103.106.5:80 に向かったパケットは、リアルサーバーのIP アドレス 202.103.107.2:80 又は 202.103.106.3:80 のどちらかにロードバランシングさせる。

さっきの設定をするのに次のコマンドを使います。

1. kernel 2.0.x の場合

ippfvsadm -A -t 202.103.106.5:80 -R 202.103.107.2 -w 1
ippfvsadm -A -t 202.103.106.5:80 -R 202.103.106.3 -w 2

2. kernel 2.2.x の場合

ipvsadm -A -t 202.103.106.5:80 -s wlc
ipvsadm -a -t 202.103.106.5:80 -R 202.103.107.2 -i -w 1
ipvsadm -a -t 202.103.106.5:80 -R 202.103.106.3 -i -w 2

トンネリングを経由したバーチャルサーバーの例

これは私が設定したトンネリングを経由するバーチャルサーバーの例です。設定は次のようになっています。私はこれがあなたの役に立つことを願っています。 ロードバランサーは IP アドレス 172.26.20.111 、リアルサーバーは IP アドレス 172.16.20.112 、バーチャル IP アドレスは 172.26.20.110 に設定します。 この例では telnet 172.26.20.110 をすると本当にリアルサーバーにつながります。

1. kernel 2.0.x の場合

kernel 2.0.36 のロードバランサー

ifconfig eth0 172.26.20.111 netmask 255.255.255.0 broadcast 172.26.20.255 up
route add -net 172.26.20.0 netmask 255.255.255.0 dev eth0
ifconfig eth0:0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up
route add -host 172.26.20.110 dev eth0:0
ippfvsadm -A -t 172.26.20.110:23 -R 172.26.20.112

kernel 2.0.36 のリアルサーバーの設定

ifconfig eth0 172.26.20.112 netmask 255.255.255.0 broadcast 172.26.20.255 up
route add -net 172.26.20.0 netmask 255.255.255.0 dev eth0
ifconfig tunl0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up
route add -host 172.26.20.110 dev tunl0

私が他のホストにいる時、 telnet 172.26.20.110 をすると本当にリアルサーバーにつながります。

2. kernel 2.2.x の場合

kernel 2.2.14 のロードバランサー

ifconfig eth0 172.26.20.111 netmask 255.255.255.0 broadcast 172.26.20.255 up
route add -net 172.26.20.0 netmask 255.255.255.0 dev eth0
ifconfig eth0:0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up
route add -host 172.26.20.110 dev eth0:0
echo 1 > /proc/sys/net/ipv4/ip_forward
ipvsadm -A -t 172.26.20.110:23 -s wlc
ipvsadm -a -t 172.26.20.110:23 -r 172.26.20.112 -i

kernel 2.2.14 のためのリアルサーバーの設定

ifconfig eth0 172.26.20.112 netmask 255.255.255.0 broadcast 172.26.20.255 up
route add -net 172.26.20.0 netmask 255.255.255.0 dev eth0
ifconfig tunl0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up
route add -host 172.26.20.110 dev tunl0

次の設定例

これは IP トンネリングを経由したバーチャルサーバーの次の設定例です。 スペースを節約するために重要なコマンドは載せて重要でないコマンドは省略しました。

1. 隠れたデバイス(例、tunl0 ) を実装した kernel 2.2.14 以降のリアルサーバー

kernel 2.2.14 のロードバランサー

echo 1 > /proc/sys/net/ipv4/ip_forward
ipvsadm -A -t 172.26.20.110:23 -s wlc
ipvsadm -a -t 172.26.20.110:23 -r 172.26.20.112 -i

kernel 2.2.14 のリアルサーバー

echo 1 > /proc/sys/net/ipv4/ip_forward
# insert it if it is compiled as module
insmod ipip
ifconfig tunl0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up
route add -host 172.26.20.110 dev tunl0
echo 1 > /proc/sys/net/ipv4/conf/all/hidden
echo 1 > /proc/sys/net/ipv4/conf/tunl0/hidden

kernel 2.2 以降 トンネルデバイス tunl0 をもてるようになったので、この設定で Virtual IP アドレスを使える。複数の Virtual IP アドレスのために、tunl0 デバイスを用意して tunnel/dummy/loopback デバイスのエイリアスを設定して、そのデバイスを隠すことができる。例は次のとおりだ。

echo 1 > /proc/sys/net/ipv4/ip_forward
# insert it if it is compiled as module
insmod ipip
ifconfig tunl0 up
ifconfig dummy0 up
echo 1 > /proc/sys/net/ipv4/conf/all/hidden
echo 1 > /proc/sys/net/ipv4/conf/dummy0/hidden
ifconfig dummy0:0 172.26.20.110 up
route add -host 172.26.20.110 dev dummy0:0
ifconfig dummy0:1 <Another-VIP> up
...

2. リダイレクトアプローチを使った kernel 2.2.x のリアルサーバー

ロードバランサーの設定は上にある例といっしょだ。kernel 2.2.x で動作するリアルサーバー次のように設定する。

echo 1 > /proc/sys/net/ipv4/ip_forward
# insert it if it is compiled as module
insmod ipip
ifconfig tunl0 up
ipchains -A input -j REDIRECT 23 -d 172.26.20.110 23 -p tcp
...


$Id: VS-IPTunneling.html,v 1.3 2000/04/12 00:18:27 wensong Exp $
Created on: 1998/11/29