Linuxを含む多くのOSは、default gw(デフォルトゲートウェイ)の
送出先を1カ所しか設定できません。このため、複数のプロバイダを契約して
接続をしていても、実際に使うことの出来る回線は1本のみとなってしまいます。
iproute2を使うと、2つのプロバイダに接続をした1台の
LinuxBoxからそれぞれの接続に対して正しく通信することが可能です。
ここでは、2つのグローバルIPアドレスをDNSラウンドロビンにより
リクエストを分散し、1台のWWWサーバーでそれぞれの経路から来たリクエストに
応答できるように設定を実施します。
接続概念図
ここでは、下記の接続図を想定して設定を行います。
別に3階層のネットワークでなくても良いのですが、
この構成でならばウェブサーバを100台程度まで増やすことが可能になります。
(ISP:210.149.88.1) (ISP:61.114.8.1)
default gw default gw
| |
+------------------+ +------------------+
|ppp0 210.149.88.70| |ppp0 61.114.8.111 |
|------------------| |------------------|
|eth0 192.168.2.254| |eth0 192.168.2.253|
+------------------+ +------------------+
| |
--------------------------
|
+------------------+
|eth0 192.168.2.1 |
|------------------| ← ここにiproute2設定を実施する
|eth1 192.168.1.254|
+------------------+
|
+--------------------+
|eth0 192.168.1.100| default gw 192.168.1.254
|eth0:0 192.168.1.101| ← これWWWサーバ
+--------------------+
設定手法
想定環境にて理想的な動作をさせるために、
ここでは下記の設定をおこないます。
- DNSラウンドロビンの設定
: 210.149.88.70, 61.114.8.111に、ユーザからのリクエストが分散するように
設定する。
- NAT(iptables)の設定
: グローバルIPを持っているサーバ(210.149.88.70, 61.114.8.111)から、
ウェブサーバ(192.168.1.100,192.168.1.101)にリクエストをFORWARDする。
- ウェブサーバの設定
: ウェブサーバにIPを2つ持たせる。
- iproute2の設定
: ウェブサーバから外に出る通信を振り分ける。
DNSラウンドロビンの設定
概要
古代から負荷分散の方法として、DNSラウンドロビンというしくみがあります。
DNSラウンドロビンは、1つのホスト名に対して、複数のIPを割り当てることで、
WWWなどのリクエストを複数のIPアドレスに分散させる事ができます。
ZONE設定ファイル
www.hoge.comの名前を
210.149.88.70 61.114.8.111 の2つのIPに設定するには、
DNSの
ZONE設定ファイルのAレコードを
下記のように設定します。(BIND8 or 9)
sv1 IN A 61.114.8.111
sv2 IN A 210.149.88.70
rr IN A 61.114.8.111
rr IN A 210.149.88.70
www IN CNAME rr
sv1,sv2のアドレスレコードは、本題と直接関係が無いのですが、
確認作業の為必要なので、単独で引けるアドレスレコードを
用意しておいた方が 良いでしょう。
設定の確認
設定が成功すれば、下記のようにnslookupで確認できるはずです。
# nslookup www.hoge.com
Server: 192.168.2.254
Address: 192.168.2.254#53
www.hoge.com canonical name = rr.hoge.com.
Name: rr.hoge.com
Address: 210.149.88.70
Name: rr.hoge.com
Address: 61.114.8.111
NAT(iptables)の設定
概要
グローバルIPを持っているルーターにて、
httpリクエストをWWWサーバにFORWARDする(向け直す)設定をします。
210.149.88.70 -> 192.168.1.100
61.114.8.111 -> 192.168.1.101
外部→210.149.88.70:80へのリクエストを192.168.1.100:80にFORWARD
下記コマンドを210.149.88.70のルータで実行します。
# iptables -t nat -A PREROUTING \
-p tcp -d 210.149.88.70 --dport 80 \
-j DNAT --to 192.168.1.100
外部→61.114.8.111へのリクエストを192.168.1.101:80にFORWARD
下記コマンドを61.114.8.111のルータで実行します。
# iptables -t nat -A PREROUTING \
-p tcp -d 61.114.8.111 --dport 80 \
-j DNAT --to 192.168.1.101
ウェブサーバの設定
概要
ウェブサーバが192.168.1.100,192.168.1.101
のIPでリクエストを受けられるように
ipalias
を設定します。
設定
ウェブサーバで下記コマンドを実行します。
# ifconfig eth0:0 192.168.1.101
# ifconfig を実行してみて、下記のように
なっていればOKです。
eth0 Link encap:Ethernet HWaddr 00:02:B3:3A:8D:63
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:35989558 errors:0 dropped:0 overruns:0 frame:0
TX packets:48820453 errors:0 dropped:0 overruns:1 carrier:0
collisions:0 txqueuelen:100
RX bytes:1166431589 (1112.3 Mb) TX bytes:2056789305 (1961.5 Mb)
Interrupt:5 Base address:0xa000
eth0:0 Link encap:Ethernet HWaddr 00:02:B3:3A:8D:63
inet addr:192.168.1.101 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:5 Base address:0xa000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:3554 errors:0 dropped:0 overruns:0 frame:0
TX packets:3554 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:212262 (207.2 Kb) TX bytes:212262 (207.2 Kb)
宛先の向け直しはiproute2が行うので
ルーティングテーブルの設定は不要です。
(default gwが192.168.1.254に設定されていればOK)
iproute2の設定
概要
192.168.1.254のルータにて、iproute2の設定を実施します。
192.168.1.101のホストから送出されたパケットは192.168.2.253に転送し、
その他のホストから送出されたパケットは192.168.2.254に転送するようにします。
iproute2の設定概念は主に、
- ルーティングテーブルを定義する
- ルーティング優先順位を設定する
の2つの手順で構成できます。
設定
下記コマンドを実行します。
# パラメータを設定
echo "1" > /proc/sys/net/ipv4/ip_forward
# デフォルトルートを2つ設定する
route add default gw 192.168.2.254
route add default gw 192.168.2.253 metric 1
# テーブルを定義する。
/sbin/ip route add 0/0 via 192.168.2.253 table 1
# ルーティング優先順位を設定する。
/sbin/ip rule add from 192.168.1.101 table 1 pref 30001
設定確認
iproute2の経路情報は、下記コマンドで確認できます。
# ip rule
0: from all lookup local
30001: from 192.168.1.101 lookup 1
32766: from all lookup main
32767: from all lookup 253
192.168.1.101のホストからのパケットは table 1 を通過
その他のホストからのパケットは table main(default gw)を通過します。
- http://210.149.88.70/
- http://61.114.8.111/
を外部からブラウザで閲覧して、両方とも見えれば成功です。