NAT を経由したバーチャルサーバー

このページはNATを経由したバーチャルサーバーのセットアップ方法を紹介します。

ネットワークアドレスの変換

IPv4 のアドレス不足とセキュリティの結果、ネットワークはますます外部と接続できないプライベートアドレス(10.0.0.0/255.0.0.0, 172.16.0.0/255.240.0.0 , 192.168.0.0/255.255.0.0)を使うようになった。 プライベートネットワークをグローバルにつなげたい時とグローバルネットワークにプライベートネットワークをアクセスさせたい時にネットワークアドレスを変換する必要がある。

ネットワークアドレスの変換は1つのグループからもう一つのグループに割り付けられるIPアドレスの機能です。マッピングされたアドレスが N 対 N の時、これをスタティックネットワークアドレス変換と呼びます。マッピングされたアドレスが M 対 N の時、( M > N )これをダイナミックネットワークアドレス変換と呼びます。ネットワークアドレスポート変換とは基本的なNATの拡張で、たくさんのネットワークアドレスやTCP/UDPのポートはひとつのネットワークアドレスやTCP/UDPポートに変換する。これは N から 1つへのアドレスのマッピングで実はLinuxのIP Masquarade はこのように動作している。ネットワークアドレス変換についての説明は rfc1631draft-rfced-info-srisuresh-05.txt.

にあります

Linux の NAT を経由したバーチャルサーバーはネットワークアドレスポート変換によって行われる。そのコードは Linux IP Masquarade と Steven Clarke のポートフォワーディングのコードを再利用して実装しています。

NAT を経由したバーチャルサーバーはどのように動作するのですか

最初に次の図を見て考えなさい

ユーザーがクラスターが提供しているサービスにアクセスすると、バーチャルIPアドレス(ロードバランサーのためのグローバルIPアドレス)に向かうことになっている接続要求のパケットはロードバランサーに到着する。そしてロードバランサーはパケットの向かうアドレスやポート番号を調べる。バーチャルサーバーのルールテーブルを参照して、それがバーチャルサーバーのサービスと一致したら、スケジューリングアルゴリズムを使ってクラスターから接続するリアルサーバーが選ばれる。そしてコネクションが確立したことをハッシュテーブルに書き込む。それからパケットの向かうアドレスやポート番号を選ばれたリアルサーバーのものにパケットを書き直し、リアルサーバーの方にパケットを転送する。このコネクションに属しているパケットがきた時、また、ハッシュテーブルの中に選ばれたリアルサーバーが見つかった時にパケットは書き直され、選ばれたリアルサーバーに転送される。パケットから返答があった場合、ロードバランサーはこれらのバーチャルサービスのパケットの発信元のアドレスとポート番号を書きかえる。 コネクションが切れたりタイムアウトした場合、コネクションの履歴がハッシュテーブルから削除される。

混乱してしまいました?簡単にするために例をあげましょう。例えば、コンピュータが次のように構成されていたとします。

リアルサーバーはTCP/IPをサポートしているOSならなんでもかまいません。 リアルサーバーのデフォルトルートはバーチャルサーバー(例えば 172.16.0.1)に向けます。 ipfwadm はリアルサーバーからのパケットをバーチャルサーバーが受けるために使います。上の例のコマンドは次のとおりです。

    echo 1 > /proc/sys/net/ipv4/ip_forward
    ipfwadm -F -a m -S 172.16.0.0/24 -D 0.0.0.0/0

次の図でバーチャルサーバーがサポートしている各コンピュータの説明をします。

Protocol Virtual IP Address Port Real IP Address Port Weight
TCP 202.103.106.5 80 172.16.0.2 80 1
172.16.0.3 8000 2
TCP 202.103.106.5 21 172.16.0.3 21 1

IP アドレス 202.103.106.5 ポート番号80 に向かったすべてのパケットはリアルサーバーのIP アドレス 172.16.0.2 ポート番号80 か IP アドレス172.16.0.3 ポート番号 8000 のどちらかにロードバランシングさせられます。 IPアドレス 202.103.106.5 ポート番号21 に向かったすべてのパケットはリアルサーバーのIP アドレス 172.16.0.3 ポート番号21 にポートフォワーディングされます。

パケット変換の動作は次のとおりです

WEBサービスに向かってきたパケットの送り元アドレス、送り先アドレスは次のとおりです。

送り元 202.100.1.2:3456 送り先 202.103.106.5:80

送り先アドレスが 202.103.106.5:80 なので、ロードバランサーは送り先アドレスを変換する。この場合、2つ選択肢がある。 172.16.0.2:80 と 172.16.0.3:8000 だ。今回は 172.16.0.3:8000 が選ばれたとする。パケットは変換され 172.16.0.3:8000 のリアルサーバーに転送される。

送り元 202.100.1.2:3456 送り先 172.16.0.3:8000

172.16.0.3:8000 でデータを受信できたのでロードバランサーに戻らなくてはいけない。送り元を今いる 172.16.0.3:8000 、 送り先を自分の送り元IPアドレスに変換する。ロードバランサーには172.16.0.1 という同じセグメントのアドレスがあるのでそれを使っている。

送り元 172.16.0.3:8000 送り先 202.100.1.2:3456

送り元のアドレスをバーチャルサーバーのアドレス 202.103.106.5:80 に変換してクライアントに返す

送り元 202.103.106.5:80 送り先 202.100.1.2:3456

kernel の構築方法

最初に正規のバージョンの 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: ipportfw masq & virtual server support

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

    Virtual server scheduling algorithm
    (X) WeightedRoundRobin
    ( ) LeastConnection
    ( ) WeightedLeastConnection

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

最後に ippfvsadm.c から ippfvsadm をコンパイルします。 バーチャルサーバーの設定は ippfvsadm にを使います。例えば、さっきあるテーブルを作るのに次のようなコマンドを使います。

    ippfvsadm -A -t 202.103.106.5:80 -R 172.16.0.2:80 -w 1
    ippfvsadm -A -t 202.103.106.5:80 -R 172.16.0.3:8000 -w 2
    ippfvsadm -A -t 202.103.106.5:21 -R 172.16.0.3:21

kernel 2.2.9 のコンパイル方法

カーネルのコンパイルオプション

Code maturity level options ---> 
    [*] Prompt for development and/or incomplete code/drivers 
Networking options ---> 
    [*] Network firewalls 
    .... 
    [*] IP: forwarding/gatewaying 
    .... 
    [*] IP: firewalling 
    [*] IP: always defragment (required for masquerading) (NEW)
    .... 
    [*] IP: masquerading 
    ....
    [*] IP: masquerading virtual server support
    (EXPERIMENTAL)(NEW) 
    (12) IP masquerading table size (the Nth power of 2)(NEW) 
    <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)リブートしてください。そして ipvsadm をインストールしてください。

変換させたパケットを通過させるロードバランサー(マスカレード)

    echo 1 > /proc/sys/net/ipv4/ip_forward  (IP_FORWARD を許可)
    ipchains -A forward -j MASQ -s 172.16.0.0/24 -d 0.0.0.0/0  

バーチャルサーバーを追加してスケジュール方法を指定してください。

    ipvsadm -A -t 202.103.106.5:80 -s wlc  (Weighted Least-Connection scheduling 加重最小コネクションスケジューリング)
    ipvsadm -A -t 202.103.106.5:21 -s wrr  (Weighted Round Robing scheduling   加重ラウンドロビンスケジューリング)

リアルサーバーを追加してフォワーディングメソッドを選んでください

    ipvsadm -a -t 202.103.106.5:80 -R 172.16.0.2:80 -m 
    ipvsadm -a -t 202.103.106.5:80 -R 172.16.0.3:8000 -m -w 2 
    ipvsadm -a -t 202.103.106.5:21 -R 172.16.0.2:21 -m 

$Id: VS-NAT.html,v 1.1 2000/03/21 12:10:37 wensong Exp $
Created on: 1998/5/28