iptablesによる負荷分散とDoS対策:習うより慣れろ! iptablesテンプレート集(3)(3/4 ページ)
iptablesを応用すれば、簡易負荷分散システムを構築できる。さらに、DoS対策やQoSの実現方法を紹介する。(編集部)
テンプレート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.