連載
» 2005年06月14日 00時00分 公開

習うより慣れろ! iptablesテンプレート集(3):iptablesによる負荷分散とDoS対策 (3/4)

[鶴長鎮一,@IT]

テンプレート12
DNATを応用した負荷分散

テンプレート12の想定環境

サーバとして
・外部からの接続パケットは基本的にすべて破棄
 ただし接続済み通信のパケットは許可
・内部からの接続パケットは基本的にすべて許可
・ループバックアドレスに関してはすべて許可
・メンテナンスホストからのping、メンテナンスホストへのpingを許可
・メンテナンスホストからのssh(TCP 22)を許可
ルータとして
・内部アドレスやプライベートアドレスが外部に漏れないようにブロック
・外部から内部ネットに入ってくるパケットを書き換え
 対象パケット:ディスティネーションポートがTCP 80
  ディスティネーションアドレスを内部ネットの複数のHTTPサーバアドレスに分散転送
・外部(eth0)からHTTPサーバへのパケットは転送を許可

 テンプレート10で、DNATを使用して外部からNAT内の特定サーバへのアクセスを許可する方法を紹介しました。ディスティネーションポートがTCP 80のパケットを、「--to-destination」で指定した内部ネットのHTTPサーバのアドレスに変換することで、内部のサーバに到達させることができました。

55 http_ip='192.168.0.2' ←単一IPアドレス
56 http_port='80'
57 iptables -t nat -A PREROUTING -p tcp -i eth0 -d $my_internet_ip --dport $http_port -j DNAT --to-destination $http_ip:$http_port
58 iptables -A FORWARD -i eth0 -o eth1 -p tcp -d $http_ip --dport $http_port -j ACCEPT

 この機能を利用して、負荷分散を行うことができます。

テンプレート12の解説

 「--to-destination」には、複数のアドレスを指定可能です。複数指定すると、セッションが張り直されるたびにラウンドロビン方式で内部サーバを切替えるため、手軽に負荷分散システムを実現できます。

 テンプレート12では、192.168.0.3〜192.168.0.4のサーバを指定しています。DNATのディスティネーション指定では、複数アドレスを指定できます。ただし、FORWARDパケットのACCEPTで使用するディスティネーションアドレスの指定「-d」オプションは、1つずつ指定する必要があるため、56、57行目のようになります。

55 iptables -t nat -A PREROUTING -p tcp -i eth0 -d $my_internet_ip --dport 80 -j DNAT --to-destination 192.168.0.3-192.168.0.4
56 iptables -A FORWARD -i eth0 -o eth1 -p tcp -d 192.168.0.3 --dport 80 -j ACCEPT
57 iptables -A FORWARD -i eth0 -o eth1 -p tcp -d 192.168.0.4 --dport 80 -j ACCEPT

 サーバの処理能力に比例した流量の制限、片側がダウンした場合の切り離しなど、本格的な負荷分散システムには対応していません。また、cookieなどのセッション情報が必要なコンテンツにも対応していません。これらの処理が必要なければ、上記の方法で手軽にサーバを増設できます。

 単純なラウンドロビンではなく、本格的なスケジューリング・アルゴリズムを使用した負荷分散システムが欲しい場合は、LVS(Linux Virtual Server)を導入する必要があります。LVSでは、ipvsadmという管理コマンドを使って負荷分散を設定できます。

Copyright © ITmedia, Inc. All Rights Reserved.

編集部からのお知らせ

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。