サーバとして
・受信パケットは破棄。ただしステートフル性を確認しサーバから送信されたパケットに関連するものは許可
・送信パケットは基本的にすべて許可
・ループバックアドレスに関してはすべて許可
・メンテナンスホスト(内部)からのping、メンテナンスホストへのpingを許可
・メンテナンスホスト(内部)からのssh(TCP 22)を許可
ルータとして
・転送パケットで、内部ネット→外部ネットのものは許可。外部ネット→内部ネットへの転送パケットはステートフル性を確認できたものだけ許可
・Linuxサーバを経由して外部へ出ていくパケットのソースアドレスを変換
・内部アドレスやプライベートアドレスが外部に漏れないようにブロック
負荷分散のため
・外部ネットからHTTPサーバへの転送を許可
・外部ネットからLinuxルータに入ってくるパケットのうちディスティネーションポーがTCP 80番であるHTTPサービスのものを2台のWebサーバに分散
テンプレート9では、外部から送られてくるパケットの送信先を「--to-destination」で内部ネットのサーバのアドレスに変換することで、外部ネットから内部ネットのサーバにアクセスできるように設定しました。
テンプレート9では、転送先サーバは1台だけ指定しましたが、「--to-destination」には複数のアドレスが指定可能です。これを利用すれば負荷分散(ロードバランシング)を実現できます。
テンプレート5をベースに、負荷分散機能を追加します。
「--to-destination」に複数のIPアドレスを指定すると、ラウンドロビン方式でIPアドレスの書き換えが行われます。例えば「--to-destination サーバ1-サーバ2」と指定すると、セッションが張り直されるたび、パケットの送信先を「サーバ1」と「サーバ2」に交互に書き換えます。
負荷分散を実現するため、新たに53〜58行目を加えています。
53 http_port='80' 54 http_server1='192.168.0.3' 55 http_server2='192.168.0.4' 56 /sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp --dport $http_port -j DNAT --to-destination $http_server1-$http_server2 57 /sbin/iptables -A FORWARD -i eth0 -o eth1 -p tcp -d $http_server1 --dport $http_port -j ACCEPT 58 /sbin/iptables -A FORWARD -i eth0 -o eth1 -p tcp -d $http_server2 --dport $http_port -j ACCEPT
53行目でHTTPサービスのポート番号を、54・55行目で分散先サーバ(分散ノード)のIPアドレスを設定します。
56行目が負荷分散の要です。外部ネットからLinuxルータへのアクセスのうち、HTTPサービスのパケットを2台のサーバに転送します。テンプレート10では、192.168.0.3と192.168.0.4の2台のサーバにアクセスを分散しています。
なおDNATのディスティネーション指定(--to-destination)では、「-」を使って複数アドレスをレンジ指定できます。例えば10台指定する場合は「192.168.0.3-192.168.0.12」と指定します。
ただしFORWARDチェインのデフォルトルールで破棄(DROP)が設定されているため(24行目)、このままではeth0から入ってきたパケットを内部のサーバへ転送できません。そこで57・58行目のように、分散先サーバへの転送を許可(ACCEPT)します。
shスクリプトの用意ができたら、テンプレート9と同じようにshスクリプトを実行します。外部ネットからブラウザを使ってLinuxルータのアドレスにアクセスし、動作を確認します。別のクライアントからアクセスすると、先ほどとは別の分散ノードからレスポンスが返され、アクセスが分散していることが確認できます。
HTTPサービスを例に説明しましたが、HTTPSならポート番号を443番に、SMTPならポート番号を25番に変更するだけでほかのサービスにも応用可能です。
第1回・第2回の「filter」テーブルに続き、「nat」テーブルを使ったテンプレートを3回にわたり紹介しました。次回はもう1つのテーブル「mangle」を使ったQoSの設定例を紹介します。
Copyright © ITmedia, Inc. All Rights Reserved.